Nginx Configuration
http://wiki.nginx.org/Configuration
– Base Rule
명령문 마다 세미 콜론을 붙이며, 묶음은 중괄호를 사용.
초는 s, 분은 m, 시간은 h의 키워드를 숫자 뒤에 붙임.
MB는 m, GB는 g 를 숫자 뒤에 붙임.
유닉스소켓의 경우 unix:/tmp/php-fpm.sock 와 같은 형식으로 표시.
구분자는 공백 또는 탭 모두 가능.
– Default Structure
기본 구조이며, http지시자 안에 기능에 따라 적절한 server 지시자를 삽입하여 사용한다. |
||
user nobody; worker_processes 4; error_log logs/error.log; pid logs/nginx.pid; events { worker_connections1024; } http { includemime.types; default_type application/octet-stream; ########################################## # performance ########################################## sendfileon; #tcp_nopushon; #keepalive_timeout0; keepalive_timeout 65; #gzip on; ########################################## server{ …. } } |
||
Directive |
Example |
Description |
user |
user nobody nobody; |
nginx가 root권한으로 실행될 때, 웹 계정 및 그룹 |
worker_processes |
worker_processes 1; worker_processes 2; |
작업 프로세스 수. (CPU 코어 수와 맞추는게 좋을 듯.) SMP를 활용하고, disk IO에 의한 지연을 감소 시킴. |
error_log |
error_log logs/error.log; error_log logs/error.log debug; error_log logs/error.log info; error_log /dev/null; |
에러 로그 설정. 로그 레벨 종류는 debug/info/notice/warn/error/crit 임. |
pid |
pid logs/nginx.pid; |
nginx 종료시 사용. |
worker_connections |
worker_connections 1024; worker_connections 4096; |
최대 접속자수(max_clients)는 아래 처럼 계산됨. max_clients = worker_processes * worker_connections (단, reverse proxy일 때에는 위 값을 4로 나눠줌. |
include |
include [file name] |
다른 설정 파일을 포함한다. |
default_type |
default_type application/octet-stream; |
conf/mime.types에 파일 확장자별 타입 목록이 있는데, 여기에 없는 확장자에 대한 타입을 설정한다. |
sendfile |
sendfile off; sendfile on; |
read(), write() 대신 커널내부에서 파일복사로 속도향상. sendfile을 설정할 경우 directio 지시자는 취소됨. |
keepalive_timeout |
keepalive_timeout 65; keepalive_timeout 0; |
클라이언트 접속 유지 시간 몇 초 후에 클라이언트 접속을 끊을지 결정. |
tcp_nopush |
tcp_nopush off; tcp_nopush on; |
소켓옵션 TCP_CORK 사용 여부. sendfile on; 일 때에만 사용 가능 HTTP Header를 한 패킷에 전송하므로서, 서버 트래픽을 감소 시킴. |
gzip |
gzip off; gzip on; |
gzip 압축 사용 여부. |
directio |
directio off; directio 4m; |
운영체제의 버퍼를 사용하지 않고, 직접 IO수행. 메모리 감소 효과. 큰 파일 전송에 유용. (O_DIRECT 플래그 이용) |
– Load Balancer & Reverse Proxy with File Cache
파일로 정적 컨텐츠를 캐싱할 때 – http://www.localhost.com:7942로 접속하면, 웹서버 127.0.0.1:9001와 127.0.0.1:9002로 로드밸런싱한다. – 만약 파일 캐싱을 사용하려면, proxy_cache…로 시작되는 음영처리된 부분의 주석을 해제하면 된다. 파일 캐시는 www/nginx/cache디렉토리에 저장된다. |
||
########################################## # Load Balancer & Reverse Proxy(using file cache) ########################################## upstream backend { server 127.0.0.1:9001 weight=2; server 127.0.0.1:9002; } # proxy_cache_path /www/nginx/cache levels=1:2 keys_zone=CACHE1:10m # inactive=24h max_size=1g; server { listen7942; server_namewww.localhost.com; location / { proxy_pass http://backend; proxy_set_header Hostwww.localhost.com; # proxy_cache CACHE1; # proxy_cache_valid 200 302 10m; # proxy_cache_valid 404 1s; # proxy_cache_use_stale error timeout invalid_header updating # http_500 http_502 http_503 http_504; } } ########################################## |
||
Directive |
Example |
Description |
upstream |
upstream [이름]{ server [아이피];[포트] weight=[숫자]; server unix:[유닉스소켓경로]; } |
로드밸런싱할 서버 목록. weight옆의 숫자는 가중치이며, 정수로 표시 |
proxy_set_header |
proxy_set_header Host $host; proxy_set_header Host www.localhost.com; proxy_set_header Connection Close; |
프록시되는(backend) 서버로 전송할 때 포함시킬 HTTP HEADER. |
proxy_cache_path |
proxy_cache_path [파일캐시경로] levels=[캐시경로레벨] keys_zone=[키존이름]:[키존용량] inactive=[유효시간] max_size=[캐시최대용량]; |
파일캐시 설정. [키존이름]은 캐시저장소 이름. [키존용량]은 키 저장 공유메모리 사용량. [유효시간]은 요청이 없을때 삭제할 시간. [캐시최대용량]은 최대 디스크사용량. |
proxy_pass |
proxy_pass http://127.0.0.1:9001; proxy_pass http://backend; proxy_pass http://unix:/tmp/php-fpm.sock; |
프록시되는(backend) 서버 설정. IP, upstream 이름, Unix 소켓중에서 선택. |
proxy_cache |
proxy_cache [키존이름] |
파일캐시를 이용할 때 사용. proxy_cache_path 에서 설정한 키존 이름. |
proxy_cache_valid |
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1s; |
프록시 되는 서버(backend)로부터의 응답에 따른 캐시의 유효 기간 설정. |
proxy_cache_use_stale |
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504; |
어떤 경우에 과거캐시를 전송할지 여부.옵션의 종류는 proxy_next_upstream와 같음.예를 들어, updating 옵션을 붙인 경우 한 스레드가 캐시를 업데이트할 때, 다른 스레드는 과거캐시를 전송한다. |
– Reverse Proxy with Memcached Server (Static Contents)
memcached로 정적 컨텐츠를 캐싱할 때 – http://mem.localhost.com:7942?abc 형식으로 호출하면 192.168.20.49:11211의 memcached 서버에서 키값이 abc인 데이타를 조회하여 클라이언트에게 전송한다. 만약 없을 경우 웹서버 127.0.0.1:9001과 127.0.0.1:9002에서 읽는다. – 아래에서 PHP FastCGI설정은 memcached에 set을 하기 위한 설정이므로 Reverse Proxy에는 필요없다. (주의) 단, 단일 memcached 서버만 사용가능하며, 클러스터링(upstream지시자)를 사용할 수 없다. 따라서 유용성이 떨어진다. |
||
########################################## # Reverse Proxywith Memcached Server) for Image Files ########################################## upstream backend { server 127.0.0.1:9001 weight=2; server 127.0.0.1:9002; } server { listen7942; server_namemem.localhost.com; location / { set $memcached_key $request_uri; memcached_pass 192.168.20.49:11211; default_type text/html; error_page 404 @fallback; } location @fallback { proxy_passhttp://backend; proxy_set_header Host www.localhost.com; } ########################################## # PHP FastCGI ########################################## location ~ \.php$ { root/www/nginx/mem.localhost.com; charsetutf8; access_loglogs/access.log; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name; include fastcgi_params; } ########################################## } ########################################## |
||
Directive |
Example |
Description |
memcached_pass |
memcached_pass 192.168.20.49:11211; |
memcached 서버 정보 |
$memcached_key |
set $memcached_key $request_uri; |
memcached 서버에 요청할 때 키로 어떤 값을 전송할지 여부 $request_uri, $uri, $args중에 하나를 설정한다. |
$request_uri |
/foo/bar.html?a=10&b=100 |
URL에서 Host이후의 전체경로. |
$uri |
/foo/bar.html |
URL에서 Host이후의 파일경로만. |
$args |
a=10&b=100 |
URL에서 파라미터만. |
– Web Server
HTML만 처리할 때 – http://www2.localhost.com:9002 로 접속하면, 기본적인 웹 서버로 동작한다. |
||
########################################## # Sub Web Server #2 ########################################## server { listen9002; server_namewww2.localhost.com; root/www/nginx/www2.localhost.com; charsetutf8; access_loglogs/access.log; error_page404/404.html; error_page500502503504/50x.html; location / { indexindex.html index.htm; } } |
||
Directive |
Example |
Description |
listen |
listen 80; listen 7942; |
서버 포트 설정 |
server_name |
server_name localhost; server_name abc.com; server_name abc.com def.com hij.com; |
가상 호스트용 (HTTP의 Host헤더 값과 비교) server_name_in_redirect가 on일 경우 redirect용으로 사용. |
root |
root html; root /www/nginx/html.localhost.com |
웹 디렉토리를 설정. |
charset |
charset koi8-r; charset utf8; charset off; |
응답 헤더의 “Content-Type”에 charset을 추가. |
access_log |
access_log logs/access.log combined; access_log logs/access.log off; access_log logs/access.log [format_name] |
접속 로그 설정. |
log_format |
log_format combined; log_format [format_name] [format_ string] |
접속 로그 포맷 설정 |
error_page |
error_page 404 /404.html; error_page 500 502 503 504 /50x.html; |
오류 발생시 표시할 페이지 결정. 오른쪽 예제의 경우 404.html, 50x.html 파일 이용. |
location |
location / location ^~ /images/ location ~ \.php$ |
URI에 대해서 정규식 매칭하여 각각 다른 설정을 한다. |
index |
index index.html index.htm; |
웹 인덱스파일 설정. |
– PHP FastCGI & HTML
PHP와 HTML을 모두 처리할 때 – http://www1.localhost.com:9001에 접속하면, 확장자가 PHP로 끝나는 경우에는 PHP-FPM 서버(127.0.0.1:9000)에 요청하여 PHP FastCGI를 처리하며, 그 외는 자체적으로 처리한다. |
||
########################################## # Sub Web Server #1 & WAS ########################################## server { listen9001; server_namewww1.localhost.com; root/www/nginx/www1.localhost.com; charsetutf8; access_loglogs/access.log; error_page404/404.html; error_page500502503504/50x.html; ########################################## # for HTML ########################################## location / { indexindex.html index.htm; } ########################################## ########################################## # for PHP ########################################## location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME$document_root$fastcgi_script_name; include fastcgi_params; } ########################################## } ########################################## |
||
Directive |
Example |
Description |
fastcgi_pass |
fastcgi_pass 127.0.0.1:9000; |
IP:Port 형태의 php fast cgi 서버 접속 경로 |
fastcgi_index |
fastcgi_index index.php; |
기본 index 파일 |
fastcgi_param |
PHP-FastCGI 서버에 전송할 정보 목록. 예를 들어, “SCRIPT_FILENAME”는 파일경로를 의미. include fastcgi_params;를 하여 “conf/ fastcgi_params”을 인쿠르드 하면 편하다. |
– MP4 Streaming
http://h264.code-shop.com/trac/wiki/Mod-H264-Streaming-Nginx-Version2
MP4 Streaming Module을 이용하여 MP4 파일을 스트리밍 할 때 – http://mp4.localhost.com:7942/abc.mp4와 같이 접속하면 abc.mp4파일을 mp4 지시자에 의하여 Streaming으로 처리한다. 확장자가 mp4가 아닌 경우에는 웹서버처럼 처리한다. – http://mp4.localhost.com:7942/abc.mp4?start=10&end=30 와 같이 접속하면 10초에서 30초 사이의 영상만 출력된다. |
||
########################################## # MP4 Streaming ########################################## server { listen7942; server_namemp4.localhost.com; root/www/nginx/mp4.localhost.com; charsetutf8; access_loglogs/access.log; error_page404/404.html; error_page500502503504/50x.html; location / { indexindex.html index.htm; } location ~ \.mp4$ { mp4; } } |
||
Directive |
Example |
Description |
mp4 |
mp4; |
H246 Streaming Module을 이용하여 스트리밍한다. |
– Test
테스트를 위해, 클라이언트의 hosts 파일에 아래와 같이 등록한다. IP는 Nginx가 설치된 서버로 수정한다. |
######################################################### # Nginx TEST ######################################################### 222.231.18.61 www.localhost.com 222.231.18.61 mem.localhost.com 222.231.18.61 www1.localhost.com 222.231.18.61 www2.localhost.com 222.231.18.61 mp4.localhost.com ######################################################### |
웹 브라우저를 실행하여, 기능별로 테스트해 보자. |
||
Uses |
URL |
Description |
Load Balancer & Reverse Proxy with File Cache |
||
Reverse Proxy with Memcached |
||
WAS (PHP FastCGI) + Memcached, MSSQL |
||
Web Server |
||
MP4 Streaming |