카테고리 없음

nginx 공식문서 번역 (feat. cnf 파일 변경하는 법 for docker)

ebang 2023. 7. 4. 23:00
반응형

 

참고한 Nginx 공식 문서 : http://nginx.org/en/docs/beginners_guide.html

 

Beginner’s Guide

Beginner’s Guide This guide gives a basic introduction to nginx and describes some simple tasks that can be done with it. It is supposed that nginx is already installed on the reader’s machine. If it is not, see the Installing nginx page. This guide de

nginx.org

 

🌕 nginx란

nginx는 하나의 master process와 여러 worker process로 이루어져 있다.

master process의 주요 목적은 configuration을 읽고 평가해서, worker process를 유지하는 것이다.

worker process가 실제 요청에 대해서 실질적인 processing을 진행한다.

nginx는 worker process들에게 요청을 분배하기 위해서 event-based model, OS-dependent mechanism을 도입했다.

worker process의 수는 configuration file에 정의되어 있고, 그 파일에 의해 고정되거나 가능한 CPU core의 수에 따라 맞게 조정될 수도 있다.

nginx와 그 모듈이 어떻게 작동하는 가는 configuration file에 결정되어 있다. 기본적으로, configurarion file은 nginx.conf 라고 이름 붙여지고 /usr/local/nginx/conf, /etc/nginx, or /usr/local/etc/nginx 경로에 위치한다.

 

🌕 Configuration File 구조

nginx는 configuration file에 명시된 명령(directive)들에 조절되는 모듈들로 이루어져 있다.

명령들은 simple, block으로 구분된다.

simple directive는 이름과 파라미터로 이루어져 있고, space로 구분되고 ;로 끝난다.

block directive는 끝날 때 ;대신 {} 안에 추가적인 명령들로 끝난다. {} 안에 있는 명령들은 context라고 불리고, 예시로는 events, http, server, location 이 있다.

context 가 명시되어 있지 않으면 main context 가 된다. events, http directives는 main context 내에 존재하고, server는 http내에, location은 server 내에 위치한다.

#기호 다음은 주석이다.

 

🌕 Static Content 제공하기

web server 의 임무로 image 나 HTML page를 serve out 하는 게 가장 중요하다.

HTML 파일이 있는 /data/www/ 혹은 /data/images 라는 local directory 위치에서 serve 될 것이다.

이런 것들은 configuration file을 수정해서 http block 내의 server block의 세팅을 수정하는 것들을 요구한다. (location block 2개를 수정해야하는.)

  1. /data/www directory를 만든 후 그 안에 index.html 파일을 넣어두고, /data/images 디렉토리를 만든 후 이미지를 넣어둔다.
  2. configuration file을 연다. 디폴트 configuration file은 server block의 몇 가지 예시를 가지고 있는데, 아무튼 이런 형태이다.
http {
	server {

		}
}

일반적으로 configuration file은 port로 구별되는 여러가지 server block을 포함하고 있고, 거기에서 nginx는 server name이랑 포트를 이용해서 listen하고 있다.

nginx가 어떤 server가 request 를 process할지 정했다면, nginx는 request header에 명시된 URI를 server block에 정의된 location directive와 비교해서 테스트한다.

 

location / {
    root /data/www;
}

location block은 prefix를 명시해서 request의 URI와 비교하게 된다. 매치되는 request에 대해서 URI는 그 root로 명시된 경로에 추가될 것이다. 많은 location 과 중복되어 매치되어있다면, 가장 길게 매치되는 것으로 확인하게 된다.

 

location /images/ {
    root /data;
}

/라는 URI는 위와 그 아래가 동일하지만 /images가 더 매치되는 경우, /images/로 시작하는 request를 아래 block으로 들어와서 하게 된다.

 

configuration file은 다음과 같이 생겼을 것이다.

server {
    location / {
        root /data/www;
    }

    location /images/ {
        root /data;
    }
}

여기까지 하고 나면 기존 80포트에 듣고 local machine에서 http://localhost로 접근가능한 서버의 configuration이 된 것이다.

/images/로 시작하는 request에서 URI에 해당하는 응답으로, server는 /data/images directory에서 파일을 보냈을 것이다.

/images/로 시작하지 않는 URI는 data/www directory 에서 매핑되어 찾게 될 것이다.

 

 

🌕 간단한 Proxy Server 세팅하기

roxy server를 사용하면, request를 받은 다음 proxy server로 보내고, 그들로부터 응답을 받은 후 client로 전송하게 된다.

(프록시 서버를 사용함으로써 서버의 IP를 숨기는 것이 가능하고, 캐싱이 가능하다. )

  • 프락시 서버(Proxy Server)란?

클라이언트 대신에 인터넷상의 다른 서버에 접속하는 서버를 말합니다. 클라이언트가 외부에 접근 요구를 했을 경우, 클라이언트를 대신해서 인터넷상의 다른 www서버나 FTP서버 등에 접근하는 서버를 말합니다. 따라서 프락시 서버의 password를 알아야만 인터넷 사용이 가능합니다.

 

프록시 서버 만들기

server {
    listen 8080;
    root /data/up1;

    location / {
    }
}

proxy__pass directive를 protocol, proxied server의 이름과 포트 번호를 이용해서 만든다.

 

server {
    location / {
        proxy_pass http://localhost:8080;
    }

    location /images/ {
        root /data;
    }
}

