Não é possível iniciar o Springboot como serviço init.d na porta 80

2

Estou seguindo o guia oficial do Configurando o Springboot como um serviço init.d em uma instância do Amazon Linux ec2. Antes de chegar a esta configuração, eu estava correndo para o problema onde Eu não pude iniciar o servidor na porta 80 quando executei o jar manualmente. A solução para isso foi executar o jar como root e eu segui em frente.

Agora, terminei de fazer as alterações necessárias no gradle.build do meu projeto e criei o link simbólico para o jar do executável, e posso fazer

sudo service myapp start

e recebo alguma indicação de que o processo está funcionando bem. No entanto, o processo sai depois de alguns segundos. Se eu verificar os logs em /var/log/myapp.log, ele contém o mesmo erro que eu estava obtendo antes ao tentar iniciar o servidor manualmente como um não root usuário

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

Então, quando eu inicio o serviço como root, ele não tem as mesmas permissões que eu acabei de executar manualmente o jar.

Tl; dr: Como faço para iniciar o Springboot para ouvir a porta 80 (requer o sudo) como um serviço init.d?

Note que esta é minha primeira vez lidando com o Linux em algo mais do que uma capacidade de teste, então eu meio que espero que a solução seja realmente óbvia devido à minha falta de experiência.

    
por Edward Sost 13.04.2018 / 15:41

2 respostas

1

Você precisa conhecer os seguintes fatos:

  • As portas abaixo de 1024 podem ser abertas apenas pelo usuário root.

  • A execução de um aplicativo da Web Spring Boot com privilégios de root é uma má ideia. Porque, se o aplicativo for comprometido, o atacante ganhará privilégios de root.

Uma solução é executar um servidor httpd Apache como um proxy reverso e redirecionar a solicitação na porta 80 para uma porta maior que 1024 no host local. Para isso, você pode usar a ProxyPass diretiva do Apache.

Aqui está um artigo sobre essa técnica: Usando o Apache como um proxy reverso para o Tomcat incorporado no Spring Boot

A configuração principal do Apache é assim:

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/
    
por 14.04.2018 / 14:03
0

Eu não estava realmente procurando por uma resposta segura, pois isso era apenas um projeto de experiência.

A solução que encontrei para mim foi definir o proprietário do link simbólico para root.

sudo chown root myapp
    
por 16.04.2018 / 18:07