이 포스트는 프로젝트를 배포하는 과정에서 참고한 여러 개의 포스트를 종합한 글입니다. Ubuntu 20.04 환경에서 Nginx를 설치하고 설정하는 방법을 단계별로 안내합니다. 기본 설치부터 방화벽 설정, 서버 블록 구성, HTTPS 적용 및 HTTP/2 설정까지 다룹니다.
먼저, 시스템 패키지를 업데이트하고 Nginx를 설치합니다.
sudo apt update
sudo apt install nginx
설치가 완료되면 Nginx 서비스가 자동으로 시작됩니다.
Ubuntu의 기본 방화벽인 UFW(Uncomplicated Firewall)를 사용하여 Nginx 트래픽을 허용합니다. 먼저, UFW에서 사용 가능한 애플리케이션을 확인합니다.
sudo ufw app list
위 명령을 실행하면 다음과 같은 리스트가 출력됩니다:
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSH
각 설정의 의미는 다음과 같습니다:
Nginx HTTP 트래픽을 허용하려면 다음 명령어를 사용합니다:
sudo ufw allow 'Nginx HTTP'
방화벽 상태를 확인하여 설정이 제대로 적용되었는지 확인합니다:
sudo ufw status
Status: active
To Action From
-- ------ ----
Nginx HTTP ALLOW Anywhere
Nginx HTTP (v6) ALLOW Anywhere (v6)
만약 방화벽이 inactive
상태라면, 아래 명령어로 활성화합니다:
sudo ufw enable
Nginx가 정상적으로 실행 중인지 확인하기 위해 상태를 체크합니다:
systemctl status nginx
출력 예시는 다음과 같습니다:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-04-20 09:03:47 UTC; 24h ago
Docs: man:nginx(8)
Main PID: 20596 (nginx)
Tasks: 2 (limit: 1147)
Memory: 5.4M
CGroup: /system.slice/nginx.service
├─20596 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
└─20597 nginx: worker process
또한, 브라우저의 주소창에 서버의 IP 주소나 도메인 이름을 입력하여 기본 Nginx 랜딩 페이지가 표시되는지 확인합니다:
위 랜딩 페이지가 표시된다면 Nginx가 정상적으로 동작하고 있는 것입니다.
Nginx 서비스는 systemctl
명령어를 통해 관리할 수 있습니다. 주요 명령어는 다음과 같습니다:
# 시작
sudo systemctl start nginx
# 종료
sudo systemctl stop nginx
# 재시작
sudo systemctl restart nginx
# 리로드 (변경된 설정을 적용하는 경우 사용. 기존 연결을 끊지 않음.)
sudo systemctl reload nginx
# 기본적으로 서버 시작 시 Nginx가 자동으로 실행되는데, 이를 막고 싶은 경우
sudo systemctl disable nginx
# 서버 시작 시 자동으로 Nginx를 실행하고 싶은 경우
sudo systemctl enable nginx
Nginx에서는 서버 블록(Server Block)을 통해 여러 도메인을 관리할 수 있습니다. 서버 블록 설정 절차는 다음과 같습니다:
도메인 별 웹 파일을 저장할 디렉토리를 생성합니다.
sudo mkdir -p /var/www/도메인이름/html
생성한 디렉토리의 소유자를 현재 사용자로 변경합니다.
sudo chown -R $USER:$USER /var/www/도메인이름/html
디렉토리의 권한을 설정하여 웹 서버가 파일에 접근할 수 있도록 합니다.
sudo chmod -R 755 /var/www/도메인이름
index.html
생성웹 페이지의 기본 파일을 생성합니다.
sudo vi /var/www/도메인이름/html/index.html
index.html
파일에 간단한 HTML 코드를 입력합니다.
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx!</title>
</head>
<body>
<h1>Success! The Nginx server block is working!</h1>
</body>
</html>
새로운 서버 블록 설정 파일을 생성합니다.
sudo vi /etc/nginx/sites-available/도메인이름
아래 내용을 입력합니다:
server {
listen 80;
listen [::]:80;
root /var/www/도메인이름/html;
index index.html index.htm index.nginx-debian.html;
server_name 도메인이름 www.도메인이름;
location / {
try_files $uri $uri/ =404;
}
}
서버 블록 설정을 활성화하기 위해 심볼릭 링크를 생성합니다.
sudo ln -s /etc/nginx/sites-available/도메인이름 /etc/nginx/sites-enabled/
nginx.conf
파일 설정Nginx의 메인 설정 파일을 수정하여 서버 이름 해시 버킷 크기를 늘립니다.
sudo vi /etc/nginx/nginx.conf
http
블록 내에 다음 내용을 추가합니다:
http {
...
server_names_hash_bucket_size 64;
...
}
Nginx 설정 파일에 문법 오류가 없는지 확인합니다.
sudo nginx -t
설정이 정상이라면 Nginx를 재시작하여 변경 사항을 적용합니다.
sudo systemctl restart nginx
이제 브라우저의 주소창에 http://도메인이름
을 입력하면 생성한 index.html
의 내용이 표시됩니다.
Certbot은 Let's Encrypt의 SSL 인증서를 쉽게 발급받고 설정할 수 있게 도와줍니다.
sudo apt install certbot python3-certbot-nginx
HTTPS 트래픽을 허용하고 기존의 HTTP만 허용 설정을 제거합니다.
sudo ufw allow 'Nginx Full' # HTTP와 HTTPS 모두 허용
sudo ufw delete allow 'Nginx HTTP' # 기존의 HTTP만 허용 설정 제거
Certbot을 사용하여 SSL 인증서를 발급받고 Nginx 설정을 자동으로 업데이트합니다.
sudo certbot --nginx -d 도메인이름 -d www.도메인이름
처음 실행 시 이메일 입력 및 약관 동의가 요구됩니다. 인증서 발급이 완료되면 HTTPS 설정이 자동으로 적용되고 Nginx가 재시작됩니다.
출력 예시는 다음과 같습니다:
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/example.com/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/example.com/privkey.pem
Your cert will expire on 2020-08-18. To obtain a new or tweaked
version of this certificate in the future, simply run certbot again
with the "certonly" option. To non-interactively renew *all* of
your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: <https://letsencrypt.org/donate>
Donating to EFF: <https://eff.org/donate-le>
Let's Encrypt의 인증서는 90일 동안 유효합니다. Certbot은 자동으로 인증서를 갱신할 수 있도록 타이머를 설정합니다.
타이머 상태를 확인하려면 다음 명령어를 사용합니다:
sudo systemctl status certbot.timer
출력 예시는 다음과 같습니다:
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago
Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left
Triggers: ● certbot.service
자동 갱신 과정을 테스트하려면 다음 명령어를 실행합니다:
sudo certbot renew --dry-run
서버 블록 설정 파일을 열고 listen
지시에 http2
옵션을 추가합니다.
sudo vi /etc/nginx/sites-enabled/도메인이름
아래와 같이 수정합니다:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2 ipv6only=on;
root /var/www/도메인이름/html;
index index.html index.htm index.nginx-debian.html;
server_name 도메인이름 www.도메인이름;
location / {
try_files $uri $uri/ =404;
}
}
설정 파일 문법을 다시 한 번 검사합니다:
sudo nginx -t
보안 강화를 위해 안전하지 않은 Cipher Suite를 제거합니다.
sudo vi /etc/nginx/sites-enabled/도메인이름
include /etc/letsencrypt/options-ssl-nginx.conf;
라인을 주석 처리하거나 제거하고, 아래와 같이 ssl_ciphers
를 설정합니다:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
만약 self-signed 인증서를 사용하는 경우, 추가적인 설정이 필요할 수 있습니다:
sudo nano /etc/nginx/snippets/ssl-params.conf
기존 ssl_ciphers
설정을 아래 내용으로 변경합니다:
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
설정이 완료되면 Nginx 설정을 다시 로드합니다:
sudo systemctl reload nginx
HSTS를 통해 브라우저가 반드시 HTTPS를 사용하도록 강제할 수 있습니다.
sudo vi /etc/nginx/sites-enabled/도메인이름
server
블록 내에 아래 라인을 추가합니다:
add_header Strict-Transport-Security "max-age=31536000" always;
서브도메인에도 HSTS를 적용하려면 includeSubDomains
값을 추가합니다:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
설정을 적용하기 위해 Nginx를 다시 로드합니다:
sudo systemctl reload nginx
이 글이 Ubuntu 20.04에서 Nginx를 설치하고 설정하는 데 도움이 되었기를 바랍니다. 추가적인 질문이나 도움이 필요하시면 댓글로 남겨주세요!