Nginx 사용 방법
Nginx 사용 방법에 대해 설명하는 페이지입니다.
Environment
- OS: Raspberry Pi OS (64 bit)
목차
Nginx란?
Nginx(엔진엑스)란 러시아에서 개발된 오픈 소스 웹 서버 프로그램입니다. Apache HTTP Server
같은 웹 서버와 비교하면 가볍고, 동시접속 처리에 특화되어 있다는 장점이 있습니다. Nginx는 비동기 이벤트 기반의 구조와 다수의 연결을 효과적으로 처리 가능한 웹 서버이며, 주로 Node.js 서버 앞단의 프록시 서버로 활용됩니다. Nginx를 사용할 때의 장점은 다음과 같습니다.
리버스 프록시 (Reverse Proxy)
리버스 프록시는 컴퓨터 네트워크에서 클라이언트를 대신해서 한 대 이상의 서버로부터 자원을 추출하는 프록시 서버의 일종입니다. 쉡게 말해 클라이언트의 요청을 대신 받아 내부 서버로 전달해주는 것입니다. Nginx를 이용하여 리버스 프록시를 사용하면 “클라이언트 –> Nginx –> 웹 서버”로 사용자의 요청을 Nginx가 대신 웹 서버로 전달해주기 때문에, 해당 서버 주소를 클라이언트로부터 숨기고 프록시 서버 주소만을 노출하여 보안을 강화할 수 있습니다.
로드 밸런싱 (Load Balancing)
로드 밸런싱이란 컴퓨터 네트워크 기술 중 하나로, 애플리케이션을 지원하는 리소스 풀 전체에 네트워크 트래픽을 균등하게 배포하는 방법을 말합니다. 이를 통해 가용성 및 응답 시간을 최적화할 수 있습니다. Nginx를 사용하면 여러 대의 서버가 연결되었을 때 한 서버에 부하가 걸리지 않도록 균등하게 요청을 분배할 수 있습니다.
SSL 지원
SSL (Secure Socket Layer)는 전송 계층에서 보안을 제공하는 프로토콜입니다. HTTPS는 애플리케이션 계층과 전송 계층 사이에 신뢰 계층인 SSL/TLS 계층을 넣은 신뢰할 수 있는 HTTP 요청이며, Nginx을 사용하면 SSL 인증서를 적용할 수 있으므로 HTTPS를 적용할 수 있습니다.
가상 호스팅
하나의 웹 서버에서 여러 도메인 또는 서브 도메인을 호스팅하는 가상 호스팅을 지원합니다.
Step 1 - Nginx 설치
Nginx 설치
다음 명령어를 입력하여 Nginx를 설치합니다.
sudo apt install nginx
Nginx 설치 확인
설치가 완료되었는지 확인하기 위해 다음 명령어를 입력하여 Nginx 버전을 확인합니다.
nginx -v
Step 2 - Nginx 설정 파일 생성
Nginx를 설치하고 나면 다음 명령어를 입력하여 Nginx를 디렉토리 구조를 확인합니다.
cd /etc/nginx
ls -l
주요 파일 및 디렉토리에 대해 설명하면 다음과 같습니다.
- sites-available
비활성화된 사이트들의 설정 파일들이 위치한다. - sites-enabled
활성화된 사이트들의 설정 파일들이 위치한다.sites-available
에 존재하는 설정 파일들 중에서 사용하는 설정 파일만 link하여 사용합니다. - nginx.conf
접속자 수, 프로세스 수 등 performance에 관한 설정을 하는 파일입니다.sites-enabled
에 존재하는 파일들을 불러옵니다.
default 파일 삭제
먼저 다음 명령어를 입력하여 /etc/nginx/sites-available 디렉토리와 /etc/nginx/sites-enabled 디렉토리에 있는 default 파일을 삭제합니다.
sudo rm -rf /etc/nginx/sites-available/default
sudo rm -rf /etc/nginx/sites-enabled/default
리버스 프록시 서버 블록 설정
다음 명령어를 입력하여 sites-available 디렉토리로 이동하여 설정 파일 생성하고 편집합니다. 파일 이름은 원하는대로 지정하면 됩니다.
cd sites-available
# touch [파일 이름]
sudo touch myApp
파일을 생성하면 다음 예제와 같이 서버 블록을 설정합니다. 80번 포트에서 HTTP 요청을 수신하면 로컬 서버의 3000번 포트로 요청을 전달하게 됩니다.
주요 키워드에 설명하면 다음과 같습니다.
- server
하나의 웹 사이트를 선언하는데 사용합니다. 여러 개의 server 블록을 선언하면 하나의 서버에서 여러 개의 서로 다른 웹 사이트를 서빙할 수 있습니다. - location
server 블록 안에서 특정 웹 사이트의 url을 처리하는데 사용합니다.
사이트 활성화
다음 명령어를 입력하여 심볼릭 링크를 생성합니다.
sudo ln -s /etc/nginx/sites-available/myApp /etc/nginx/sites-enabled/
Step 3 - Nginx 설정
nginx.conf 파일 수정
nginx에 대한 설정을 하기 위해선 nginx.conf
파일을 수정해야 합니다. nginx.conf
파일은 Nginx가 동작해야 할 방식을 설정 값을 통해 지정합니다. 다음 명령어를 입력하여 설정 파일을 엽니다.
sudo nano /etc/nginx/nginx.conf
파일 내용에 대해 설명하자면 다음과 같습니다.
- core
설정 파일 최상단에 위치하며 Nginx의 프로세스 관리, 보안과 같은 기본적인 동작 방식을 정의합니다.- user
작업자 프로세스(worker_process)가 어떤 user 또는 groupd으로 실행되는지에 대한 설정입니다. 보안을 위해 root를 사용하지 않습니다. - worker_process
작업자 프로세스(worker_process)의 수를 정의합니다. 1이면 모든 요청을 하나의 프로세스로 실행하겠다는 의미입니다. 일반적으로 CPU 코어 수만큼 할당하는 것이 좋습니다. auto를 입력하여 자동 감지를 지정할 수 있습니다. - pid
Nginx의 마스터 프로세스 ID 정보가 저장됩니다. - error_log
로그 레벨을 설정하는 지시어. 로그 레벨은 [debug | info | notice | warn | error | crit ] 같은 종류가 있습니다.
- user
- events
Nginx의 특징인 비동기 이벤트 처리 방식에 대한 옵션을 정의합니다.- worker_connections
하나의 작업자 프로세스가 처리할 수 있는 커넥션의 수를 의미합니다. 작업자 프로세스가 4개이고, worker_connections가 768로 지정되어 있다면, 총4 x 786 = 3072
개의 커넥션(= 최대 접속자 수)이 동시 처리될 수 있습니다.
- worker_connections
- http
- include
include 지시어는 특정 파일을 포함하는 기능을 수행합니다. include 지시어가 있는 위치에 해당 파일 내용이 삽입됩니다. - default_type
이 웹 서버의 기본 Content-Type을 설정합니다. octet-stream은 바이너리 형태의 타입을 의미합니다. - keepalive_timeout
클라이언트 접속 유지 시간으로 몇 초 후에 클라이언트 접속을 끊을지 설정합니다. - access_log
access 로그를 저장할 파일을 지정합니다.
- include
위에서 활성화한 사이트 설정 파일을 가져오기 위해 다음과 같이 작성합니다.
80번 포트 열기
다음과 같은 명령어를 입력하여 80번 포트에 대한 접속을 허용합니다.
sudo ufw allow 80
Nginx 설정 테스트 및 재시작
다음 명령어를 입력하여 설정 파일에 대한 문법을 검사합니다.
sudo nginx -t
문법 검사가 완료되면 다음 명령어를 입력하여 Nginx를 재시작합니다.
sudo systemctl restart nginx
서비스 상태를 확인합니다.
sudo systemctl status nginx
Nginx 설정이 완료되었음을 확인할 수 있습니다.
Step 4 - 테스트
Nginx 설정이 성공적으로 이루어졌는지 확인해보겠습니다. 먼저 서비스를 실행하겠습니다. 해당 서비스는 3000번 포트를 사용합니다.
pm2 start npm -- start
서비스가 실행되면 웹 사이트에 접속합니다.
위와 같이 포트 번호를 명시하지 않아도(= 80번 포트 사용) 서비스에 접속할 수 있음을 확인할 수 있습니다.