Ubuntu에서 웹 서버를 운영하려면 여러 가지 선택지가 있지만, 그중에서도 Nginx는 가볍고 빠른 성능 덕분에 많이 사용된다. 개인적으로도 필요할 때마다 설정 방법을 찾아보곤 하는데, 매번 검색하는 것보다 한 번 정리해 두면 두고두고 참고하기 좋을 것 같아 이 글을 작성하게 되었다.
Nginx 설치 및 기본 실행
패키지 목록 업데이트 및 설치
sudo apt update && sudo apt install nginx -y
nginx 설치확인
nginx -v
Nginx 서비스 실행 및 관리
서비스 시작/중지/재시작
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
부팅 시 자동 실행 설정
sudo systemctl enable nginx
방화벽 설정 UFW(Uncomplicated Firewall) 사용
UFW(Uncomplicated Firewall)는 Ubuntu 및 Debian 기반 시스템에서 제공되는 방화벽 관리 도구
방화벽 설정 목록 보기
sudo ufw app list
Nginx Full: HTTP와 HTTPS를 모두 허용.
Nginx HTTP: HTTP 트래픽만 허용.
Nginx HTTPS: HTTPS 트래픽만 허용.
OpenSSH: SSH 원격 접속 허용.
특정 포트 허용하기
sudo ufw allow <포트번호>
# sudo ufw allow 8080
특정 포트를 특정 프로토콜만 허용하기
sudo ufw allow <포트번호>/<프로토콜>
# sudo ufw allow 3306/tcp
# sudo ufw allow 53/udp
특정 IP에서 특정 포트로 접근 허용하기
sudo ufw allow from <IP주소> to any port <포트번호>
192.168.1.100에서만 22번(SSH) 포트 접근 허용
sudo ufw allow from 192.168.1.100 to any port 22
특정 대역대(IP Range)에서 특정 포트 허용하기
sudo ufw allow from <IP대역> to any port <포트번호>
192.168.1.0/24 대역에서만 3306 포트 허용
sudo ufw allow from 192.168.1.0/24 to any port 3306
설정 적용 및 확인
방화벽 규칙 적용
sudo ufw reload
현재 허용된 포트 및 규칙 확인
sudo ufw status
nginx 방화벽 허용
sudo ufw allow 'Nginx Full'
활성이 아니라면 아래 명령어 사용
sudo ufw enable
불필요하게 방화벽 규칙이 추가되었을 때 제거 방법
sudo ufw status numbered
위 명령어를 사용하면 번호가 나옴
sudo ufw delete [번호]
nginx 상태 확인
systemctl status nginx
nginx 기본 설정 경로 및 설정 파일 찾기
운영 체제 기본 경로
Ubuntu/Debian: /etc/nginx/nginx.conf
CentOS/Red Hat: /etc/nginx/nginx.conf
macOS (Homebrew): /usr/local/etc/nginx/nginx.conf
Custom Build: /usr/local/nginx/conf/nginx.conf
nginx 찾기 명령어
sudo find / -name "nginx.conf"
Nginx 설정 파일의 문법 및 구문 오류를 검사하는 명령어
sudo nginx -t
nginx 서버 블록 작성
Nginx 서버 블록은 Nginx 웹 서버에서 도메인 및 요청 처리 방식을 정의하는 설정 단위. 이를 통해 서로 다른 도메인이나 서브도메인에 대해 별도의 설정을 적용
Ubuntu 및 Debian: /etc/nginx/sites-available/
CentOS 및 RHEL: /etc/nginx/conf.d/ (기본적으로 이 경로에서 개별 설정 파일을 읽음)
macOS (Homebrew): /usr/local/etc/nginx/conf.d/
Windows: 설치 디렉토리\conf.d\
파일 생성 및 작성
sudo vi /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com;
root /var/www/example;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server: Nginx에서 하나의 서버 블록(Server Block)을 정의
listen: Nginx가 요청을 수신할 포트를 정의
- 브라우저에서
요청이 들어오면 이 블록이 요청을 처리http://example.com
server_name: 이 서버 블록이 처리할 도메인 이름을 지정합니다.
- example.com으로 요청된 트래픽만 이 서버 블록이 처리합니다.
- 와일드카드(*.example.com)나 정규식으로 여러 도메인을 처리할 수도 있습니다.
- 모든 도메인 _
- 로컬 localhost
root: 요청된 정적 파일을 제공할 웹 루트 디렉토리를 설정합니다.
- 예:
요청이 들어오면 /var/www/example/index.html 파일을 반환합니다.http://example.com/index.html
index: 기본적으로 반환할 인덱스 파일을 지정합니다.
location: 요청된 URL 경로(여기서는 /)에 대한 처리 방법을 정의합니다.
- 슬래시(/)는 루트 경로를 의미하며, 이 블록은 모든 요청에 기본적으로 적용됩니다.
try_files $uri $uri/ =404;: 요청된 파일이나 디렉토리가 존재하는지 확인하고, 없으면 404 오류를 반환합니다.
- $uri → 사용자가 요청한 경로 (예: /about)
- $uri/ → 요청한 경로가 디렉터리인지 확인 (예: /about/)
- =404 → 위의 파일이나 디렉터리가 없으면 404 에러 반환
서버 블록 활성화
심볼릭 링크 설정
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
심볼릭 링크를 잘못 설정할 수도 있는데
sudo nginx -t # 심볼릭 링크 잘못 설정되었으면 failed 메시지 나옴
연결 확인
ls -l /etc/nginx/sites-enabled/
example이 잘못된 것을 확인할 수 있음, 심볼릭 링크 제거
sudo rm /etc/nginx/sites-enabled/example
설정 적용 (nginx reload)
sudo systemctl reload nginx
permission denied 권한이 없는 문제
example 파일은 생성했지만 호스팅 해야하는 파일들이 옴겨지지 않음 permission denied라 나옴
폴더 권한 설정
# 계정: sangmin
sudo chown -R sangmin:sangmin /var/www/example
또 다른 방법으로는 www-data 그룹에 계정을 추가하는 방법
sudo usermod -aG www-data sangmin
sudo chown -R www-data:www-data /var/www/example
sudo chmod -R 775 /var/www/example
exit # 다시 로그인 하기 위해 나가기