1. Nginx?
- 클라이언트로부터 요청을 받았을 때 요청에 맞는 정적 파일을 응답해주는 HTTP Web Server로 활용.
- 웹서버의 역할은 HTML, CSS, JavaScript, 이미지와 같은 정보를 웹브라우저(Chrome, Opera, Firefox 등)에 전송하는 역할. (HTTP 프로토콜을 준수)
- Reverse Proxy Server로 활용하여 WAS 서버의 부하를 줄일 수 있는 로드 밸런서로 활용.
- 클라이언트는 가짜 서버에 요청하면, 프록시 서버(reverse proxy)가 배후 서버(reverse server)로 부터 데이터를 가져오는 역할을 한다. 프록시 서버(=Nginx), 리버스 서버(=응용프로그램 서버)
- 웹 응용프로그램 서버에 리버스 프록시(Nginx)를 두는 이유는 요청에 대한 버퍼링이 있기 때문이다. 클라이언트가 직접 App 서버에 요청하는 경우, 프로세스 1개가 응답 대기 상태가 되어야만 한다. 따라서 프록시 서버를 둠으로써 요청을 배분하는 역할을 한다.
nginx.conf 파일에서 location 지시어를 사용하여 요청을 배분한다.
- Nginx는 비동기 처리 방식(Event-Drive) 방식을 채택.
+) 비동기 : A의 요청을 B가 즉시 주지 않아도, A의 유휴시간으로 또 다른 작업 처리가 가능.
+) 동기 : A가 B에게 데이터를 요청했을 때, 이 요청에 따른 응답을 주어야만 A가 다시 작업처리가 가능.
2. Nginx 구조
- 하나의 Master Process와 다수의 Worker Process로 구성되어 실행.
- Master Process: 설정 파일을 읽고, 유효성을 검사, Worker Process를 관리.
- Worker Process: 모든 요청 처리.
- Nginx는 이벤트 기반 모델을 사용.
- Worker Process 사이에 요청을 효율적으로 분배하기 위해 OS에 의존적인 메커니즘을 사용.
- Worker Process의 개수는 설정 파일에서 정의, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정.
3. Nginx 디렉토리 구조
파란색 = 폴더, 하얀색 = 설정 파일
conf.d
- (디렉토리) nginx.conf에서 불러들일 수 있는 파일을 저장
fastcgi.conf
- (파일) FastCGI 환경설정 파일 (??FastCGI???)
nginx.conf
- 접속자 수, 동작 프로세스 수 등 퍼포먼ㄴ스에 관한 설정
sites-available
sites-enabled
- 활성화된 사이트들의 설정 파일들이 위치. 존재하지 않는 경우 디렉토리 직접 생성 가능.
4. nginx.conf 기본 환경설정
- nginx.conf 파일은 Nginx가 동작해야 할 방식을 설정 값을 통해 지정.
- 이 파일은 root 계정만 수정이 가능.
1. Core 모듈
user nginx; # (디폴트값 : www-data)
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
user
- Nginx 프로세스가 실행되는 권한
- nginx는 마스터와 워커 프로세스로 나뉜다.
- 워커 프로세스가 실질적인 웹서버 역할을 수행
- user 지시어는 워커 프로세스의 권한을 지정
- 워커 프로세스를 악의적 사용자가 제어하면 해당 머신을 최고 사용자의 권한으로 원격제어하는 것이기 때문에 위험.
worker_processes
- Nginx 프로세스 실행 가능 수
- 위에서 언급한 워커 프로세스.
- auto도 무방하지만, 명시적으로 서버에 장착되어 있는 코어 수 만큼 할당하는 것이 보통, 더 높게도 설정 가능.
pid
2. events 블록
events {
worker_connections 1024;
# multi_accept on; (디폴트값 : off)
}
- Nginx의 특징인 비동기 이벤트 처리 방식에 대한 옵션 설정.
worker_connections
- 하나의 프로세스가 처리할 수 있는 커넥션의 수를 의미
- 최대 접속자 수 = worker_processes X worker_connections
3. http 블록
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; (default=10)
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
include 옵션
- 가상 호스트 설정이나 반복되는 옵션 항목을 include를 통해 불러올 수 있다.
keepalive_timeout
- 접속시 커넥션을 몇 초동안 유지할지에 대한 설정값. 이 값이 높으면 불필요한 커넥션을 유지하기 때문에 낮은값 또는 0을 권장한다.
servers token
- Nginx의 버전을 숨길 것인가에 대한 옵션. 보안상 주석을 제거하여 설정하는 것이 좋다.
+) 보안상????? 설정하면 뭔 보안이 좋아지는가???
types_hash_max_size, server_names_hash_bucket_size
- 호스트의 도메인 이름에 대한 공간을 설정하는 것으로 이 값이 낮을 경우 많은 가상 호스트 도메인을 등록한다거나, 도메인 이름이 길 경우 bucket공간이 모자라 에러가 생길 수 있으므로 넉넉하게 설정.
4. server 블록
5. location 블록
설정 파일의 반영
sudo service nginx reload;
default.conf
- default.conf는 nginx.conf를 통해 include된 서버 설정관련 파일.
- default2.conf, default3.conf 등 여러 개의 파일을 추가하여 서버관련 설정을 추가로 만들어 포함시킬 수 있음.
vi /etc/nginx/conf.d/default.conf
vim /etc/nginx/conf.d/default.conf
nano /etc/nginx/conf.d/default.conf
# nginx 설치 후, default.conf 파일을 연다.
server {
listen 80; # http포트인 80번 포트를 통해 들어오는 요청을 해당 블록의 내용에 맞게 처리한다.
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
listen
- 해당 포트로 들어오는 요청을 해당 server{}블록의 내용에 맞게 처리하겠다는 것을 뜻함.
server_name
- 호스트 이름을 지정한다. 가상 호스트가 있는 경우 해당 호스트명을 써넣으면 된다. 만약 로컬에서 작업하고 있는 내용을 nginx를 통해 띄우려고 하는 경우에는 localhost라고 적으면 된다.
location /
- 처음 요청이 들어왔을 때 (server_name이 127.0.0.1인 경우-> 127.0.0.1로 요청이 들어왔을 때) 보여줄 페이지들이 속해있는 경로와 초기 페이지인 index를 지정해준다. url로 접속했을 경우 index,html, index.htm로 정의된 파일을 보여준다.
error_page
- 요청결과의 http 상태코드가 지정된 http 상태코드와 일치할 경우, 해당 url로 이동한다. 보통 403, 404, 502 등의 에러처리를 위해 사용한다. url 결과에 따라 이후에 나오는 location=/50x.html와 일치하면 /usr/share/nginx/html 경로에 존재하는 50x.html 파일을 보여준다.
참고한 페이지
- 링크텍스트 : 2013년 글이라 현재와 차이가 있을 수 있음.