서버에 nginx 설치 및 작동확인

문제 상황

어떤 웹 사이트가 있고 해당 서버의 포트가 8080이라고 가정해보자. 우리는 웹사이트에 접속할 때 도메인주소:8080로 입력하지 않는다. 예를 들자면 우리는 naver.com 이라고 입력하지 naver.com:8080이라고 입력하지 않는다. 그런데 문제는 HTTP 통신의 기본포트는 80이다. 즉 naver.com 이라고 입력하면 naver.com:80으로 요청을 보내는 것이다. 서버는 8080번 포트로 온 요청에 대해서만 받을 수 있으므로 결국 정상적인 통신을 하지 못하게 된다. 이 문제를 어떻게 해결할 수 있을까?

Nginx의 Reverse Proxy

이럴 때 사용할 수 있는게 Nginx이다. Nginx에 대해 찾아보면 Nginx를 사용하는 여러가지 용도에 대해 찾아볼 수 있다. 예를 들어 로드밸런서, 트래픽 제한 등이 있다. 이처럼 Nginx는 실제 서비스 로직을 처리하는 WAS 앞 단에 위치해 다양한 역할을 수행한다. 그 기반이 되는 기술이 Reverse Proxy이다.

 

Reverse Proxy란 말의 뜻을 살펴보면 Proxy는 대리자를 뜻한다. 즉 HTTP 통신을 WAS가 직접 담당하는게 아니라 Nginx가 대신 통신을 받아 WAS에 전달하고 다시 WAS에서 받은 응답을 클라이언트로 전송하는 대리자 역할을 하는 것이다.

 

그렇다면 Reverse는 무엇일까. Reverse하면 쉽게 떠올릴 수 있는 개념이 뒤집다, 역전 일 것이다. 이 의미로 Reverse Proxy를 해석하면 뒤집힌 대리자? 뭔가 의미가 안 맞는 것 같다. 그런데 reverse의 의미 중에는 뒤쪽, 후방이라는 의미도 있다. 즉 Reverse Proxy는 후방에 위치한 대리자라는 의미이다. 후방이 있다면 전방도 있을 것이다. 그렇다 Reverse Proxy의 반대 개념으로 Forward Proxy가 있다. 그렇다면 둘의 차이는 무엇일까?

Forward Proxy

 

Forward Proxy는 프록시 서버가 클라이언트와 같은 내부망에 존재하는 것을 말한다. 클라이언트는 Proxy 서버에 접속하려는 서버 주소를 전달하고 Proxy서버가 이를 받아 실제 서버에 요청을 하는 것이다. 그렇다면 Forward Proxy는 주로 어떤 역할을 할까?

  • 특정 서버(웹 사이트)에 대한 접속 제한
  • 서버에서 받아온 리소스에 대한 캐싱으로 동일한 요청일 때 더 빠른 처리
  • 요청에 대한 암호화로 서버에서는 클라이언트의 정보(ex. IP주소) 등을 알기 어렵다

Reverse Proxy

 

반대로 Reverse Proxy는 서버 앞단(Forward Proxy와 비교하면 후방)에 위치한다. 통신을 대리하는 것은 Forward Proxy와 똑같지만 서버 앞단에 존재함으로써 Forward Proxy와는 다른 역할을 수행한다.

  • 특정 클라이언트(IP)에 대한 접속 제한
  • 클라이언트의 접속을 대리함으로써 클라이언트는 실제 서버에 직접 접근할 수 없다(서버 보안)
  • 요청을 분산 처리하는 로드밸런서
  • 트래픽 제한

이외에도 많은 기능들이 있지만 주로 사용되는 것들을 정리해봤다. 이제 Reverse Proxy에 대해 대략적으로 알게 됐다. 그럼 실제 설치를 해보면서 문제상황에 적었던 것처럼 80번 포트로 온 요청을 8080포트로 열려있는 서버로 전달하는 것까지 확인해보겠다. 보통은 Nginx 서버를 WAS와 다른 네트워크 상에 두지만, 글에서는 같은 Nginx와 WAS를 같은 서버에 설치할 것이다.

Nginx 설치

개발환경

서버: centos 7.8

 

1. yum을 통해 설치할 것이므로 yum에 대한 util 패키지들을 설치한다.

sudo yum install yum-utils

2. /etc/yum.repos.d 경로에 nginx.repo 파일을 생성하고 아래 내용을 입력한 후 저장한다. nginx repo에 대한 설정정보를 담은 파일이다.

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

3. 아래 명령어를 사용해 nginx의 여러 패키지 중 안정적인 것을 설치하도록 설정한다.

sudo yum-config-manager --enable nginx-mainline

4. nginx를 설치한다.

sudo yum install nginx

5. systemctl status nginx 명령어를 입력해 nginx가 잘 설치됐는지 확인한다. 아직 nginx를 구동시키지 않았으므로 Active 값이 inactive일 것이다.

