본문 바로가기

Web Server/Nginx

Nginx 개념 및 configuration

1. 개념

nginx는 apache와 같은 웹 서버중 하나로, 가벼우면서 여러 요청을 한 번에 처리할 수 있는 장점을 가진 웹 서버이다.

apache보다 동작이 단순하고 전달자 열할만 하기 때문에 동시접속에 특화되어 있다는 특싱이 있다.

 

만약 동시접속자가 1000명 이상이라면 서버를 증설하거나, nginx 환경을 권장한다고 할 정도로 성능이 좋고 다중 접속에 특화되어 있다는 것을 알 수 있다.

 

nginx는 구동 방식이 Event Driven(비동기 처리 방식)인데, 이것은 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른 요청을 처리하는 방식이다.

그러다보니 CPU와 관계없이 모든 입출력들을 전부 Event Listener로 전달하기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 보다 더 빠른 작업을 가능하게 한다.

 

 

2. 대표적인 Nginx 역할

웹 서버의 역할은 HTML, CSS, JavaScript, 미디어(이미지, 동영상 등..)와 같은 정적인 정보를 사용자(웹 브라우저)에게 서빙해주는 역할을 한다.

여기서 정적인 정보라고 하면 서버에 응답이 필요없는, 단순하게 서버가 사용자에게 서빙하면 끝이 나는 그러한 데이터를 의미한다.

어느 사이트에 들어가서 네트워크가 해제되면 응답은 할 수 없지만 그 사이트의 내용은 볼 수 있는 그러한 내용을 보여주는 데이터이다.

 

또한 리버스 프록시 역할도 한다.

기존의 포워드 프록시가 클라이언트 앞단에 요청을 처리한다면, 내부망의 서버 앞단에서 요청을 처리하는 것이다.

이 리버스 프록시의 장점은 보안에 강점이 있기 때문이다.

WAS, 웹 어플리케이션 서버는 대부분 DB서버와 연결되어 있기 때문에 WAS가 최전방에 있으면 보안에 취약해진다. (최전방에 있으면 웹 브라우저 처럼 쉽게 접근이 가능해짐)

이 때, 리버스 프록시를 두고 사용하면 웹 서버와 웹 어플리케이션 서버간 통신해서 결과를 클라이언트에 제공하는 방식으로 서비스를 하게 된다.

 

 

3. nginx.conf 설정 옵션

nginx를 개념으로만 들어도 정말 대단한 기술이라는 것을 알 것이다. 하지만 이 대단한 기술을 사용할줄 알아야 한다.

conf 파일에서 주로 사용되는 옵션은 정해져있지만, 이 옵션들이 어떤 역할을 하는지에 대해 정확하게 알아야 커스텀을 할 수 있다.

 

user  nginx; # 프로세스의 실행되는 권한. 보안상 root를 사용하지 않습니다.
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    
    upstream docker-server {
        server server:8080;
    }
    server {
        listen 80;
        server_name localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html index.htm;
            try_files $uri $uri/ /index.html =404;
        }
        location /api {
            proxy_pass         http://docker-server;
            proxy_redirect     off;
            proxy_set_header   Host $host;
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /socket {
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_pass http://docker-server;
        }
    }
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
server_tokens     off;
    keepalive_timeout  65;
    include /etc/nginx/conf.d/*.conf;
}

user

root를 사용하지 않고 일반 계정을 사용한다. nginx는 마스터 프로세스와 워커 프로세스로 동작하고, 워커 프로스세가 실질적인 웹서버의 역할을 수행하는데 user 지시어는 워커 프로세스의 권한을 지정한다. 만약 user의 값이 root로 되어 있다면 워커 프로세스를 root의 권한으로 동작하게되고, 워커 프로세스를 악의적 사용자가 제어하게 된다면 해당 머신을 루트 사용자의 권한으로 원격제어하게 되는 셈이기 때문에 보안상 위험하다. 

 

worker_process

worker_process는 워커 프로세스를 몇개 생성할 것인지를 지정하는 지시어다. 이 값이 1이라면 모든 요청을 하나의 프로세스로 실행하겠다는 의미인데, 여러개의 CPU 코어가 여러개 있는 시스템에서 이 값이 1이면 하나의 코어만으로 요청을 처리하게 되는 셈이다. 따라서 여러개의 코어가 있는 시스템이라면 이 값은 코어의 숫자만큼 지정하는 것이 바람직하다.

 

error_log

로그 레벨을 설정하는 지시어. 로그 레벨은[ debug | info | notice | warn | error | critical ] 와 같은 종류가 있다.

 

pid

nginx의 마스터 프로세스 id 정보가 저장된다.

 

events 블록

(1) worker_connections : 하나의 프로세스가 처리할 수 있는 커넥션의 숫자. 

이 값과 worker_process의 값의 조합을 계산해서 하나의 머신이 처리 할 수 있는 커넥션의 양을 산출할 수 있다. 예를들어 worker_process의 값이 4이고, worker_connections의 값이 1024라면 4 X 1024 = 4096개의 커넥션을 맺을 수 있다. 이 값을 설정하는 공식은 없고, 여러가지 자료를 참고하고, 직접 퍼포먼스를 테스트하면서 값이 조정해야 한다.

 

http 블록

(1) include : 옵션 항목을 설정해둔 파일의 경로를 지정하는데 보통 파일 확장명과 MIME 타입 목록을 지정한다.(2) default_type : 옥텟 스트림 기반의 http를 사용한다는 지시어(3) upstream 블록 : Origin 서버라고도 불리며, 여기서는 WAS, 웹 어플리케이션 서버를 의미하며 nginx는 Downstream에 해당한다고 할 수 있다. nginx와 연결한 웹 어플리케이션 서버를 지정하는데 사용됩니다. server 지시어는 연결할 웹 어플리케이션의 서버의 host주소:포트를 지정한다.

 

(4) server 블록 : 하나의 웹 사이트를 선언하는데 사용됩니다. server 블록이 여러 개이면 한 개의 머신(호스트)에 여러 웹 사이트를 서빙할 수 있다. 이러한 개념을 가상 호스트라고 한다.실제로는 호스트는 1개인데, 여러 개인것처럼 보이게 만드는 것이다.

 

(5) listen : 이 웹 사이트가 바라보는 포트를 의미한다. (Nginx는 80번이다)(6) server_name : 클라이언트가 접속하는 서버(주로 도메인). 이것과 실제로 들어온 request의 header에 명시된 값이 일치하는지 확인해서 server를 분기해준다.

 

(7) location 블록 : server 블록 안에서 특정 웹 사이트의 url을 처리하는데 사용한다. 예를 들어 https:web.com/internal과 https:web.com/external로 접근하는 요청을 다르게 처리하고 싶을 때 사용한다.

 

(8) log_format : nginx 로그 형식을 의미한다.

 

(9) sendfile : nginx에서 정적 파일을 보내도록 설정하는 옵션이다.

(10)server_tokens : 헤더에 nginx 버전을 숨기는 기능을 한다. 보안상 off로 설정을 권장한다.(11) keepalive_timeout : 접속시 커넥션 유지 시간을 지정한다.

 

 

 

 

 

 

 

 

[참고]https://deeplify.dev/server/web/nginx-configurationhttps://narup.tistory.com/209

 

 

'Web Server > Nginx' 카테고리의 다른 글

[Nginx] django에서 nginx static file serve 하기  (1) 2022.11.16
Nginx vs Apache  (0) 2022.10.25