🍎 Nginx에 관한 기본과 사용 방법을 정리합니다.
❓ Nginx는 어떤 도구인가요?
-> 공식 문서 출처에 의하면 NGINX(엔진 X)는 HTTP 웹 서버, 리버스 프락시, 콘텐츠 캐시, 로드 밸런서, TCP/UDP 프락시 서버 및 메일 프락시 서버입니다.
❓ 왜 사용하나요?
- 어떤 불편함을 해결하기 위해 Nginx라는 도구가 탄생했는지 찾아본다면 사용 이유를 알 수 있습니다.
- Nginx 이전 시중엔 Apache HTTP Server(Web Server)를 사용했고 Apache HTTP Server가 가진 몇 가지 한계를 극복하기 위해 Ningx가 등장했습니다.
- 초기 웹 서버들은 클라이언트 요청이 증가할 때마다 성능이 급격히 떨어지는 문제가 있었고 특히 Apache의 프로세스 기반 아키텍처가 대량의 동시 접속을 처리하는데 비효율적이었음.
- 높은 동시 연결 처리
- 컨텐츠(HTML, CSS, JavaScript) 제공 시 오버헤드 발생
- 로드 밸런싱 기능 부족
- 리버스 프록시 기능의 필요성
-> Nginx 는 위의 문제를 해결하기 위해 이벤트 기반(Event-Driven) 비동기 아키텍처를 채택
💭 그렇다면 Apache HTTP Server는 사장된 기술인가요?
-> 그렇지 않습니다. 오래된 레거시 시스템과 호환이 좋고 동적 콘텐츠를 실행하는 모듈을 내장하고 있어 동적 콘텐츠가 많은 서비스에선 Apache가 더 유리할 수 있습니다.
🍏 Default Code 구성 및 해석
- nginx 설정 시 /etc/nginx/nginx.conf 디렉토리의 default.conf file을 통해 설정을 구성할 수 있습니다.
server { 0️⃣
listen 80; 1️⃣
server_name localhost; 2️⃣
location / { 3️⃣
root /usr/share/nginx/html;
index index.html index.htm;
}
4️⃣
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
0️⃣ 'server 블록'이라고 불리며 하나의 Host를 의미합니다. 즉, 하나의 블록은 특정한 도메인이나 포트를 처리하는 개별 단위
1️⃣ listen 은 Port 번호로 들어오는 요청을 해당 server 블록에서 처리하도록 설정
2️⃣ server_name 은 host 이름 server 블록을 나타내며 일치하는 Server 블록 없을 경우 첫 번째 정의되어 있는 Server 블록으로 처리함
3️⃣ location / {... } 은 "/"로 시작되는 모든 경로를 처리합니다.
-> 만약 /example.html 로 요청이 왔다면 서버에 존재하는 /usr/share/nginx/html/example.html을 실행시킵니다.
-> "/"로 요청이 들어온다면 /usr/share/nginx/html/index.html로 응답합니다.
4️⃣ Nginx에서 500, 502, 503, 504 상태 코드가 발생했을 때 /50x.html로 응답합니다.
-> location = /50x.html {... } 은 "/50x.html" 로 완전히 일치하는 경로를 처리합니다.
-> /50x.html로 요청이 들어오면 /usr/share/nginx/html/50x.html 파일로 응답합니다.
🍏 Web Server로 사용
- nginx가 설치된 환경에서 nginx를 실행한 뒤 'sudo systemctl status nginx'를 입력했을 때 'active' 라면 nginx가 실행되고 있음을 의미. 80번 port로 접근하면 아래와 같은 html file을 웹 엔진에서 볼 수 있다.

🍏 Proxy로 사용
- Proxy란 중계를 의미하며 Proxy Server는 중간 역할을 해주는 서버를 의미합니다.
- forward Proxy와 Reverse Proxy가 존재하는데 표현되는 인스턴스는 다르지만 달성하고자 하는 목표는 "시스템 보안"입니다.
· Forword Proxy
- Proxy 역할을 수행하는 nginx를 인터넷으로 라우팅 되기 전에 위치시켜(e.g. 내부망) 특정사이트 접근을 제한할 수 있습니다.

· Reverse Proxy
- Forword Proxy가 내부망에서 인터넷으로 라우팅 되기 전에 보안 처리를 했다면 Reverse Proxy는 외부에서 오는 요청에 대한 처리를 수행합니다.

- code level에서 nginx가 reverse proxy 역할을 수행해 사용자의 빈번한 요청을 막을 수 있습니다.
limit_req_zone $binary_remote_addr zone=customName:10m rate=5r/s;
server {
...
limit_req zone=customName;
limit_req_status 429; # too many request
...
}
- 위 코드는 limit_req_zone keyword를 사용해 사용자의 요청을 제한하는 모습입니다.
- $binary_remote_addr : 요청 수를 제한하는 기준을 클라이언트의 IP로 설정
- rate=5r/s : 1초에 5번의 요청만 허용
- 요청이 너무 많다면 429 Error Message를 띄웁니다.

🍏 Load Balancer로 사용
- 여러 서버를 nginx에 등록해 요청을 부하분산하는 load balancing을 수행할 수 있습니다.
- nginx conf file에서 아래와 같이 설정한다면 8080, 8081로 실행되는 서버에 nginx가 요청을 부하분산하여 보냅니다.
upstream backend {
server localhost:8080;
server localhost:8081;
}
server {
...
location / {
proxy_pass http://backend;
}
...
}


- 두 서버에는 서버 내부에서 UUID를 발급해 /health 경로로 접근할 시 해당 UUID를 반환해 주는 기능을 갖고 있다. 위에서 알 수 있듯이 같은 주소로 요청했을 때, nginx에서 reverser proxy 기능을 수행해 요청을 두 서버에 나눠 보내는 것을 확인할 수 있습니다.
+ HTTPS 적용
- 80 번 port는 HTTP 통신을 하기 위한 Port이지만 HTTP Protocol은 plain data를 다루다 보니 보안상 이슈 있습니다.
- 웹 엔진에서 80번 port로 사이트에 접근할 경우 아래와 같이 Warning Message를 나타냅니다.

- nginx Web Server에서 certbot 사용하면 HTTPS 통신 설정을 쉽게 구현할 수 있습니다.
# snap 패키지 관리자를 사용해서 certbot을 설치하는 명령
# snap 패키지는 보안상의 이유로 샌드박스(Sandbox) 환경에서 동작하지만, --classic을 붙이면 일반적인 리눅스 패키지처럼 자유롭게 실행
$ sudo snap install --classic certbot
# ln -s -> 심볼릭 링크를 만드는 명령어
# 해석: certbot을 실행할 때 certbot 명령어가 /snap/bin/certbot을 자동으로 참조하도록 링크를 생성하는 과정
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
# 등록한 도메인 주소에 HTTPS 적용
$ sudo certbot --nginx -d <도메인 주소>
- certbot을 사용해 HTTPS 통신 설정을 했다면 아래와 같은 모습으로 nginx.conf file이 변경되는 것을 확인할 수 있습니다.
server {
server_name wkdotueksnvicla.p-e.kr;
location / {
root /usr/share/nginx/nginx-frontend-react/dist;
index index.html index.htm;
}
listen 443 ssl;
...
}
- 기본 설정과 다르게 80번 port가 아닌 ssl 보안이 적용된 HTTPS port인 443으로 port 번호가 변경된 것을 확인할 수 있습니다.
🍏 자주 사용하는 명령어
# nginx 상태 확인
sudo systmectl status nginx
# nginx 실행
sudo systemctl start nginx
# nginx syntax 검사
sudo nginx -t
# nginx reload
sudo nginx -s reload
# nginx access.log 실시간 확인
/var/log/nginx/ tail -f access.log
# port number로 동작하는 process 정보 검색
lsof -i:<port number>
📚 Reference
nginx
nginx nginx ("engine x") is an HTTP web server, reverse proxy, content cache, load balancer, TCP/UDP proxy server, and mail proxy server. Originally written by Igor Sysoev and distributed under the 2-clause BSD License. Enterprise distributions, commercial
nginx.org
Certbot Instructions
Certbot Instructions
certbot.eff.org
비전공자도 이해할 수 있는 Nginx 입문/실전 강의 | JSCODE 박재성 - 인프런
JSCODE 박재성 | , 🤬 Nginx는 혼자서 공부하기 왜 이렇게 어려운거야?!비전공자로 개발을 시작해 여러 회사에서 CTO로 활동하다가, 현재는 교육자로 활동하고 있는 박재성이라고 합니다. 저도 비전
www.inflearn.com
🍎 정리
- 실무에서 파편화되어 있던 Nginx 관련 지식을 한 곳에 모아 저장하고, 이해를 높이는 것을 목표로 했습니다.
- 단순한 개념 정리를 넘어, Nginx 관련 문제를 마주했을 때 실마리를 찾을 수 있는 기반 지식을 쌓을 수 있는 시간이었습니다.
- 물론, Nginx가 제공하는 모든 기능을 다룬 것은 아니지만, 이번 정리를 통해 앞으로 필요한 자료를 더 빠르게 찾아 학습할 수 있는 기반을 다졌다고 생각합니다.! 🔥🔥🔥
- 앞으로는 Nginx를 다룰 일이 있다면 정리한 지식을 통해 빠르게 습득하고 학습하며 Nginx 활용 능력을 더욱 키워나갈 계획입니다. 🚀
'TIL' 카테고리의 다른 글
[Kotlin] List가 MutableList를 사용하는 이유 (0) | 2025.03.30 |
---|---|
원시 데이터가 DB에 존재하는 모습 (0) | 2025.03.05 |
[Tip]비즈니스 로직은 무엇인가요? (1) | 2024.09.05 |
Redis Container vs Embedded Redis 어떤 것을 선택해야 할까요? (0) | 2023.06.07 |
[Python] Multi Processing과 [Java] Multi Processing 차이 (0) | 2023.04.24 |