Backend&Devops/Nginx

[Nginx] Nginx 개념 및 nginx.conf 설정

기은P 2022. 1. 6. 17:37
반응형

Nginx 개념 및 nginx.conf 설정

 

1. 개념

nginxapache와 같은 웹서버 중에 하나인데, 가벼우면서 여러 요청을 한 번에 처리할 수 있는 장점을 가진 웹서버입니다. apache보다 동작이 단순하고 전달자 역할만 하기 때문에 동시접속에 특화되어 있다는 특징이 있습니다.

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

nginx는 구동 방식이 Event Driven(비동기처리방식)인데, 이것은 요청이 들어오면 어떤 동작을 해야하는지만 알려주고 다른 요청을 처리하는 방식입니다. 그러다보니 CPU와 관계없이 모든 입출력들을 전부 Event Listener로 전달하기 때문에 흐름이 끊기지 않고 응답이 빠르게 진행되어 1개의 프로세스로 보다 더 빠른 작업을 가능하게 합니다.

 

 

 

 

2. 웹서버의 역할

 

웹 서버의 역할은 HTML, CSS, Javascript, 이미지와 같은 정적인 정보를 사용자(웹 브라우저)에게 전송해주는 역할을 합니다.

정적인 정보라고 하면 서버에 응답이 필요없는, 단순하게 서버가 사용자에게 전달하면 끝이 나는 그러한 데이터를 뜻합니다!

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

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

이 리버스 프록시는 기존의 포워드 프록시가 클라이언트 앞단에서 요청을 처리한다면, 내부망의 서버 앞단에서 요청을 처리하는데 이 리버스 프록시의 장점은 보안에 강점이 있기 때문입니다.

WAS, 웹 어플리케이션 서버는 대부분 DB서버와 연결되어 있기 때문에 WAS가 최전방에 있으면 보안에 취약해집니다.

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

 

 

 

 

3. 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;
}

  

 

1. worker_processes: 몇 개의 워커 프로세스를 생성할 것인지를 지정하는 지시어. 1이면 모든 요청을 하나의 프로세스로 실행하겠다는 뜻으로, CPU 멀티코어 시스템에서 1이면 하나의 코어만으로 요청을 처리하는 것이 됩니다. 보통 auto로 놓는 경우가 많습니다.

2. error_log: 로그 레벨을 설정하는 지시어. 로그레벨은 [ debug | info | notice | warn | error | crit ] 같은 종류가 있습니다.

3. pid: nginx의 마스터 프로세스 id정보가 저장됩니다.

 

 

events 블록

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

 

 

http 블록

5. include: 옵션 항목을 설정해둔 파일의 경로를 지정하는데 보통 파일 확장명과 MIME 타입 목록을 지정합니다.

6. default_type: 옥텟 스트림 기반의 http를 사용한다는 지시어

7. upstream 블록: orgin 서버라고도 하는데, 여기서는 WAS, 웹 어플리케이션 서버를 의미하며 nginxdownstream에 해당한다고 할 수 있습니다. nginx와 연결한 웹 어플리케이션 서버를 지정하는데 사용됩니다. 하위에 있는 server 지시어는 연결할 웹 어플리케이션 서버의 host주소:포트를 지정합니다.

 

 

8. server 블록: 하나의 웹 사이트를 선언하는데 사용됩니다. server 블록이 여러 개이면 한 개의 머신(호스트)에 여러 웹사이트를 서빙할 수 있습니다. 이러한 개념을 가상 호스트라고 합니다.

실제로는 호스트는 1개인데, 여러 개 인것처럼 보이게 만드는 것이죠.

9. listen: 이 웹 사이트가 바라보는 포트를 의미합니다.

10. server_name: 클라이언트가 접속하는 서버(주로 도메인). 이것과 실제로 들어온 requestheader에 명시된 값이 일치하는지 확인해서 server를 분기해줍니다.

 

 

11. location 블록: server 블록 안에서 특정 웹 사이트의 url을 처리하는데 사용합니다. 예를 들어 https://web.com/internalhttps://web.com/external로 접근하는 요청을 다르게 처리하고 싶을 때 사용합니다. 내부의 root는 웹사이트가 바라보는 root 폴더의 경로를 의미합니다.

12. sendfile:

13. server_tokens: 헤더에 nginx버전을 숨기는 기능을 합니다. 보안상 off로 설정을 권장합니다.

14. keepalive_timeout: 접속시 커넥션 유지 시간을 지정합니다.

 

 

 

반응형