Amazon Linux ec2インスタンスで Springbootをinit.dサービスとして設定 の公式ガイドに従っています。このセットアップに入る前に、jarを手動で実行したときに ポート80でサーバーを起動できませんでした という問題が発生していました。これに対する解決策は、jarをrootとして実行することでしたが、次に進みました。
これで、プロジェクトの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:Springbootを起動してポート80(Sudoが必要)をinit.dサービスとしてリッスンするにはどうすればよいですか?
Linuxをテスト能力以上のもので扱うのはこれが初めてであることに注意してください。経験が不足しているため、ソリューションが本当に明白になると半ば期待しています。
次の事実を知っておく必要があります。
1024未満のポートは、rootによってのみ開くことができます。
Root権限でSpringBootWebアプリケーションを実行することは悪い考えです。なぜなら、アプリケーションが侵害された場合、攻撃者はroot権限を取得するからです。
1つの解決策は、httpd Apacheサーバーをリバースプロキシとして実行し、ポート80の要求をローカルホストの1024よりも高いポートにリダイレクトすることです。これには、 ProxyPass
Apacheディレクティブを使用できます。
この手法に関する記事は次のとおりです。 Spring Boot Embedded 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/
これは単なる体験プロジェクトだったので、私は本当に安全な答えを探していませんでした。
私が自分で見つけた解決策は、シンボリックリンクの所有者をルートに設定することでした。
Sudo chown root myapp