(참고) nginx로 다양한 웹 서비스 제어하기


다음과 같이 방화벽에서 포트 포워딩을 통해 인터넷에서 서버에 접속했습니다.


이와 같은 도메인에서 웹 서비스에 액세스할 수 있었습니다.

액세스 주소 내부 주소 메모
http://www.kokonut.today:8062 서버 A: 8080
http://www.kokonut.today:8081 서버 B: 8080
http://www.kokonut.today:80 C 서버: 8080
http://www.kokonut.today:7777 D 서버: 8080
https://www.kokonut.today:443 D 서버: 443

서비스 운영의 관점에서 포트 번호를 공개하는 것은 그다지 반가운 일이 아니었습니다.

내 목표는 하위 도메인에 액세스하여 통합 포트 443 및 80을 사용하는 것이었습니다.

한편, 내가 찾은 지식은 apache 가상 호스트 또는 nginx 프록시 패스를 사용하는 것이었습니다.

nginx는 Apache의 C10K 문제를 해결하기 위해 개발된 이벤트 기반 웹 서버 소프트웨어의 이름입니다.

C10K 문제는 시스템의 동시 사용자 수가 10,000명을 초과할 때 발생하는 성능 저하와 관련이 있습니다.

즉, 아파치의 성능 문제를 해결하기 위해 개발된 기술이다.

일반 사용자의 입장에서 서비스의 성능을 보는 것으로는 부족하여 출시 당시 아파치보다 나은 개선 사항으로 적용하기로 하였다.

요약하면 방화벽 정책의 결과는 다음과 같다.


도메인 네임으로 외부에서 nginx 서버를 조회하면 어떤 서비스든 접근 가능!
우와

액세스 주소 내부 주소 메모
https://gitlab.kokonut.today 서버 A: 8080
https://richable.kokonut.today 서버 B: 8080
https://www.kokonut.today C 서버: 8080
https://jenkins.kokonut.today D 서버: 8080
https://kokonut.today D 서버: 443

너무 깔끔합니다.

원하는 하위 도메인에 접근이 가능합니다.

위의 개선 전과 후를 확인했으므로 바로 본론으로 들어가겠습니다.

또한 https 통신을 위한 SSL 인증서를 설정해 봅시다.

어떻게 되는가

1.DNS 등록

2.nginx 설정(SSL 인증서 포함)

3.방화벽 설정

1.DNS 등록


CloudFlare DNS를 사용합니다.

원하는 하위 도메인 항목을 등록합니다.

kokonut.today 도메인에 king 하위 도메인을 등록하려면 A 레코드에 king.kokonut.today를 추가합니다.

또는 bind9와 같은 DNS가 있으면 각 서버에 대한 설정을 구성할 수 있습니다.

2. nginx 구성

우분투 기준으로 진행하겠습니다.

A. Nginx 설치

apt install nginx -y

B. Nginx 구성 파일 생성

원하는 이름으로 파일을 만듭니다.

nano /etc/nginx/sites-enabled/anti.kokonut.today

다음 구성 파일의 내용은 다음과 같습니다.

요청이 http://anti.kokonut.today:80에 도착하면 포트 443에서 다시 작성되어 http://anti.kokonut.loca.:8080으로 전달됩니다.

요청이 https://anti.kokonut.today:443에 오면 통신을 http://anti.kokonut.loca.:8080으로 전달합니다.

# /etc/nginx/sites-enabled/anti.kokonut.today

server {
	# 443 포트 리스닝
    listen 443 ssl;
    listen (::):443 ssl;
    
    # ssl 통신설정을 한다
    # 해당 설정 부분은 아래에서 자세히 설명한다.

ssl_certificate /etc/letsencrypt/live/kokonut.today/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/kokonut.today/privkey.pem; # managed by Certbot # anti.kokonut.today로 요청이 들어온다면 server_name anti.kokonut.today; # http://anti.kokonut.local:8080으로 통신시킨다.

location / { proxy_pass http://anti.kokonut.local:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } server { # 80 포트로 리스닝한다.

# anti.kokonut.today로 요청이오면 https로 rewrite한다.

if ($host = anti.kokonut.today) { rewrite ^ https://$host$request_uri; } # managed by Certbot listen 80; listen (::):80; server_name anti.kokonut.today; return 301 https://$server_name$request_uri; }

이제 HTTPS 통신을 위해 발급된 SSL 인증서를 받아보자

인증서를 받으려면 인증서 발급 기관(CA, 인증 기관)에 신청해야 합니다.

예를 들어 Let’s Encrypt라는 무료 인증 기관이 있습니다.

아래에서 anti.kokonut.today 도메인에 대해 Let’s Encrypt에서 발급한 인증서를 받는 방법을 알아봅니다.

certbot 설치 certbot은 인증서를 발급하기 위해 Let’s Encrypt에서 사용하는 도구입니다.

certbot을 설치하려면 Ubuntu에서 다음 명령을 입력합니다.

$ sudo apt-get update
$ sudo apt-get install certbot

다.

증명서 발급
certbot으로 anti.kokonut.today 도메인에 대한 인증서를 발급합니다.

이 시점에서 Nginx가 실행 중이어야 합니다.

$ sudo certbot --nginx -d anti.kokonut.today

위의 명령을 입력하면 certbot이 자동으로 Nginx 구성 파일을 업데이트하고 인증서를 발급하여 구성 파일에 등록합니다.

Nginx 구성 업데이트
인증서를 발급한 후 Nginx 구성 파일에서 인증서 경로를 변경해야 합니다.

/etc/nginx/sites-available/default 파일을 열고 다음과 같이 수정합니다.

server {
    listen 443 ssl;
    listen (::):443 ssl;
    server_name anti.kokonut.today;
    ssl_certificate /etc/letsencrypt/live/anti.kokonut.today/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/anti.kokonut.today/privkey.pem;

    location / {
        proxy_pass http://anti.kokonut.local:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    if ($host = anti.kokonut.today) {
        rewrite ^ https://$host$request_uri;
    }

    listen 80;
    listen (::):80;
    server_name anti.kokonut.today;
    return 301 https://$server_name$request_uri;
}

위의 구성 파일에서 ssl_certificate 및 ssl_certificate_key 경로를 Let’s Encrypt에서 발급한 인증서 경로로 변경합니다.

D.Nginx 재시작
Nginx 구성 파일을 변경한 후 적용하려면 Nginx를 다시 시작해야 합니다.

다음 명령을 입력하여 Nginx를 다시 시작합니다.

$ sudo systemctl restart nginx

이제 anti.kokonut.today 도메인에 대해 Let’s Encrypt에서 발급한 SSL 인증서로 Nginx 서버를 실행할 수 있습니다.

3.방화벽 설정


방화벽은 다음과 같이 nginx 서버의 포트 80, 443을 열고 anti.kokonut.today 요청 시 https://anti.kokonut.today로 접속한다.

이렇게 하면 완료됩니다.

https로 제어할 수 있으며 하위 도메인으로 깔끔하게 제어할 수 있습니다.

추가 정보

Cloudflare 프록시가 설정되었을 때 프록시 패스로 nginx에 액세스하면 너무 많은 리디렉션이 발생하고 연결이 실패합니다.

Let’s Encrypt 인증서는 90일마다 갱신해야 합니다.

certbot은 이를 자동으로 처리하는 기능을 제공합니다.

아래에서 인증서를 자동으로 갱신하는 방법을 확인할 수 있습니다.

$ sudo nano /etc/letsencrypt/cli.ini

certbot 구성 자동 인증서 갱신을 위한 certbot 구성 파일(/etc/letsencrypt/cli.ini)을 열고 다음과 같이 수정합니다.

# Renewal config file version
version = 1.16.0
# Automatically renew at 30 days before expiration
renew_before_expiry = 30 days

# Uncomment and update email to receive renewal reminders and security notices
email = [email protected]

# Uncomment and update domains to renew automatically
domains = anti.kokonut.today

renew_before_expiry를 30일로 설정하면 만료 30일 전에 자동으로 인증서 갱신을 시도합니다.

자동 갱신 테스트
certbot을 사용하여 인증서가 자동으로 갱신될 수 있는지 테스트하십시오. 다음 명령을 입력합니다.

$ sudo certbot renew --dry-run

–dry-run 옵션을 사용하면 실제로 인증서가 갱신되지 않고 테스트만 수행됩니다.

크론 작업 등록
자동 인증서 갱신을 위해 cron 작업을 등록합니다.

다음 명령을 입력합니다.

$ sudo crontab -e

그러면 메모장이 열리며 다음을 입력합니다.

0 0 * * 1 certbot renew

이 레지스트리는 매주 월요일 자정에 인증서 갱신을 시도합니다.

이제 인증서가 자동으로 갱신되므로 90일마다 인증서를 수동으로 갱신할 필요가 없습니다.