Nginx HTTP Server - 5. 모듈 환경설정
엔진엑스의 풍부한 기능은 모듈에서 나오고,
애플리케이션 전체가 모듈을 기반으로 작동한다.
각 모듈의 사용 여부는 컴파일 때 결정된다.
## 재작성 모듈 (rewrite 모듈)
URL 재작성을 목적으로 만든 모듈이다.
재작성 모듈을 이용해서 웹사이트의 페이지 속성을 나타내는 유용한 정보가 포함된 링크 주소를 사용할 수 있다.
예) http://website.com/article-1234-economy-strenghens.html
이런 해법으로 방문자 뿐 아니라 검색 엔진의 관심도 끌 수 있기 때문에,
URL 재작성은 검색 엔진 최적화(SEO)를 위해서 핵심적인 요소다.
클라이언트가 요청한 URI를 웹 서버가 수신하고, 해당 파일을 서비스하기 전에 URI를 재작성하는 매커니즘이다. 그런 후 재작성된 URI를 location 블럭과 비교해서 클라이언트 요청에 적용할 환경 설정을 찾아낸다.
### 정규표현식 (펄)
엔진엑스에서는 펄 호환 정규표현식(PCRE, Perl Compartible Regular Expression)을 채택했다.
정규표현식으로 캡처한 값은 로케이션 블럭의 문맥에서 사용할 수 있다.
server {
server_Name website.com;
location ~* ^/(download|files)/(.*)$ {
add_header Capture1 $1;
add_header Capture2 $2;
}
}
### 내부 요청
엔진엑스는 외부 요청(external request)와 내부 요청(internal request)를 구분해 처리한다.
외부 요청은 클라이언트로부터 직접 수신한 요청으로, 요청 URI가 location 블럭의 패턴과 비교된다.
내부 요청은 특정 지시어를 통해 엔진엑스 자체에서 발생된다.
(error_page, index, rewrite, try_files, add_before_body, add_after_body, include SSI 명령 등이다)
내부 요청에는 아래 두 종류가 있다.
- 내부 리다이렉션(internal redirects) 요청을 내부적으로 리다이렉션
- 보조 요청(sub-request) 주 요청을 보완
### 에러 페이지
server 지시어 문맥에서 error_page 속성으로 정의한다.
에러를 발생시키는 URI에 접근하면 에러 코드에 해당하는 페이지를 서비스한다.
정확하게는, 새로운 URI에 의해 새로운 요청이 시작되는 것이다.
예)
server {
server_name website.com;
root /var/www/vhosts/website.com/httpdocs/;
error_page 404 /errors/404.html; # 404 에러가 나면 /errors/404.html 을 요청한다.
location /errors/ {
alias /var/www/commons/errors/; # 문서의 위치를 변경한다.
internal; # 내부에서만 호출할 수 있다.
}
}
### 재작성
error_page 에서와 같은 방법으로 rewrite 지시어를 이용해 URI를 재작성할 때도 내부 리다이렉션이 발생한다.
예)
server {
server_name website.com;
root /var/www/vhosts/website.com/httpdocs/;
location /storage/ {
internal;
alias /var/ww/storage;
}
location /documents/ {
# document 요청을 리다이렉트 한다.
rewrite ^/documents/(.*) /storage/$1;
}
}
### 무한반복
rewrite 지시어를 잘못 사용해서 리다이렉트가 무한 반복되는 경우,
순환 횟수는 10번으로 제한되며 엔진엑스는 500 Internal Server Error 를 발생한다.
예)
server {
server_name website.com;
location /documents/ {
rewrite ^(.*)$ /documents/$1;
}
}
### 서버 측 인클루드
보조 요청은 서버 측 인클루드(SSI, Server Side Include) 모듈에서 주로 발생한다.
SSI의 목적은 서버가 클라이언트에 응답을 보내기 전 PHP나 전처리기와 유사한 방식으로 문서를 파싱하고자 하는 데 있다.
예)
HTML 파일 내에서, <!—# include file=“head.html” —> 와 같은 식으로 작성
## 조건부 구조
재작성 모듈은 if 를 포함한 여러 가지 지시어와 블럭을 제공한다.
예)
server {
if ($request_method = POST) {
}
}
### if 문법 내 연산자
값 : 데이터가 빈 문자열이나 0인 경우가 아니라면 참이다.
(1.0.1 이전에는 0으로 시작하는 문자열도 참이 아니었다)
=, != : 예) if ($request_method = POST)
~, ~*, !~, !~*
~ 앞에 오는 값이 뒤에 오는 패턴과 일치하면 참이다.
패턴은 따옴표(“)로 감싼다.
예)
$request_filename ~ “\.txt$"
정규 표현식에서 캡처한 버퍼를 사용할 수 있다.
if ($uri ~ “^/search/(.*)$”) {
set $query $1;
rewrite ^ http://google.com/search?q=$query
}
-f, !-f : 지정한 파일이 존재하는지 테스트한다.
-d, !-d : 디렉토리인지 테스트한다.
-e, !-e : 심볼릭 링크인지 테스트한다.
-x, !-x : 실행 가능한지 테스트한다.
if 블럭 안에서는 재작성 모듈의 지시어만 사용하는 것이 좋다.
## 지시어
rewrite <server, location, if>
rewrite reqexp replacement [flag];
- regexp: 패턴
- replacement: 대체할 값
- flag
- last: 이 규칙이 마지막이다. 대체된 URI로 로케이션을 검색하긴 하지만, 더 이상의 rewrite는 허용하지 않는다.
- break: 더 이상 URI 로케이션을 검색하지도 않고, 더 이상의 rewrite도 허용하지 안흔다.
- redirect: 대체된 값으로 302 Moved temporarily 응답을 보낸다.
- permanent: 대체된 값으로 301 Moved permanently 응답을 보낸다.
대체되는 URI가 http:// 로 시작하면 엔진엑스는 자동으로 redirect 플래그를 사용한다.
요청 URI는 상대적 URI이기 때문에 호스트와 프로토콜을 포함하지 않는다.
요청 URI의 값은 디코딩된 후의 모습이다.
요청 URI는 인자를 포함하지 않는다. 인자를 포함시키는 일은 엔진엑스가 자동으로 처리한다.
인자를 포함하지 않으려면 대체할 값의 마지막에 ? 를 삽입하면 된다.
break <server, location, if>
더 이상 URI를 변경하지 않는다.
return <server, location, if>
return code;
요청 처리 과정을 멈추고 지정한 상태 코드를 응답한다.
set <server, location, if>
set $variable, value;
변수를 초기화하거나 재정의한다. $uri 같은 일부 변수는 변경할 수 없다.
## SSI 모듈
서버 측 인클루드(Server Side Include)를 의미하는 SSI는 엔진엑스에 의해 처리되는 실질적인 서버 프로그래밍 언어다.
### SSI 모듈 지시어와 변수
ssi <http, server, location, if>
파일을 파싱해 SSI 명령을 찾아 실행한다.
엔진엑스는 ssi_types 지시어로 선택한 마임 타입의 파일에 대해서만 파싱한다.
기본값 off
ssi_types <http, server, location>
SSI 파싱을 적용할 파일의 마임 타입을 정의한다. text/html은 항상 포함된다.
ssi_types type1 [type2] [type3…]
예) ssi_types text/plain;
ssi_silent_errors <http, server, location>
SSI 명령에서 에러가 발생한 경우 아무 값도 출력하지 않는다. (기본값 off)
ssi 를 적용할 파일명은 .shtml 확장자를 주는 방법으로 쉽게 필터링 할 수 있다.
### SSI 문법
HTML 주석과 비슷한 형태이다.
<!—# command param1=“value1” param2=“value2” —>
## 기타 모듈
### 인덱스 모듈
### 오토인덱스 모듈 : 인덱스 파일이 없는 요청에 대해 디렉토리뷰를 보여줌
### 랜덤인덱스 모듈 : 특정 디렉토리에서 무작위로 선택한 인덱스 페이지가 리턴
### 로그 모듈
access_log <http, server, location>
접근 로그 파일의 경로와 접근 로그 항목의 포맷을 정의한다.
access_log path [format [buffe=size]] | off
접근 로그를 중지시키려면 access_log off 를 사용한다.
format 인자는 log_format 지시어로 선언한 템플릿에 대응된다.
format 인자를 사용하지 않으면 기본 포맷을 사용한다.
파일 경로 안에 변수를 사용할 수 있다.
log_format <http, server, location>
로그 항목의 포맷을 정의한다.
log_format template_name format_string;
open_log_file_cache <http, server, location>
로그 파일 기술자용 캐시 환경을 설정한다.
로그 모듈의 변수
$connection 접속 번호
$pipe 요청이 파이프라인으로 처리되고 있으면 변수는 ‘p’로 설정된다.
$time_local 로그 항목이 작성된 지역 시간
$msec 로그 시간을 마이크로초로 표시
$requrest_time 요청 처리에 걸린 전체 시간을 밀리초로 표시
$status 응답 상태 코드
$bytes_sent 클라이언트로 전송된 총 바이트 수
$body_bytes_sent 블라이언트로 전송된 응답 바디의 바이트 수
$request_length 요청 바디의 길이
## 한계치와 규제
### auth_basic 모듈
### 접근 모듈
allow|deny IP | CIDR | all
IP : 요청자의 IP
CIDR : IP 주소 범위
### 지역 제한 모듈
limit_zone
특정 지역(zone)에 대해 서버의 최대 동시 접속 수를 정의한다.
### 요청 제한 모듈
limit_request
정의된 지역에 대해 요청 수를 제한
## 컨텐츠와 인코딩
응답 인코딩 방법을 변경하거나, 헤더를 수정하거나, 응답을 완전히 새로 생성하는 등
클라이언트에 서비스하는 컨텐츠에 영향을 주는 기능을 제공한다.
### EMPTY GIF
empty_gif
메모리로부터 1x1 투명 gif 이미지를 서비스한다.
### FLV 모듈
플래시 비디오 파일의 start 인자를 자동으로 파싱한다.
### HTTP 헤더 모듈
- add_header Name Value;
응답을 추가한다. 단, 200, 204, 301, 302, 304 응답에 대해서만 추가한다.
- expires 시간값
Expires와 Cache-Control 헤더를 수정한다.
- expires 24h : 24시간으로 설정
- expires off : 헤더를 수정하지 않는다.
- expires epoch : 캐시하지 않는다. (만료일은 1970년 1월 1일로, Cache-Control엔 no-cache 로)
- max : 영구 캐시로 설정한다. (파일 만료일은 2037년 12월 31일로, Cache-Control엔 10년으로)
### 추가 모듈
add_before_body
add_after_body
HTTP 응답 바디의 전/후로 내용을 추가할 수 있다.
(기본 빌드에 포함되어 있지 않음)
### 치환 모듈
sub_filter
응답 바디에서 직접 테스트를 검색하고 치환할 수 있다.
(기본 빌드에 포함되어 있지 않음)
## Gzip 필터 모듈
응답을 전송하기 전에 Gzip 알고리즘으로 압축한다.
gzip_buffers <http, server, location>
gzip_buffers amount size;
압축된 응답을 저장할 버퍼의 수와 크기를 정한다. (기본값 4k 또는 8k)
예) gzip_buffers 4 4k
gzip_comp_level: Gzip 압축 수전 정의
gzip_disable
gzip_http_version
gzip_min_length : 응답 바디가 지정값보다 작으면 압축하지 않는다.
gzip_proxied : 프록시로 부터 수신된 응답 바디에 Gzip을 적용할 건지 여부
gzip_types : gzip 적용할 타입 (text/html은 항상 포함)
## Gzip 스태틱 모듈
Gzip 필터 매커니즘에 간단한 기능 추가.
요청 때마다 실시간으로 문서를 압축하는 대신 미리 압축해 놓은 문서를 전송할 수 있다.
(기본 빌드에 포함되어 있지 않다)
## 캐릭터셋 필터 모듈
charset <http, server, location, if>
charset encoding | off
지정한 인코딩을 content-type 헤더에 추가한다.
지정한 인코딩이 source_charset 의 인코딩과 다르면 문서를 재인코딩 한다. (기본값 off)
charset utf-8;
source_charset <http, server, location, if>
처음의 응답 인코딩 방식을 정의한다.
## 메모리 캐시 데몬 모듈
Memcached를 사용해 데이터를 캐시하고 가져온다.
## 이미지 필터 모듈
GD 그래픽스 라이브러리 (gdlib)를 통해 이미지 처리 기능을 제공한다.
(기본 빌드에 포함되지 않는다)
## 방문자 관련 모듈
클라이언트 요청 헤더를 파싱해 구분하기 위한 모듈이다.
- 브라우저 모듈 User-Agent 헤더를 파싱해 변수값을 얻어낸다.
- 맵 모듈 URI에 따라 변수값을 매핑한다.
- 지오 모듈 IP 범위로 변수값을 다르게 설정할 수 있다.
- GeoIP 모듈 외부 모듈로, 아이피와 국가 정보를 매핑할 수 있다.
- 리퍼러(Referer) 모듈
valid_referers 지시자로 Referer 헤더를 검사해 그 값에 따라 접근을 거부한다.
- Real IP 모듈
클라이언트가 프록시를 통해 웹사이트를 방문할 때,
또는 엔진엑스가 백엔드 섭로 사용되고 특정 헤더로부터 IP 주소를 추출할 때,
클라이언트 IP 주소를 X-Real-IP 헤더로 지정된 IP로 대체한다.
(기본 빌드 포함 안함)
## SSL과 보안
엔진엑스는 SSL 모듈과 시큐어 링크(Secure Link) 모듈을 함께 제공한다.
### SSL 모듈
HTTPS 지원, SSL/TLS에서의 HTTP 사용을 가능하게 한다.
인증서와 인증서 키, 매개변수를 제공함으로써 서비스할 수 있다.
(기본 빌드에 포함되어 있지 않다)
ssl <http, server>
지정한 서버에 HTTPS를 적용한다. (기본값 off)
이 지시어는 `listen 443 ssl`과 동일하다.
ssl_certificate <http, server>
PEM 인증서의 경로를 설정한다.
ss-Lcertificate_key
PEM 비밀 키 파일의 경로를 설정한다.
ssl_client_certificate
클라이언트의 PEM 인증서의 경로를 설정한다.
ssl_dhparam
디피 헬만(Diffie-Hellman) 매개변수 파일의 경로를 설정한다.
ssl_protocols
사용할 프로토콜을 지정한다.
기본값 ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers
사용할 암호를 지정한다.
ssl_prefer_server_ciphers
클라이언트 암호보다 서버 암호를 선호할 것인지를 정한다. (기본값 off)
ssl_verify_client
클라이언트가 전송한 인증서를 검증한다. (기본값 off)
ssl_verify_depth
클라이언트 인증서 체인의 검증 길이를 지정한다.
ssl_session_cache
SSL 세션용 캐시를 설정한다. (기본값 off)
ss_session_timeout
SSL 세션이 적용될 때 제한 시간을 정의한다 (기본값 5분)
## SSL 인증서의 구성
## 시큐어 링크
(HMAC 처럼) 사용자의 자원 접근을 허용하기 전에 URL에 특정 해시가 포함돼 있는지 검사한다.
=====
Nginx HTTP Server - 1. 작업환경 준비하기
Nginx HTTP Server - 4. HTTP 환경설정
Nginx HTTP Server - 5. 모듈 환경설정