목차

nginx 리버스 프록시 설정

nginx를 앞에 세우고 들어오는 주소에 따라 원하는 서버로 연결해주는 역할

nginx 리버스 프록시

server {
    listen 80;
    listen [::]:80;

    server_name domain.com;

    location / {
        proxy_pass http://10.10.10.10:88; #리다이렉션할 서버:포트
        proxy_set_header Host $host;
    }
}
  • 기본값은 http 1.0 — 매 요청마다 connection 생성
  • http 1.1로 변경하면 connection을 유지하여 부하를 감소
server {
    listen 80;
    listen [::]:80;

    server_name domain.com;

    #http protocol version
    proxy_http_version 1.1;
    proxy_set_header Connection "";

    location / {
        proxy_pass http://10.10.10.10:88; #리다이렉션할 서버:포트
        proxy_set_header Host $host;
    }
}

리버스 프록시로 접속 시 User 정보가 전달되지 않고 Nginx 주소가 Webserver에 전달됨

server {
    listen 80;
    listen [::]:80;

    server_name domain.com;

    proxy_http_version 1.1;
    proxy_set_header Connection "";

    location / {
        proxy_pass http://10.10.10.10:88; #리다이렉션할 서버:포트
        proxy_set_header Host $host;

        #User IP 전달
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
    }
}

WAS(Tomcat, JBoss 등)는 동적 영역에 사용하고, 정적 영역(css, image, javascript 등)은 Nginx가 처리하여 WAS 부담을 감소

server {
    listen 80;
    listen [::]:80;

    server_name domain.com;

    proxy_http_version 1.1;
    proxy_set_header Connection "";

    location / {
        proxy_pass http://10.10.10.10:88; #리다이렉션할 서버:포트
        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
    }

    #정적 영역 처리
    location /static {
        alias /var/etc/www/static; #경로

        autoindex off; #url에 경로 입력 시 내부 내용 노출 방지
        access_log off; #접근 로그 남기지 않음
    }
}
  • 해당 역할을 하는 서버가 여러 대 있을 때 서버들에게 데이터를 분산
  • proxy_passupstream 명 작성
  • 접속 시 서버가 변경되면 로그인 세션이 달라지므로 커넥션 유지 설정 필요
  • weight를 통하여 부하량 부여 가능
  • keepalive를 사용하여 연결 회선 제한 설정 → 부하 감소
upstream wasserver { #proxy_pass http://wasserver
    #커넥션 유지 설정
    hash $remote_addr consistent;

    #부하 설정
    server 10.10.10.10:88;
    server 10.10.10.10:89 weight=5; #부하비 5(89) : 1(88)

    #서버 다운 시 사용할 서버
    server 10.10.10.10:90 backup;

    #연결 제한 설정
    keepalive 10; #최소 10개, 부하가 큰 서버면 개수 늘릴 것
}

server {
    listen 80;
    listen [::]:80;

    server_name domain.com;

    proxy_http_version 1.1;
    proxy_set_header Connection "";

    location / {
        proxy_pass http://wasserver; #로드 밸런싱할 서버
        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
    }

    #정적 영역 처리
    location /static {
        alias /var/etc/www/static;

        autoindex off;
        access_log off;
    }
}
  • certbot을 이용하여 letsencrypt에서 인증서 무료 발급
  • 발급을 위해선 개인 도메인 필요
  • 인증서를 구매하여 사용도 가능
  • 일주일에 인증서 발급은 50번만 가능하므로 --dry-run으로 테스트 후 진행
  • 무료 인증은 3개월간 유지, 만료 전 갱신 필요
upstream wasserver {
    hash $remote_addr consistent;

    server 10.10.10.10:88;
    server 10.10.10.10:89 weight=5;
    server 10.10.10.10:90 backup;

    keepalive 10;
}

server {
    listen 443 ssl; #변경 80 → 443
    listen [::]:443 ssl;

    server_name domain.com;

    proxy_http_version 1.1;
    proxy_set_header Connection "";

    #ssl 설정
    ssl_certificate /etc/letsencrypt/live/도메인/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/도메인/privkey.pem;

    location / {
        proxy_pass http://wasserver;
        proxy_set_header Host $host;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Port $server_port;
    }

    #정적 영역 처리
    location /static {
        alias /var/etc/www/static;

        autoindex off;
        access_log off;
    }
}

#80포트 리다이렉션 설정
server {
    if ($host = domain.com) {
        return 301 https://$host$request_uri;
    } # managed by Certbot

    listen 80;
    listen [::]:80;
    server_name domain.com;
}