ポート80でinit.dサービスでSpringbootを起動できない

ポート80でinit.dサービスでSpringbootを起動できない

私は公式ガイドに従ってきましたSpringbootをinit.dサービスとして設定するAmazon Linux ec2 インスタンスで。これを設定する前に、次の問題が発生しました。ポート80でサーバーを起動できません瓶を手動で実行するとき。解決策はrootとしてjarを実行することで、続行しました。

これで、プロジェクトのgradle.buildに必要な変更を完了し、実行可能なjarへのシンボリックリンクを作成したので、次のことができます。

sudo service myapp start

プロセスが正常に機能しているという兆候が表示されます。ただし、プロセスは数秒後に終了します。 /var/log/myapp.log でログインを確認すると、以下が含まれます。同じエラー以前に root 以外のユーザーとしてサーバーを手動で起動しようとしたときに、この問題が発生しました。

2018-04-13 13:01:31.793  INFO 23583 --- [           main] 
o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2018-04-13 13:01:31.816  INFO 23583 --- [           main] 
ConditionEvaluationReportLoggingListener :

Error starting ApplicationContext. To display the conditions report re-run 
your application with 'debug' enabled.
2018-04-13 13:01:31.817 ERROR 23583 --- [           main] 
o.s.b.d.LoggingFailureAnalysisReporter   :

***************************
APPLICATION FAILED TO START
***************************

Description:

The Tomcat connector configured to listen on port 80 failed to start. The 
port may already be in use or the connector may be misconfigured.

Action:

Verify the connector's configuration, identify and stop any process that's 
listening on port 80, or configure this application to listen on another 
port.

2018-04-13 13:01:31.818  INFO 23583 --- [           main] 
ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@4c3e4790: startup date [Fri Apr 13 13:01:26 UTC 2018]; root of context hierarchy
2018-04-13 13:01:31.820  INFO 23583 --- [           main] 
o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown

したがって、rootとしてサービスを開始すると、jarを手動で実行するのと同じ権限がありません。

Tl;dr:ポート80(sudoが必要)でリッスンするinit.dサービスでSpringbootを起動するには?

テスト能力を超えてLinuxを扱うのは今回が初めてなので、経験が不足しているため、解決策はかなり明らかになると予想しました。

答え1

次の事実を理解する必要があります。

  • 1024未満のポートはrootユーザーのみを開くことができます。

  • root権限でSpring Boot Webアプリケーションを実行するのは悪い考えです。なぜなら、アプリケーションが破損すると攻撃者がroot権限を取得するからです。

1つの解決策は、httpd Apacheサーバーをリバースプロキシとして実行し、ポート80の要求をローカルホストの1024より高いポートにリダイレクトすることです。これには、次のものを使用できます。ProxyPassApacheコマンド。

以下は技術に関する記事です。Spring Boot組み込みTomcatのリバースプロキシとしてApacheを使用する

Apacheの主な構成は次のとおりです。

ProxyPreserveHost on
RequestHeader set X-Forwarded-Proto https
RequestHeader set X-Forwarded-Port 443
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

答え2

これは単なる経験プロジェクトなので、安全な答えを探しているわけではありません。

私が見つけた解決策は、シンボリックリンクの所有者をrootに設定することでした。

sudo chown root myapp

関連情報