웹서버의 종류중 하나. 만들어진 이유는 2002년 아파치 C10K 이슈를 해결하기 위해서이다.
가볍고, 여러 요청을 한번에 처리할 수 있다는 장점때문에 사용량이 급등하고 있다. apache 보다 동작이 단순하고 전달자 역할만 하기 때문에, 동시접속에 특화되어있다.
위의 그림을 보면 모든 사이트들 중, 최근에는 nginx의 점유율이 다른 웹서버에 비해 높다는 것을 확인할 수 있다.
그야말로 최근들어 가장 핫한 웹서버라고 할 수 있다.
자 그럼 이제 이렇게 핫한 Nginx 에 대해 알아보자.
추가로...이 글을 쓰고나서 알게되었는데 apache도 2.4 버전부터는 event-driven방식을 지원한다고 한다. 뒤의 링크를 따라가 읽어보도록 하자 - 🙈[Web Server] 아파치 2.4와 Nginx 특징 및 비교🐵 - 결론만 냈을땐 성능은 여전히 nginx가 앞선다.
Nginx가 왜 Apache의 점유율을 따라잡았을까? 뭐가 더 좋길래?
Nginx는 아파치와 다르게 비동기 이벤트 구동에 의한 처리를 한다.
이게 무슨소리인가 하면,
위의 그림에서 볼 수 있다 싶이, 아파치는 클라이언트로부터 받은 요청을 처리할 때 새로운 프로세스 or 쓰레드를 생성해서 처리한다.
요청마다 쓰레드가 생성되므로 접속하는 사용자가 많다면, 그만큼 쓰레드가 생성되어 CPU와 메모리 자원의 소모가 커진다.
그러나 Nginx 는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성해서 사용하고, 비동기 방식으로 요청들을 동시에 처리할 수 있다. - (1)
즉, 동시 접속수가 늘어날 수록 물리 메모리가 증가하는 프로세스 기반의 apache와는 다르게 자원(cpu, mem)의 소모량이 적고 동시성을 보장할 수 있다. - (2)
그러나 프로그램의 제어가 이벤트 핸들러로 넘어왔다고 한들, 실제 데이터를 읽고 쓰는 것은 OS내의 시스템 호출 프로그램과 하드웨어 사이에서 실행되기에, 해당 처리가 길어지면(I/O 시간이 길어진다면) 결국 시스템 호출 큐에 요청이 많이 쌓여 성능이 저하될 수 있다.
그렇기에 nginx는 매우 작은 데이터를 대량으로 전송하는 서버나, 하드웨어의 r/w가 발생하지 않는 캐시 제공, 리버스 프록시 서버, 로드밸런서 등의 역할을 주로 담당하게 된다.
자 위에서 알아봤으니, 이제 Nginx를 직접 설치해서 사용해보자.
자 이제 본격적으로 설치해서 사용해보자.
개발 환경은 ec2 서버 위에서 진행했다.
nginx 를 설치하기 위해 yum 명령어를 날려보면 안되는 경우가 있다.
우선 /etc/yum.repos.d 경로로 가서 nginx.repo 파일을 만들어 주자.
내용은 다음과 같이 세팅한다.
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
그 다음에 동일한 yum 명령어를 날려서 설치하면 /etc/ 아래에 nginx 가 설치되어있을 것이다.
etc/nginx 에 들어가면 다음과 같이 구성되어있다.
(tomcat.conf, nginx_tomcat_access.log는 개인적으로 만든 것...)
여기서 설정에 사용되는 파일은 nginx.conf 그리고 conf.d 폴더안에 있는 파일들이다.
nginx 의 전체 설정을 다루는 파일이다.
nginx.conf 에서 include해서 사용할 수 있는 설정파일들을 넣어두는 폴더이다.
nginx.conf를 까보면 다음과 같이 설정이 되어있는 것을 볼 수 있다.
user nginx;
worker_processes auto;
error_log /etc/nginx/logs/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
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 /etc/nginx/logs/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/tomcat.conf;
}
내부의 코드는 다음과 같은 기능을 갖는다.
conf.d
에 정의해놓은 파일들을 적용하는데 사용된다. ( 여기서는 tomcat.conf도 include 하고 있다.)위에서 보았듯이, 우리는 이미 conf.d 폴더아래에 tomcat이라는 설정파일을 만들어서 사용하고 있다.
이는 관리가 용이하도록 하기 위함인데, 모든 설정을 nginx.conf 에 넣는다면, 해당 파일이 너무 복잡해질 것이다.
그렇기에 우리는 따로 분리해서 보기 편하도록 따로 설정해놓은 것이다.
이제 해당 파일에 들어간 옵션들을 확인해보자.
#tomcat 위치지정
upstream tomcat{
server localhost:port1;
server localhost:port2;
}
server{
listen listeningPort;
server_name analyzer1;
#로그위치 설정
access_log /etc/nginx/logs/nginx_tomcat_access.log;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
#위에서 설정한 upstream 경로 복사
proxy_pass http://tomcat;
proxy_redirect off;
charset utf-8;
}
sudo systemctl [start / stop / reload] nginx
차례로 시작, 정지, 새로 설정한 것들 반영(리로드)이다. 쉽다!
이정도면 필요한 옵션은 잘 설명 된 것 같다.
조금더 상세한 설명을 원한다면 작성자가 참조한 페이지들을 참고해보자!
여기서 말하는 비동기 방식은 A의 요청을 B가 즉시 주지 않아도, A의 유휴시간으로 또 다른 작업 처리가 가능한 방식을 말한다.
10,000개의 동시 접속을 하면 그 10000개에 드는 메모리 점유는 평균 2.5MB라고 한다..