Nginx Server 설정 및 튜닝 방법
참고
용어
HTTP
웹 서버와 웹 클라이언트가 서로 정보를 주고 받기 위한 약속(프로토콜)
Web Server ( Http Server )
- 서버 쪽에서 정보를 제공하는 소프트웨어
- 정적인 데이터를 서비스 → 적은 컴퓨팅 파워로 많은 요청을 처리할 수 있다.
Application Server
- 많은 연산을 하기 때문에 웹 서버보다 더 많은 자원을 사용한다.
[ Nginx (WebServer) ]
더 적은 자원으로 더 빠르게 데이터를 서비스 할 수 있다.
설정 파일의 역할
- nginx.conf : 메인 설정 파일.
- fcgi.conf : FastCGI 환경설정 파일
- sites-enabled : 활성화된 사이트들의 설정 파일들이 위치
- sites-available : 비활성화된 사이트들의 설정 파일들이 위치
- http 블록: 관리상의 이슈로 한번만 사용하는 것을 권장한다.
- server 블록: 하나의 웹사이트를 선언하는데 사용된다. 가상 호스팅(Virtual Host)의 개념.
- Host: 네트워크에 연결된 하나의 컴퓨터
- Virtual Host: 한대의 컴퓨터로 마치 여러대의 컴퓨터가 존재하는 것처럼 동작한다.
- include: 별도의 파일에 설정을 기록해서 설정의 그룹핑, 재활용성을 높이는 방법
http { includes sites-enabled/*; }
- location 블록: server 블록 안에 등장하면서 특정 URL을 처리하는 방법을 정의
- events 블록: 네트워크의 동작방법과 관련된 설정값을 가진다.
성능과 보안을 강화하는 환경 설정
- user: 워커 프로세스의 권한
- nginx 는 마스터 프로세스와 워커 프로세스로 동작 워커 프로세스: 실질적인 웹 서버 역할
- 워커 프로세스를 악의적 사용자가 제어하게 되면, 해당 머신을 루트 사용자의 권한으로 원격 제어하게 되는 셈이기 때문에 보안상 위험하다.
- [✓] 계정이 하는 일에 대한 대표성이 있는 이름
- [✓] shell 에 접속 제한
useradd --shell /usr/sbin/nologin www-data
- worker_process
여러개의 CPU 코어가 여러개 있는 시스템에서 이 값이 1이면 하나의 코어만으로 요청을 처리하게 되는 셈이다. 따라서 여러개의 코어가 있는 시스템이라면 이 값은 코어의 숫자만큼 지정하는 것이 바람직하다. - worker_connections
몇개의 접속을 동시에 처리할 것인가
하나의 머신이 처리할 수 있는 커넥션의 양: worker_connections 과 worker_process
ngrinder: 직접 퍼포먼스를 테스트하면서 값이 조정해야 한다. - log_not_found
존재하지 않는 파일에 대한 요청이 있을 때 404에러를 에러 로그 파일에 기록할 것인지 여부
off: 존재하지 않는 파일에 대한 에러로그 기록을 생략할 수 있다. - client_max_body_size
업로드 할 수 있는 용량의 크기 지정
기본값은 1MB, 더 많은 파일의 업로드를 허용 하려면 이 값을 늘려줘야 한다.
[ Nginx 설정 파일 ]
용어
- Document Root: URL의 루트 디렉토리에 해당하는 웹서버 상의 디렉토리
연산자
- = : 같다
- ! = : 다르다
- ~ : 정규 표현식 패턴 매칭
# php로 끝나는($) 경로로 접근하는 요청에 대해 error_log 출력
location ~ /.php$ {
error_log /var/log/opentutorials.org.php.error debug;
}
- !~ : ~의 반대
- ~* : 대소문자를 구분하지 않는 정규 표현식 패턴 매칭
- !~* : ~* 의 반대
- -f : 파일이 존재하는 지 여부를 테스트
- !-f : -f의 반대
- -d : 디렉토리가 존재하는지 테스트
- !-d : -d의 반대
- -e : 파일, 디렉토리, 심볼릭 링크 존재 여부 테스트
- !-e : e의 반대
- -x : 파일이 존재하고 실행 가능한지를 테스트
- !-x : -x의 반대
변수
- $host : 현재 요청의 호스트명. 호스트명은 일반적으로 머신이 위치하는 IP나 도메인
- $uri = document_uri : 현재 요청의 uri. 호스트명과 파라미터는 제외된다.
- $args : URL의 질의 문자열
- $arg_[PARAMETER]
- $binary_remote_addr : 바이너리 형식의 클라이언트 주소
- $body_bytes_sent : 전송된 바디의 바이트 수
- $content_length : HTTP 요청 헤더의 Content-Type과 동일
- $document_root : 현재 요청의 document root 값이 root 지시어와 동일
- $http_HEADER : http 헤더의 값을 소문자로, 대시(-)를 밑줄(_)로 변환한 값
- $scheme: HTTP의 구조로 http, https를 의미
- $server_addr: 서버주소
- $server_name: 서버 이름
- $server_port: 서버 포트
- $server_protocol: HTTP 요청 프로토콜 (HTTP/1.0 혹은 HTTP/1.1)
- $cookie_COOKIE : cookie의 값을 알아내는 데 사용하는 변수
<http://opentutorials.org:80/production/module/index.php?type=module&id=12>$host : opentutorials.org
$uri : /production/module/index.php
$args : type=module&id=12
server_addr : 115.68.24.88
server_name : localhost
server_port : 80
server_protocol : HTTP/1.1
$arg_type : module
$request_uri : /production/module/index.php?type=module&id=12
$request_filename : /usr/local/nginx/html/production/module/index.php
코어 모듈 지시어
이벤트 모듈 지시어
[ 퍼포먼스 튜닝 ]
튜닝
[ 모듈 ]
rewrite
웹 서버와 웹 브라우저는 URL 을 통해서 통신을 주고받는다. 웹 서버의 기본적인 동작: URL의 path에서 요청하는 파일을 Document Root 에서 찾아서 전달해주는 것
→ rewrite: 주어진 URL 의 규칙을 변경해서 웹 서비스를 보다 유연하게 만드는 방법
- semantic url
- 해당 URL 이 담고 있는 정보를 예측할 수 있게 한다.
- 검색엔진 - 확장자의 치환
- 리다이렉션
- 내부 리다이렉션
- 더 빠르고, 웹 브라우저에게 리다이렉션 자체를 숨길 수 있다.
location /docs/ {
rewrite ^/docs/(.*)$ /files/docs/$1;
} # 디버깅 방법
# error_log 지시자를 server나 location 블록 아래 위치시킨다.
# server 블록 아래에 두면 해당 가상 호스트 전체의 에러 메시지가 출력
# location 블록 아래에 두면, 해당 경로에 대한 에러만 로그로 출력server {
server_name opentutorials.org
error_log /var/log/opentutorials.org.error debug;
location ~ /.php$ {
error_log /var/log/opentutorials.org.php.error debug;
}
} # www 제거
if ($host ~* ^www\.(.*)){
set $host_without_www $1;
rewrite ^/(.*)$ $scheme://$host_without_www/$1 permanent;
} # favicon.ico 무시
location = /favicon.ico {
return 204;
}
upstream
FastCGI를 사용하면 전통적으로 웹 서버와 동일한 머신에서 동작하던 웹 어플리케이션을 별도의 서버로 분리할 수 있다.
- Upstream Server (Origin Server) : 여러대의 컴퓨터가 순차적으로 어떤 일을 처리할 때 어떤 서비스를 받는 서버 (Upstream Server, Downstream Server)
- Upstream Module : 부하분산, 속도 개선과 같은 역할
upstream 이름 {
[ip_hash;]
server host 주소:포트 [옵션];
.....
}# ip_hash: 같은 방문자로부터 도착한 요청은 항상 같은 업스트림 서버가 처리할 수 있게 한다.
# weight=n: 업스트림 서버의 비중
# max_fails=n: n으로 지정한 횟수만큼 실패가 일어나면 서버가 죽은 것으로 간주한다.
# fail_timeout=n: max_fails가 지정된 상태에서 이 값이 설정만큼 서버가 응답하지 않으면 죽은것으로 간주한다.
# down: 해당 서버를 사용하지 않게 지정한다. ip_hash: 지시어가 설정된 상태에서만 유효하다.
# backup: 모든 서버가 동작하지 않을 때 backup으로 표시된 서버가 사용되고, 그 전까지는 사용하지 않는다.server {
listen 80;
server_name localhost;
location ~ \.php$ {
fastcgi_pass backend;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}upstream backend {
ip_hash;
server 192.168.125.142:9000 weight=3;
server 192.168.125.143:9000;
server 192.168.125.144:9000 max_fails=5 fail_timeout=30s;
server unix:/var/run/php5-fpm.sock backup;
}