Ubuntu 20.04에서 Nginx 설치 및 설정하기_01

Yun Subin·2024년 10월 10일
0

nginX

목록 보기
1/2
post-custom-banner

이 포스트는 프로젝트를 배포하는 과정에서 참고한 여러 개의 포스트를 종합한 글입니다. Ubuntu 20.04 환경에서 Nginx를 설치하고 설정하는 방법을 단계별로 안내합니다. 기본 설치부터 방화벽 설정, 서버 블록 구성, HTTPS 적용 및 HTTP/2 설정까지 다룹니다.

목차

  1. Nginx 설치
  2. 방화벽 설정
  3. Nginx 상태 체크
  4. Nginx 프로세스 관리 명령어
  5. 서버 블록 설정
  6. HTTPS 적용
  7. HTTP/2 적용
  8. 레퍼런스

Nginx 설치

먼저, 시스템 패키지를 업데이트하고 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: 포트 80번만 허용
  • Nginx HTTPS: 포트 443번만 허용
  • Nginx Full: 포트 80, 443번 모두 허용

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 상태 체크

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 랜딩 페이지가 표시되는지 확인합니다:

!https://cdn.jsdelivr.net/gh/jaehyeon48/jaehyeon48.github.io@master/assets/images/nginx/configure-nginx-on-ubuntu-2004/welcome_to_nginx.png

위 랜딩 페이지가 표시된다면 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)을 통해 여러 도메인을 관리할 수 있습니다. 서버 블록 설정 절차는 다음과 같습니다:

1. 디렉토리 생성

도메인 별 웹 파일을 저장할 디렉토리를 생성합니다.

sudo mkdir -p /var/www/도메인이름/html

2. 소유자 설정

생성한 디렉토리의 소유자를 현재 사용자로 변경합니다.

sudo chown -R $USER:$USER /var/www/도메인이름/html

3. 권한 설정

디렉토리의 권한을 설정하여 웹 서버가 파일에 접근할 수 있도록 합니다.

sudo chmod -R 755 /var/www/도메인이름

4. 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>

5. 서버 블록 생성

새로운 서버 블록 설정 파일을 생성합니다.

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;
    }
}

6. 심볼릭 링크 생성

서버 블록 설정을 활성화하기 위해 심볼릭 링크를 생성합니다.

sudo ln -s /etc/nginx/sites-available/도메인이름 /etc/nginx/sites-enabled/

7. nginx.conf 파일 설정

Nginx의 메인 설정 파일을 수정하여 서버 이름 해시 버킷 크기를 늘립니다.

sudo vi /etc/nginx/nginx.conf

http 블록 내에 다음 내용을 추가합니다:

http {
    ...
    server_names_hash_bucket_size 64;
    ...
}

8. 설정 파일 문법 오류 검사

Nginx 설정 파일에 문법 오류가 없는지 확인합니다.

sudo nginx -t

9. Nginx 재시작

설정이 정상이라면 Nginx를 재시작하여 변경 사항을 적용합니다.

sudo systemctl restart nginx

이제 브라우저의 주소창에 http://도메인이름을 입력하면 생성한 index.html의 내용이 표시됩니다.

HTTPS 적용

📌 HTTPS를 적용하고자 하는 경우

  • 반드시 등록된 도메인이 있어야 합니다.
  • 도메인에 대한 A 레코드가 존재해야 합니다.
  • 위에서 설정했던 서버 블록 설정이 완료되어 있어야 합니다.

1. Certbot 설치

Certbot은 Let's Encrypt의 SSL 인증서를 쉽게 발급받고 설정할 수 있게 도와줍니다.

sudo apt install certbot python3-certbot-nginx

2. 방화벽에서 HTTPS 허용

HTTPS 트래픽을 허용하고 기존의 HTTP만 허용 설정을 제거합니다.

sudo ufw allow 'Nginx Full'  # HTTP와 HTTPS 모두 허용
sudo ufw delete allow 'Nginx HTTP'  # 기존의 HTTP만 허용 설정 제거

3. SSL 인증서 발급

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>

4. Certbot 자동 갱신 확인하기

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

HTTP/2 적용

📌 HTTP/2를 적용하고자 하는 경우

  • 반드시 등록된 도메인과 서버에 TLS 설정이 적용되어 있어야 합니다.

1. HTTP/2 옵션 켜기

서버 블록 설정 파일을 열고 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

2. 안전하지 않은 Cipher Suite 제거

보안 강화를 위해 안전하지 않은 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

3. HSTS(HTTP Strict Transport Security) 설정하기

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를 설치하고 설정하는 데 도움이 되었기를 바랍니다. 추가적인 질문이나 도움이 필요하시면 댓글로 남겨주세요!

profile
Blockchain Web Developer
post-custom-banner

0개의 댓글