research:nginx
차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
research:nginx [2013/01/30 15:27] – changwoo | research:nginx [2014/10/09 21:24] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | ====== Nginx 서버 관련 조사 ====== | ||
+ | |||
+ | ===== 내 서버의 nginx.conf 파일을 조사 ===== | ||
+ | 주석을 포함한 나의 현재 nginx.conf 파일의 상태이다. | ||
+ | < | ||
+ | #user nobody; | ||
+ | worker_processes | ||
+ | |||
+ | # | ||
+ | # | ||
+ | # | ||
+ | |||
+ | #pid logs/ | ||
+ | |||
+ | events { | ||
+ | worker_connections | ||
+ | } | ||
+ | |||
+ | http { | ||
+ | include | ||
+ | default_type | ||
+ | |||
+ | # | ||
+ | # ' | ||
+ | # '" | ||
+ | |||
+ | # | ||
+ | |||
+ | sendfile | ||
+ | # | ||
+ | |||
+ | # | ||
+ | keepalive_timeout | ||
+ | |||
+ | #gzip on; | ||
+ | |||
+ | server { | ||
+ | listen | ||
+ | server_name | ||
+ | |||
+ | #charset koi8-r; | ||
+ | |||
+ | # | ||
+ | |||
+ | #location / { | ||
+ | # root html; | ||
+ | # index index.html index.htm; | ||
+ | #} | ||
+ | |||
+ | location / { | ||
+ | | ||
+ | | ||
+ | | ||
+ | } | ||
+ | |||
+ | location @dokuwiki { | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | rewrite ^/ | ||
+ | rewrite ^/(.*) / | ||
+ | } | ||
+ | |||
+ | error_page 404 /404.html; | ||
+ | |||
+ | # redirect server error pages to the static page /50x.html | ||
+ | # | ||
+ | error_page 500 502 503 504 /50x.html; | ||
+ | location = /50x.html { | ||
+ | root html; | ||
+ | } | ||
+ | |||
+ | # proxy the PHP scripts to Apache listening on 127.0.0.1: | ||
+ | # | ||
+ | #location ~ \.php$ { | ||
+ | # proxy_pass | ||
+ | #} | ||
+ | |||
+ | # pass the PHP scripts to FastCGI server listening on 127.0.0.1: | ||
+ | # | ||
+ | location ~ \.php$ { | ||
+ | #root html; | ||
+ | fastcgi_pass | ||
+ | fastcgi_index | ||
+ | fastcgi_param | ||
+ | include | ||
+ | } | ||
+ | |||
+ | # deny access to .htaccess files, if Apache' | ||
+ | # concurs with nginx' | ||
+ | # | ||
+ | location ~ /\.ht { | ||
+ | deny all; | ||
+ | } | ||
+ | |||
+ | # docuwiki | ||
+ | location ~ ^/ | ||
+ | deny all; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | # another virtual host using mix of IP-, name-, and port-based configuration | ||
+ | # | ||
+ | #server { | ||
+ | # listen | ||
+ | # listen | ||
+ | # server_name | ||
+ | |||
+ | # location / { | ||
+ | # root html; | ||
+ | # index index.html index.htm; | ||
+ | # } | ||
+ | #} | ||
+ | |||
+ | |||
+ | # HTTPS server | ||
+ | # | ||
+ | #server { | ||
+ | # listen | ||
+ | # server_name | ||
+ | |||
+ | # ssl on; | ||
+ | # ssl_certificate | ||
+ | # ssl_certificate_key | ||
+ | |||
+ | # ssl_session_timeout | ||
+ | |||
+ | # ssl_protocols | ||
+ | # ssl_ciphers | ||
+ | # ssl_prefer_server_ciphers | ||
+ | |||
+ | # location / { | ||
+ | # root html; | ||
+ | # index index.html index.htm; | ||
+ | # } | ||
+ | #} | ||
+ | |||
+ | } | ||
+ | </ | ||
+ | |||
+ | 이것들이 과연 무엇을 의미하는가? | ||
+ | 분량이 많아지긴 했지만 코드를 하나하나 잘라가면서 사용법을 파악해본다. | ||
+ | |||
+ | ===== 각 지시자(directive)에 대한 조사 ===== | ||
+ | ==== access_log ==== | ||
+ | [[http:// | ||
+ | access_log logs/ | ||
+ | 여기서 combinded는 | ||
+ | $remote_addr - $remote_user [$time_local] " | ||
+ | 로그의 예: | ||
+ | 127.0.0.1 - - [02/ | ||
+ | * [[http:// | ||
+ | |||
+ | ==== charset ==== | ||
+ | [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== default_type ==== | ||
+ | [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== deny ==== | ||
+ | [[http:// | ||
+ | 사용 예: | ||
+ | location / { | ||
+ | deny 192.168.1.1; | ||
+ | allow 192.168.1.0/ | ||
+ | allow 10.1.1.0/ | ||
+ | allow 2001: | ||
+ | deny all; | ||
+ | } | ||
+ | 192.168.1.1의 접속은 차단하되, | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== error_log ==== | ||
+ | [[http:// | ||
+ | 기본값은 ' | ||
+ | * [[http:// | ||
+ | |||
+ | ==== error_page ==== | ||
+ | [[http:// | ||
+ | < | ||
+ | error_page 404 /404.html; # 404 에러 코드에 대해 / | ||
+ | error_page 500 502 503 504 /50x.html; # 50X 에러 코드에 대해 | ||
+ | error_page 404 =200 /empty.gif; # 404 에러를 200(정상)으로 바꾸고 empty.gif를 리턴 | ||
+ | error_page 404 = /404.php; # php 스크립트로 error page를 대체하고 응답 코드 또한 스크립트가 전달하는 response 코드를 사용한다. | ||
+ | </ | ||
+ | * [[http:// | ||
+ | |||
+ | ==== events ==== | ||
+ | 연결 과정에 영향을 미치는 지시자들의 설정을 기록할 때 사용된다. events 블록 안에서만 설정 가능한 몇몇 지시자들이 있다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== fastcgi_index ==== | ||
+ | URI가 슬래시로 끝나는 경우 기본적으로 뒤에 붙여지는 파일 이름. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== fastcgi_param ==== | ||
+ | FastCGI 서버에 전달되는 파라미터를 설정한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== fastcgi_pass ==== | ||
+ | FastCGI 서버의 주소를 지정한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== gzip ==== | ||
+ | [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== http ==== | ||
+ | http 서버 설정에 대한 지시자를 모아 놓는다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== include ==== | ||
+ | 이 지시자가 있는 자리에 파일의 내용으로 대체한다. 대체되는 파일의 내용은 nginx의 설정 문법에 맞아야 한다. 아래의 예처럼 파일 이름에 마스크를 줄 수 있다. | ||
+ | < | ||
+ | include mime.types; | ||
+ | include vhosts/ | ||
+ | </ | ||
+ | [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== index ==== | ||
+ | 인덱스로 사용될 파일 이름. | ||
+ | [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== keepalive_timeout ==== | ||
+ | keep-alive 시간을 결정한다. 기본값은 75초. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== listen ==== | ||
+ | 서버가 수신할 주소를 결정한다. 옵션이 꽤 다양한데, | ||
+ | * [[http:// | ||
+ | |||
+ | ==== location ==== | ||
+ | 요청 URI에 관련된 설정이 이루어진다. 매칭은 정규화된 URI 문자열로 이루어진다. 그러므로 URI내부에 %XX 와 같은 인코딩 문자열 및 상대 경로, 이중 슬래시 등은 제거된 상태에서 매칭이 시작된다. 규칙은 접두사나 정규식으로 지정할 수 있는데, 정규식을 사용하기 위해서는 ' | ||
+ | |||
+ | location이 요청 경로를 찾는 과정은 다음과 같다. 우선 접두어를 기준으로 가장 상세하게 경로를 기술한 부분을 찾는다. 그리고 설정 파일에 기록된 순서대로 정규식에 대해 경로를 검사한다. 정규식이 매칭되지 않는다면 접두어 기준으로 가장 상세하게 기술된 부분이 사용된다. 접두사 기준으로 규칙을 설정하는 부분에 ' | ||
+ | |||
+ | [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== log_format ==== | ||
+ | 로그 파일에 기록되는 양식을 조절한다. 기본값은 log_format combined " | ||
+ | * [[http:// | ||
+ | |||
+ | ==== pid ==== | ||
+ | main process의 id가 이 경로의 파일에 기록된다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== proxy_pass ==== | ||
+ | 프록시 서버의 경로를 기록한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== rewrite ==== | ||
+ | syntax: rewrite regex replacement [flag] | ||
+ | URI가 지정된 정규표현식 regex에 부합하게 되면, 그 URI를 지정된 다른 문장 replacement로 치환한다. rewrite는 설정 파일에 있는 순서대로 실행된다. flag는 지시자의 나머지 처리를 제어하는데 사용된다. replacement string이 ' | ||
+ | *last: 변경된 URI의 새로운 경로를 조사한 후 현재의 rewrite 규칙 적용을 마친다. | ||
+ | *break: 현재 rewrite 규칙 적용 작업을 멈춘다. | ||
+ | *redirect: 302 코드를 리턴한다. 임시 redirect를 수행한다. | ||
+ | *permanent: 301 코드와 함께 permanent redirect를 수행한다. | ||
+ | last와 break의 차이는 다음 예를 들어 명확히 설명하고자 한다. rewrite 모듈의 규칙으로 .php 파일의 경로를 치환한다고 하자. 클라이언트로부터 '/ | ||
+ | rewrite /wiki/(.*) / | ||
+ | 이 때 flag로 last를 적는다면, | ||
+ | * [[http:// | ||
+ | |||
+ | ==== root ==== | ||
+ | 요청의 루트 디렉토리를 지정한다. 서버의 디스크 중 어떤 경로를 웹에 공개할지 결정하기 위한 지시자이다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== sendfile ==== | ||
+ | [[http:// | ||
+ | sendfile() 함수의 사용 여부를 결정한다. sendfile() 함수는 두 파일 디스크립터 사이에 데이터를 복사하는 데 사용된다. 복사가 커널 내부에서 진행되므로 일반적으로 유저 공간에서 사용되는 | ||
+ | * [[http:// | ||
+ | |||
+ | ==== server ==== | ||
+ | 가상 서버를 설정하기 위한 지시자. 문서에 따르면 IP기반과 이름 기반의 가상 서버에 대한 명확한 구분은 없으며, server_name 지시자와 listen 지시자에서 설정한 주소와 포트에 따라 가상 서버가 만들어진다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== server_name ==== | ||
+ | 가상 서버의 이름을 지정한다. 서버 이름을 지정하는 방법은 여러 가지가 있다. | ||
+ | 1. 와일드카드에 의한 방법 | ||
+ | server_name example.com *.example.com www.example.*; | ||
+ | 처음 두 개의 이름은 다음과 같이 하나로 묶을 수 있다. | ||
+ | server_name .example.com | ||
+ | 2. 정규표현식에 의한 방법 | ||
+ | 틸데(~)를 앞에 붙인 문자열은 정규식으로 간주한다. | ||
+ | server_name www.example.com ~^www\d+\.example\.com$; | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl ==== | ||
+ | 서버에 ssl 기능을 활성화시킨다. 문서에 의하면 이 지시자보다는 listen의 지시자에 ssl 파라미터를 사용하기를 권장한다. 예시는 다음과 같다. | ||
+ | listen 443 ssl; | ||
+ | HTTPS 서버를 설정하는 방법은 [[http:// | ||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_certificate ==== | ||
+ | ssl 인증서 파일을 지정한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_certificate_key ==== | ||
+ | ssl 비밀 키를 지정한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_ciphers ==== | ||
+ | 암호 체계를 설정한다. 이 문자열의 포맷은 OpenSSL library에서 사용된다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_prefer_server_ciphers ==== | ||
+ | 서버의 암호화가 클라이언트의 암호화에 대해 우선하도록 한다. on/off로 조절한다. | ||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_protocols ==== | ||
+ | 지정된 규약을 활성화한다. 기본값은 ' | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== ssl_session_timeout ==== | ||
+ | 캐시에 저장된 세션 파라미터를 재사용할 시간을 설정한다. 기본은 5분이다. ' | ||
+ | * [[http:// | ||
+ | |||
+ | ==== tcp_nopush ==== | ||
+ | FreeBSD의 TCP_NOPUSH 소켓 옵션, 리눅스의 TCP_CORK 소켓 옵션을 활성화시킨다. 이 옵션은 sendfile이 사용될 때만 활성화된다. 이 옵션을 활성화 하면 리눅스 및 FreeBSD 4.* 에서 파일의 처음과 응답 헤더를 한 패킷에 보낸다. 그리고 파일을 전체 패킷에 담아 보낸다. | ||
+ | |||
+ | TCP_CORK 소켓 옵션에 대해서는 Manpage나 [[http:// | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== try_files ==== | ||
+ | 문법: try_files file ... uri; | ||
+ | try_files file ... =code; | ||
+ | server, location 컨텍스트 하에서 사용하며 file이 존재하는지 순서대로 검사하고 가장 처음으로 발견된 것을 요청 작업에 사용한다. | ||
+ | 어떤 file도 검색되지 않으면 uri나 code가 사용된다. uri는 named location이 사용될 수 있다. named location이란 location 후에 실제 경로가 나오는 것이 아니라 접두어 ' | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== user ==== | ||
+ | worker process를 이용하는 user와 group을 설정한다. group을 생략하면 group은 user와 같은 이름으로 설정된다. 기본값은 'user nobody nobody' | ||
+ | * [[http:// | ||
+ | |||
+ | ==== worker_connections ==== | ||
+ | 한 worker process가 최대 몇 개까지의 연결을 처리할 수 있는지를 설정한다. 기본은 512다. 이 숫자는 클라이언트와의 연결 뿐만이 아닌 프록시 서버 등등을 포함한 모든 연결을 포함한다. | ||
+ | |||
+ | * [[http:// | ||
+ | |||
+ | ==== worker_processes ==== | ||
+ | worker process의 개수를 설정한다. 숫자를 입력할 수도 있고 ' | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||