6. /etc/nginx/conf.d 로 이동하고 파일을 확인해보면 default.conf 파일이 존재할 것이다. vi 편집기를 이용한다.

cd /etc/nginx/conf.d # /etc/nginx/conf.d 로 이동
ls # 파일 확인
sudo vi default.conf # vi 편집기를 이용해 파일 편집

 

7. 파일을 열어보면 대부분 주석처리 되어있는 설정 값들에 대한 예시가 나올 것이다. 다른 것들은 무시하고 아래 코드들만 확인해보자. 참고로 server {...} 여러개 지정할 수 있다.

server {
    listen       80;
    server_name  <도메인 주소1> <도메인 주소2>;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_pass   http://localhost:8080;
    }
    
    ...
}

 

  • listen
    • nginx 서버가 요청을 대기하고 있는 포트번호이다. http 통신을 이용한다면 80번 포트, https 통신을 이용한다면 443번 포트로 지정한다.
  • server_name
    • server_name 값과 요청헤더의 Host 값이 일치한다면 해당 server_name이 있는 server {...} 에서 요청을 처리하게 된다. 
    • server_name을 여러 개 지정하면 여러 요청에 대해 처리할 수 있다. 예를들어 위 코드에서 server_name   naver.com   www.naver.com 로 지정한다고 가정하면 클라이언트가 http://naver.com 또는 http://www.naver.com 으로 했을 때 모두 동일한 처리를 할 수 있게 된다.
  • location <패턴>
    • URI 패턴과 일치하는 요청이 들어왔을 때 어떻게 할 것인지 지정하는 곳이다. 예를 들어 location / 는 모든 요청에 대해 처리하겠다는 의미이다. 패턴은 이외에도 많으므로 필요 시 찾아보자
  • proxy_pass   http://localhost:8080
    • location <패턴>에 일치하는 요청에 대해 http://localhost:8080로 전달하겠다는 의미이다.

위 설명을 참고하여 적절한 값을 지정한다.

 

8. nginx에 변경된 설정파일 내용을 반영한다.

nginx -s reload # nginx의 master process에게 설정파일 반영을 요청

혹은

service nginx restart # nginx 서버 자체를 재구동

 

9. 검색 창에 접속하고자 하는 도메인만 쳐보고 정상적으로 통신이 되는지 확인한다.

GET 방식으로 /user로 요청했을 때 디비 정보를 읽어오도록 했다.

 

8080을 붙이지 않더라도 WAS까지 요청이 도달하여 서비스로직이 수행된 후 응답까지 정상적으로 반환 되는 것을 확인할 수 있다.

참고자료

https://aday7.tistory.com/entry/%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9CReverse-Proxy-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-%EA%B0%9C%EB%85%90%EB%B6%80%ED%84%B0-%ED%95%84%EC%9A%94%EC%84%B1-%EC%98%A4%ED%94%88-%EC%86%8C%EC%8A%A4-%EC%86%94%EB%A3%A8%EC%85%98%EA%B9%8C%EC%A7%80

 

리버스 프록시(Reverse Proxy) 쉽게 이해하기: 개념부터 필요성, 오픈 소스 솔루션까지

웹 서버와 관련된 중요한 개념 중 하나인 리버스 프록시(Reverse Proxy)에 대해 알아보려 합니다. 리버스 프록시는 웹 서비스의 성능 향상, 보안 강화 및 유연한 확장성 제공 등 다양한 이점을 제공

aday7.tistory.com

https://inpa.tistory.com/entry/NETWORK-%F0%9F%93%A1-Reverse-Proxy-Forward-Proxy-%EC%A0%95%EC%9D%98-%EC%B0%A8%EC%9D%B4-%EC%A0%95%EB%A6%AC

 

🌐 Reverse Proxy / Forward Proxy 정의 & 차이 정리

프록시(Proxy) 란? 프록시 서버는 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킨다. 프록시(Proxy)란 '대리'

inpa.tistory.com

https://burndogfather.com/190

 

Nginx proxy & Linux 최적화 셋팅

vi /etc/sysctl.conf net.core.somaxconn = 65536 net.ipv4.tcp_max_tw_buckets = 1440000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_max_syn_backlog = 3240000 vi /etc/security/limits.conf

burndogfather.com

https://architectophile.tistory.com/12

 

[Nginx] 기본 설정 방법

[Nginx] 기본 설정 방법 Nginx는 가벼운 고성능의 웹서버로서 높은 트래픽 처리를 위해 디자인되었다. Nginx의 가장 강력한 기능 중 하나는 HTML이나 미디어 파일 같은 정적 컨텐츠를 효율적으로 서브

architectophile.tistory.com

https://nginx.org/en/docs

 

nginx documentation

 

nginx.org

 

'Devops' 카테고리의 다른 글

Jenkins와 github 연동(github token 이용)  (0) 2024.01.07