Spring Boot 게시판 만들기 20 - 프록시 서버 이용하기

20. 프록시 서버 이용하기

현재는 client 가 Web Application에 접근하기 위해서는 8080포트를 사용해야 한다. client가 쉽게 접근 할 수 있도록 80번 포트로 어플리케이션을 띄어야 하는데 ubuntu에서는 일반 사용자가 80번 포트를 사용할 수 있는 권한이 없다. 만약 80번 포트로 프로그램을 실행하게 되면 아래와 같은 권한 오류가 뜨게 된다. 그렇다고 어플리케이션을 띄울 때 마다 매번 sudo권한으로 실행시킬 수도 없는 노릇이다.

맥에서는 80번 포트로 잘 열리는데 우분투에서 오류가 떠서 당황 했다. 우분투에서 1024미만 포트는 일반 사용자가 사용할 수 없는 포트이다.

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 java.base/sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:80) ~[na:na]
at org.apache.tomcat.util.net.NioEndpoint.initServerSocket(NioEndpoint.java:228) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:211) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1159) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.tomcat.util.net.AbstractEndpoint.start(AbstractEndpoint.java:1245) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.coyote.AbstractProtocol.start(AbstractProtocol.java:603) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
at org.apache.catalina.connector.Connector.startInternal(Connector.java:1064) ~[tomcat-embed-core-9.0.41.jar!/:9.0.41]
... 29 common frames omitted

nginx를 이용해 프록시 서버 만들어주기

80번 포트를 사용하기 위해 Proxy 서버를 띄어 놓고 Proxy 서버로 요청이 들어오면 Spring Boot 프로그램으로 Forwarding 해주도록 설정을 할 것이다.

sudo 명령어를 사용해 프로그램을 시키는 방법도 있지만, 매번하기에는 번거롭다는 단점도 있고 /etc/sudoers에 패스워드 권한을 풀어줄 수도 있지만 보안상의 문제가 있어서 가장 안전한 방법으로 Proxy 서버를 이용하기로 했다.

nginx 설치하기

sudo apt-get install nginx

nginx 실행

sudo service nginx start

프로그램을 실행행한 후 80번 포트로 접속하게 되면 환영한다는 nginx 페이지가 보인다.

nginx 설정 확인하기

nignx의 기본적인 설정은 nginx.conf파일에 저장돼 있다. 마지막 부분을 보면 conf.d폴더에 nginx에 추가적인 설정 정보를 불러오게 하는 설정이 있다. 여기에 80번 요청이 들어오면 8080포트로 포워딩 할 수 있게 설정 파일을 만들어 주도록한다.

설정 파일을 살펴보면 conf.d 디렉터리와 sites-enabled(sites-available) 디렉터리 내의 구성을 읽어오는 부분이 있다.
sites-enabled에는 nginx에 대한 기본 설정값이 있다. 둘 중 아무곳에나 설정 값을 넣어도 되지만, 설정과 관련된 부분이라 conf.d 디렉터리에 저장하도록 했다.

/etc/nginx/nginx.conf

http {
...
include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*; 덮어쓰기를 방지하기 위한 주석 처리
}

/etc/nginx/conf.d 폴더로 이동해 포트 포워딩 설정을 위한 server.conf파일을 생성한다.
nginx listen 포트로는 80번 포트를 사용하고 해당 url로 들어오는 모든 요청을 8080포트로 보내주는 설정을 추가한다.

proxy_set_header X-Real-Ip $remote_addr : X-Real-Ip 헤더 값으로 Client의 IP값을 넣어준다.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for : X-Forwarded-For 헤더 값으로 포워딩 된 프록시 서버의 IP값을 넣어준다.
proxy_set_header Host $http_host : Host 헤더에는 서버의 주소 or 도메인을 넣어준다. (도메인 정보를 매핑하고 싶을 때도 사용)

/etc/nginx/conf.d/server.conf

server {
listen 80;
server_name localhost;

location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
}

80번 포트로 접근 했을 때 8080포트에 떠있는 Web Application이 나타나는 것을 확인할 수 있다.

Share