통합검색

Linux

centos7에서 reverse proxy 서버 구축을 위한 nginx 설치 및 설정



하나의 아이피로 연결된 같은 네트워크내 다수의 서버를
nginx reverse proxy 서버를 통해 프록싱 해본다.

 
[!]reverse proxy가 필요한 상황[/!]
나의 경우 아래 두가지 이유 때문에 리버스프록시 서버가 필요한 상황이었다.

1) 다수의 서버가 연결되어있는 게이트웨이에 단 하나의 외부 아이피만 존재하는 상황.
외부 트래픽이 유입하면 reverse proxy 서버를 통해 사설아이피로 트래픽을 유도하여 특정 서버로 유입되도록 한다.

2) 내가 운영중인 메인서버의 공인IP가 외부로 유출되면 DDOS 공격에 취약해지기 때문에 공인 IP를 은폐할 목적.
AWS에 프록시 서버를 하나 더 두고 내 서버를 프록싱 하면 웹사이트의 외부 IP는 AWS의 IP로 노출된다.



[!]프록시 서버로 nginx를 선택한 이유[/!]
nginx는 apache의 대량 트래픽 처리시 발생하는 부하 문제를 보완하기 위해 탄생한 웹서버다.
즉, 다수 서버에 유입될 트래픽이 모두 거쳐가게 되는 프록시 서버에는 nginx만큼 효율이 좋은 웹서버는 없었기 때문이다.

심지어 apache보다 가볍고, 설정 또한 직관적이고 쉽다.
최소 사양으로 구동되는 프록시 서버에 nginx보다 적합한 웹서버는 없다는 생각이다.



[!]nginx 설치[/!]
먼저, nginx를 설치한다.
내가 사용중인 centos7 OS는 공식 yum서버에서 nginx를 제공하지 않기 때문에
별도의 repo를 yum에 외부 저장소를 등록해주고 nginx를 설치한다.
 
# vi /etc/yum.repos.d/nginx.repo
 
yum.repos.d 디렉토리 내에 repo 파일을 하나 만들어 주고,
아래와 같이 vi로 작성하여 저장한다.
 
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
 
외부 저장소 등록이 완료 되었다면 yum 을 통해 nginx를 설치한다.
 
# yum install nginx



[!]클라이언트 최대 전송량 설정[/!]
클라이언트가 nginx 프록시 서버에서 목적지 서버로 요청할 때 body의 최대 전송량을 설정해준다.
nginx의 기본 client_max_body_size는 1M로, 허용량을 초과하게 되면 요청 자체가 되지 않기 때문에 반드시 늘려줘야 한다.

client_max_body_size를 모든 호스트에 대해 적용해 주려면
 
# vi /etc/nginx/nginx.conf
 
를 vi로 열어
 
http {
    ...
    client_max_body_size 40000M;
    ...
}
 
를 추가해 주거나,
호스팅 개별적으로 적용해 주려면
 
# vi /etc/nginx/conf.d/[hostname].conf
 
를 vi로 열어
 
server {
    ...
    client_max_body_size 40000M;
    ...
}
 
를 추가해준다.




[!]reverse proxy 구성을 위한 설정[/!]
reverse proxy 구성을 위해 설정파일을 생성해야 한다.
 
#cd /etc/nginx/conf.d
 
nginx 설정 파일은 /etc/nginx/conf.d/ 경로내에 저장한다.
파일명은 아무렇게나 설정해도 되지만, 반드시 확장자는 .conf 로 저장해야 한다.

chanyeongpark.com 도메인에 대한 virtual host 및 reverse proxy 설정을 위해 아래와 같이 새로운 설정 파일을 생성한다.
나는 식별이 용이하도록 도메인 이름으로 설정 파일을 생성했다.
 
# vi /etc/nginx/conf.d/note.chanyeongpark.com.conf
 
vi 로 설정파일에 아래와 같이 내용을 작성했다.
 
server {
        listen 80;         #80번 포트로 들어오는 경우에만 실행
        server_name note.chanyeongpark.com;          #접속 주소가 note.chanyeongpark.com 인 경우에만 실행
        # root /home/note.chanyeongpark.com/public_html;          #virtual host 경로 설정
        # index index.html          #index 파일명 설정
        return 301 https://note.chanyeongpark.com;         #80번포트로 접속한 경우 https://로 리다이렉팅
}

server {
        listen 443 ssl;         #443포트로 접속한 경우에만 실행
        server_name note.chanyeongpark.com;          #접속 주소가 note.chanyeongpark.com 인 경우에만 실행
        root /home/note.chanyeongpark.com/public_html;          #virtual host 경로 설정

        error_log /home/note.chanyeongpark.com/error_log;          #error log 파일 위치
        access_log /home/note.chanyeongpark.com/access_log;          #access log 파일 위치

        ssl_certificate /etc/letsencrypt/live/note.chanyeongpark.com/fullchain.pem;          #ssl 적용을 위한 pem 위치
        ssl_certificate_key /etc/letsencrypt/live/note.chanyeongpark.com/privkey.pem;          #ssl 적용을 위한 privatekey 위치

        location / {
                proxy_pass http://111.222.333.444/;          #111.222.333.444를 목적지로 포워딩 한다.
                proxy_http_version 1.1;          #proxy http 버전을 1.1로 설정(nginx 공식 문서에서 1.1로 권장함, 기본값은 1.0)
                proxy_set_header Host $http_host;          #http host 정보를 header로 전달한다.
                proxy_set_header X-Real-IP $remote_addr;          #요청 클라이언트의 IP를 header로 전달한다.
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
        }
}

http로 접근한 경우 ssl이 적용된 도메인으로 리다이렉트 되어야 하기 때문에
virtual host 경로를 지정하여 인증서를 발급(재발급) 받을 수 있도록 하였으며,
http 접속시 https로 301 리다이렉트 되도록 구성 하였다.
443포트로 접속시에는 요청 클라이언트의 정보를 header로 실어 목적지 서버로 전달할 수 있도록 설정하였다.

# root /home/note.chanyeongpark.com/public_html;
# index index.html


위 구문은 let's encrypt에서 인증서 발급시 http로 접속하는 경우 홈디렉토리로 연결 되어야 하기네 필요한 구문으로,
ssl 연결 이후 연장할 때는 불필요하므로 주석처리 해뒀다.
 
proxy_http_version 기본값 1.0으로 사용시 시놀로지 DSM을 reverse proxy 하는 경우 모바일에서 js, css 등 리소스를 로드하지 못하는
현상이 발견 되었다.