teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

1回答

1020閲覧

SpringBoot :8080を消したい

watari33

総合スコア1

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2024/01/30 22:47

0

0

実現したいこと

SpringBootで作成したjarファイルをさくらのVPS上で実行し、
http://○○.com:8080
で表示させることに成功しました。この:8080を消して
http://○○.com
だけでアクセスできるようにしたいです。

OSはUbuntu22.04、ファイアウォール等はiptables/ufwを使用しています。

発生している問題・分からないこと

server.port=80に変更して実行すると、ローカル上ではhttp://localhost だけで表示が可能になるのですが、VPS上では

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2024-01-31T06:23:40.358+09:00 ERROR 103461 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop' (中略) java.net.BindException: Permission denied at java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na] at java.base/sun.nio.ch.Net.bind(Net.java:555) ~[na:na] at java.base/sun.nio.ch.ServerSocketChannelImpl.netBind(ServerSocketChannelImpl.java:337) ~[na:na] at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:294) ~[na:na] at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:247) ~[tomcat-embed-core-10.1.17.jar!/:na] at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:202) ~[tomcat-embed-core-10.1.17.jar!/:na] at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1280) ~[tomcat-embed-core-10.1.17.jar!/:na] at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1366) ~[tomcat-embed-core-10.1.17.jar!/:na] at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:635) ~[tomcat-embed-core-10.1.17.jar!/:na] at org.apache.catalina.connector.Connector.startInternal(Connector.java:1043) ~[tomcat-embed-core-10.1.17.jar!/:na] ... 26 common frames omitted

となり、そもそも起動ができません。

ほかに80ポートを使用しているアクティブなプログラムはないと思われます。

$ sudo lsof -i :80 #何も表示されない $ ss -antu Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 70 127.0.0.1:33060 0.0.0.0:* tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:* tcp LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:* tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* tcp ESTAB 0 52 160.16.91.217:22 60.67.220.81:56440 tcp LISTEN 0 128 [::]:22 [::]:*

該当のソースコード

application.properties

1server.port=80

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

共通

sudo ufw default DENY
sudo ufw allow from any to any port 22 proto tcp
sudo ufw allow from any to any port 80 proto tcp
sudo ufw allow from any to any port 8080 proto tcp
sudo ufw limit 22
sudo ufw enable
sudo reboot

ポートフォワード

ポートフォワードのアプローチです。

application.propertiesはserver.port=8080に設定し、
/etc/ufw/sysctl.confに

net.ipv4.ip_forward=1

と記載(アンコメント)、

sudo sysctl -p sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo sh -c "iptables-save > /etc/iptables.rules" sudo vim /etc/network/if-pre-up.d/iptables (iptablesの中身) #!/bin/sh iptables-restore < /etc/iptables.rules (:wq) sudo chmod +x /etc/network/if-pre-up.d/iptables sudo reboot

や、/etc/ufw/before.rules、/etc/ufw/before6.rulesに

*nat :PREROUTING ACCEPT [0:0] -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 -A PREROUTING -p udp --dport 80 -j REDIRECT --to-port 8080

など追記したりしました。

結果としては、
http://○○.com:8080
に普通に接続できただけで、
http://○○.com
だけでは接続できませんでした。

ほかには、sudo java で実行すれば80ポートを使えるかと思ったのですが、javaをsudoで実行するための設定がうまくいかずできなかったり、そもそも80ポートを予約ポートから外すことができればよいと思ったのですが、調べても全く情報が出ず、書き換えることができませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2024/01/31 00:12

SpringBootで作成したサイトをさくらVPSに載せてURLから8080を省略したい https://teratail.com/questions/313454 とかでしょうか?
kikukiku

2024/01/31 00:12

勝手な想像ですが、 Ubuntuの外にファイヤーウォールはありませんか? もしあれば、その設定を見てみてはどうでしょう。 VPSのコントロールパネルから見れるかな?
watari33

2024/01/31 00:36

コメントありがとうございます! @jimbe さん この方はSpringBootのapplication.propertiesでserver.port=80にしたらちゃんと動いたようですね...自分の環境と違うのはOSだけのようなので、Ubuntuの何かが邪魔しているんですかね? 参考になります。もう少しいろいろ試して、ダメだったらOSの切り替えを検討します! @kikukiku さん おっしゃる通りさくらのVPSにはパケットフィルター設定というものがありますが、今回はすべてOFFにしており、 「全てのポートが開いている状態です。 お客様ご自身で、サーバーにファイアウォール等のセキュリティ設定を行ってください。」 と表示があるのでおそらく大丈夫かと思います!
melian

2024/01/31 02:23

> java.net.BindException: Permission denied bind で permission denied と出ていますので、特権ポート(privileged port)にアクセスできないのだと思います。SpringBoot に関する知見はないので詳細は分からないのですが、SpringBoot のサーバプロセスが一般ユーザ権限で動作しているのではないでしょうか。(effective user id の問題) SpringBoot にも Apache サーバの様な権限分離のメカニズムがあるとは思うのですが。。。もしくは Linux Kernel Capability で SpringBoot サーバに特権ポートへのアクセス権限を付与するなどの対応が考えられます。
ujimushi_sradjp

2024/01/31 11:35 編集

個人の感想で申し訳ないのですが,昔tomcatでplantumlサーバーを立ち上げていた時に ubuntuではAppArmor(?)の制限がきつ過ぎて私の実力では永続的な80番ポートへの移行はできませんでした。 nginx等を立ち上げて,80→8080番ポートへのリバースプロキシを立ち上げるのが 手数としては少なくて済みますし,ネットに参考となる情報も多いのではないでしょうか? 私だったらファイアーウォールの設定が苦手なので,今の状況を元に戻せず途方に暮れていると思いますが, 頑張って下さい。健闘をお祈りしています。
watari33

2024/01/31 23:51

皆様ありがとうございます!お騒がせしました... @melian さん >SpringBoot のサーバプロセスが一般ユーザ権限で動作しているのではないでしょうか。 まさにこれでした...いままでsudo javaが効かず諦めていたのですが、それは一般ユーザーでsdkmanを用いたjavaを使用していたのが原因で、root権限でsdkmanを入れるかsudo yum でインストールしたjavaを用いてsudo java -jarを実行することができました! ベストアンサーに選びたいので、回答を転記していただけますと幸いです! @kikukiku さん まとめると、「さくらのVPSでUbuntuを借りるとufwとiptablesと外部のパケットフィルター設定が入っている」ということになりますね... 今回はufwだけ使うことで解決できそうです、ありがとうございます!! @ujimushi_sradjp さん Ubuntu初めて使ったんですが、自分も割とかっちりしている印象を受けました! 恥ずかしながらnginxやApacheを自分でインストールして使ったことがないので、これから勉強したいと思います...!ありがとうございます!!
melian

2024/02/01 00:03

> watari33 さん ありがとうございます、回答に転記しました。
guest

回答1

0

ベストアンサー

エラーメッセージに bind で permission denied と表示されていますので、特権ポート(privileged port)にアクセスできないのだと思います。

java

1java.net.BindException: Permission denied

おそらく、SpringBoot のサーバプロセスが一般ユーザ権限で動作しているのではないでしょうか。(effective user id の問題) その点を確認してみるとよいかと思います。

投稿2024/02/01 00:02

melian

総合スコア21234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問