티스토리 뷰

문제 : 스프링 부트 ec2에서 https 443포트로 배포시 에러 발생

프로젝트 진행 중 기존 ec2를 통해 애플리케이션을 배포할 때는 전혀 문제없이 배포가 되고 있었다.

 

이후 도메인을 얻고 ssl 인증서를 추가해서 https로 변경 후 443포트를 이용하도록 변경하고나서 다시 ec2로 배포를 하자 수많은 에러를 내뿜으면서 배포에 실패하였다.

 

에러

org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:181) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356) ~[spring-context-5.3.9.jar!/:5.3.9]
	at java.base/java.lang.Iterable.forEach(Iterable.java:75) ~[na:na]
	at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586) ~[spring-context-5.3.9.jar!/:5.3.9]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1332) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at teamc.opgg.swoomi.SwoomiApplication.main(SwoomiApplication.java:13) ~[classes!/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na]
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[swoomi-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) ~[swoomi-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[swoomi-0.0.1-SNAPSHOT.jar:na]
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) ~[swoomi-0.0.1-SNAPSHOT.jar:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat server
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:229) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.9.jar!/:5.3.9]
	... 22 common frames omitted
Caused by: java.lang.IllegalArgumentException: standardService.connector.startFailed
	at org.apache.catalina.core.StandardService.addConnector(StandardService.java:243) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.addPreviouslyRemovedConnectors(TomcatWebServer.java:282) ~[spring-boot-2.5.3.jar!/:2.5.3]
	at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.start(TomcatWebServer.java:213) ~[spring-boot-2.5.3.jar!/:2.5.3]
	... 24 common frames omitted
Caused by: org.apache.catalina.LifecycleException: Protocol handler start failed
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1075) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.catalina.core.StandardService.addConnector(StandardService.java:239) ~[tomcat-embed-core-9.0.50.jar!/:na]
	... 26 common frames omitted
Caused by: java.net.SocketException: Permission denied
	at java.base/sun.nio.ch.Net.bind0(Native Method) ~[na:na]
	at java.base/sun.nio.ch.Net.bind(Net.java:455) ~[na:na]
	at java.base/sun.nio.ch.Net.bind(Net.java:447) ~[na:na]
	at java.base/sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:227) ~[na:na]
	at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:272) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:227) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1208) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1294) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:614) ~[tomcat-embed-core-9.0.50.jar!/:na]
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1072) ~[tomcat-embed-core-9.0.50.jar!/:na]
	... 28 common frames omitted

 

가장 밑 에러 내용을 보면 SocketExcpetion : Permission denied라고 되어있다. 이에 대해 알아봤다.

 

문제 접근

첫번째

  • AWS의 인바운드 규칙에 443포트를 제대로 추가하지 않았는지 확인했다. 

하지만 aws의 인스턴스에 들어가는 인바운드 규칙으로 잘 추가가 되어있었다.

 

두번째

  • 이미 열려있는 포트를 열려고 해서 충돌이 난것이지 확인했다.
  • [netstat -nlpt] 명령어를 통해 연결 가능한 tcp포트를 모두 확인해 보았다.
$ netstat -nlpt
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:33060         0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

하지만 여기에도 443포트는 열려있지 않았다.

 

세번째

  • RFC 규약에 의하여 1024미만의 포트는 root만이 띄울수 있다는 것을 알게 되었다.
  • 1024 미만의 포트는 보안으로 인해 닫혀있다는 것을 확인하고 해결법을 찾아봤다.

해결방법

  • 일반 계정
    • 일반 계정에서는 우선 1024 이상의 포트로 열고 iptable의 기능을 사용해서 해당 포트로 들어오는 모든 요청을 443포트로 리다이렉션 하는 방법이 있다.
    • $ sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8080
    • 위 명령을 통해 8080포트로 향하는 모든 요청을 443포트로 리다이렉트 시킬 수 있다.
  • 루트 계정
    • 훨씬 간단한 방법으로 java -jar 파일을 실행시킬 때 sudo 를 추가해서 root 계정으로 실행시키면 된다.
    • nohup sudo java -jar \
          -Dspring.config.location=classpath:/application.yml,classpath:/application-real.yml,$REPOSITORY/application-real_private.yml \
          -Dspring.profiles.active=real,real_private \
          $APP_REPO/$JAR_NAME &
반응형

'Web > 정리글' 카테고리의 다른 글

WAS와 웹서버 차이 정리  (0) 2021.09.10
스프링 AOP 정리  (2) 2021.09.08
JPA - 영속성 컨텍스트 정리  (0) 2021.09.06
HTTP vs. WebSocket 정리  (2) 2021.08.26
Json Web Token 정리  (0) 2021.08.16
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday