Nginx 설치
sudo apt-get install nginx
Nginx 상태 확인
sudo systemctl status nginx

Certbot 설치
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
Nginx 파일 생성
/etc/nginx/sites-available/ 경로 아래에 default 파일을 수정하거나 파일을 생성한다.
cp default example-server.com
example-server.com 파일 수정.
server {
listen 80;
server_name example-server.com www.example-server.com;
location / {
proxy_pass http://localhost:port; # 프록시할 포트번호
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
/etc/nginx/sites-available 의 작성한 파일을 /etc/nginx/sites-enabled에 심볼릭 링크한다.
sudo ln -s /etc/nginx/sites-available/example-server.com /etc/nginx/sites-enabled/
적용 확인
sudo nginx -t # 문법 확인
sudo systemctl reload nginx # 설정 반영
주의할 점
기존의 default 파일과 새로 생성한 파일의 포트가 충돌나지 않도록 해야한다. 이를 위해 /etc/nginx/sites-enabled에 활성화되어 있는 default파일에 대한 심볼릭 링크만 제거한다.
sudo rm -rf /etc/nginx/sites-enabled/default
DNS에 연결한 후, ssh 접속 등으로 정상적으로 연결되었는지 확인한다.
certbot을 이용하여 HTTPS 적용
sudo certbot --nginx -d example-server.com -d www.example-server.com -d api.example-server.com
HTTPS 적용 확인.
다음과 같은 방식으로 HTTPS를 위한 443 포트용 server 블록이 자동으로 추가된다.
server {
listen 443 ssl;
server_name example-server.com www.example-server.com;
ssl_certificate /etc/letsencrypt/live/example-server.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example-server.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://localhost:port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# HTTP 접속 시 HTTPS로 리디렉션
server {
listen 80;
server_name example-server.com www.example-server.com;
return 301 https://$host$request_uri;
}
전체 코드
# Web FrontEnd HTTP -> HTTPS 리다이렉션
server {
listen 80;
server_name example-server.com www.example-server.com;
return 301 https://example-server.com$request_uri;
}
# BackEnd API Server HTTP -> HTTPS 리다이렉션
server {
listen 80;
server_name api.example-server.com;
return 301 https://api.example-server.com$request_uri;
}
# Web FrontEnd HTTPS listen 및 proxy
server {
listen 443 ssl;
server_name example-server.com www.example-server.com;
ssl_certificate /etc/letsencrypt/live/example-server.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example-server.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# BackEnd API Server HTTPS listen 및 proxy
server {
listen 443 ssl;
server_name api.example-server.com;
ssl_certificate /etc/letsencrypt/live/example-server.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example-server.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}