私は公式ガイドに従ってきました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より高いポートにリダイレクトすることです。これには、次のものを使用できます。ProxyPass
Apacheコマンド。
以下は技術に関する記事です。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