TIL

Nginx Basic

친환경사과 2025. 3. 6. 15:35

🍎 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을 웹 엔진에서 볼 수 있다.

nginx default index.html file 모습


🍏 Proxy로 사용

- Proxy란 중계를 의미하며 Proxy Server는 중간 역할을 해주는 서버를 의미합니다.

- forward Proxy와 Reverse Proxy가 존재하는데 표현되는 인스턴스는 다르지만 달성하고자 하는 목표는 "시스템 보안"입니다.

 

· Forword Proxy

- Proxy 역할을 수행하는 nginx를 인터넷으로 라우팅 되기 전에 위치시켜(e.g. 내부망) 특정사이트 접근을 제한할 수 있습니다.

대략적인 forward proxy 모습

 

· Reverse Proxy

- Forword Proxy가 내부망에서 인터넷으로 라우팅 되기 전에 보안 처리를 했다면 Reverse 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 활용 능력을 더욱 키워나갈 계획입니다. 🚀