.gif, jpg, png 확장자로 끝나는 파일은 따로 처리 하기 위해 추가도 해준다.

server {
    location / {
        proxy_pass http://localhost:8080/;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

🌕 FastCGI proxying 세팅하기

nginx는 FastCGI server 에게 request를 라우팅하기 위해서 사용될 수 있다.

FastCGI server는 PHP같은 프로그래밍 언어와 다양한 프레임워크로 만들어진 어플리케이션을 실행한다.

 

  • fastCGI란?

요즘에 HTML 문서로만 되어있는 서버는 사이트를 운영할 수 없습니다. HTML 파일관리, 데이터 고속처리, 사용자가 입력한 데이터 저장 등 이러한 정적인 HTML 파일을 처리하는 웹서버만으로는 불가능하였고, 그래서 이들을 처리하기 위해 등장하게 된 것이 CGI이다.

CGI는 Common Gateway Interface의 약자로 웹서버와 외부 프로그램을 연결해주는 표준화된 프로토콜이다.

cgi는 요청할 떄마다 프로세스를 생성하고, 프로세스가 가동하면서 시스템 자원을 소비하게 된다. 그리고 동시에 많은 요청이 발생하면 프로세스가 생성되면서 서버에 부하가 발생하게 된다.

이러한 문제로, 진화된 기술인 fastCGI 기술이 생겨났다. Nginx, Apache, IIS 같은 웹서버들은 fastCGI 기술을 제공한다. 기존의 cgi가 요청마다 프로세스를 생성해서 처리했던 것과 달리, fastcgi에서는 한 프로세스가 여러개의 요청을 처리한다. 이로 인해 서버에 가해지는 부하가 줄어들게 된다.

또한 웹서버와 php 를 fastCGI로 ‘소켓 통신’하여 뒷단에 php 서버를 구축하여 분리할 수 있다. 이를 WAS(Web Application Server) 라고 한다.

  • PHP-FPM

PHP-FPM는 PHP FastCGI Process Manager의 약자로 PHP를 FastCGI 모드로 동작하도록 해준다.

fastcgi_finish_request 사용 가능 : fastcgi_finish_request() for php.    (참고)

 

(fastcgi finish request를 통해서, request 처리를 하는 동안 아무것도 못하는 것이 아니라 백그라운드로 동작할 수 잇도록 해서 시간 절약을 할 수 있다.

구현할 때는 queue와 crontab 등을 이용해서 구현해야할텐데, 대신 해준다는 점이 장점이다.

예를 들어서 동영상 인코딩이 끝날 때까지 사용자를 기다리게 하지 않을 수 있다. )

 

 

구현 방식 : proxy_pass directive 대신 fastcgi_pass directive를 사용해서 nginx configuration을 수정한다.

server {
    location / {
        fastcgi_pass  localhost:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param QUERY_STRING    $query_string;
    }

    location ~ \.(gif|jpg|png)$ {
        root /data/images;
    }
}

php에서 SCRIPT_FILENAME 파라미터는 스크립트 이름을 정하는데 사용되고, QUERY_STRING parameter 는 request 파라미터를 전달하는데 사용된다.

 

🌑 fastcgi_pass : 전달 방식

fastcgi_pass는 php-fpm과 NGINX를 연결하기 위한 인터페이스를 지정하는 것이다. 이 값은 php-fpm의 listen 설정값과 일치해야 한다. 설정값은 /etc/php5/fpm/pool.d/www.conf 에서 찾거나, 다른 위치에서 찾을 수 있다. 위의 예제에서 지정된 unix:/var/run/php5-fpm.sock는 유닉스 소켓으로 NGINX와 PHP-FPM이 같은 (컴퓨터를 의미하는) 호스트에 설치된 경우 사용한다.

(참고)

 

UNIX socket 대신 TCP 연결 사용하기.

listen = 127.0.0.1:9000 은 TCP 방식으로, 다른 위치에서도 서로 통신할 수 있도록 하는 방식이다. )

(이렇게 설정하면 server가 static image 를 제외하고는 모든 request를 localhost:9000에서 작동하는 proxy server로 FastCGI protocol 을 통해 보내도록 설정하게 된다.

 

🌑fastcgi_param : 처리하는 파일의 위치 전달

  • 처리하는 fastCGI 실행 시 php 애플리케이션에게 전달할 환경변수. (어떤 파일을 처리하는가에 대한. (사용자가 요청한 파일이 위 치하는 디렉토리) $documnet_root$fastcgi_script_name (사용자가 요청한 파일)
  • php-fpm으로 fastCGI 를 통해서 동적인 웹 컨텐츠를 처리할 수 있도록 하되, 데이터를 저장하기 위해 DB 연동이 필요하다. (php-mysql)
  • php-fpm을 구동하는 것은 Nginx이다.

 

🌕 참고 - nginx가 request를 처리하는 방식

server {
    listen      80;
    server_name example.org www.example.org;
    ...
}

server {
    listen      80;
    server_name example.net www.example.net;
    ...
}

server {
    listen      80;
    server_name example.com www.example.com;
    ...
}

80포트를 듣는 서버 3개.

request header의 ‘Host’ field에 지정된 값을 이용해서 어떤 서버가 응답을 할지 결정한다. 지정되지 않은 경우 보통은 가장 위의 서버가 default 이고, 따로 default_server로 지정가능하다

반응형