2024. 8. 3. 23:02ㆍBE/Nginx
1. Nginx란?
Nginx는 웹 서버 소프트웨어이다.
기본적인 웹 서버 기능을 제공할 뿐만 아니라, 리버스 프록시, 로드 밸런서, http 캐싱 그리고 메일 프록시 기능을 제공한다.
HTTP 프록시와 웹 서버 기능
- 정적 파일과 인덱스 파일 표현, 자동 인덱싱 기능.
- 캐싱을 통한 리버스 프록시
- 로드 밸런싱
- 고장 진단
- SSL 지원
- 캐싱을 통한 FastCGI 지원
- Name-, IP-기반 가상서버
- FLV 스트리밍
- MP4 스트리밍 모듈을 이용한 MP4 스트리밍
- 웹페이지 접근 인증
- gzip 압축
- 10000개의 동시 접속을 처리할 수 있는 능력
- URL 다시 쓰기 (URL rewriting)
- 맞춤 로깅
- 서버 사이드 기능 포함
- WebDAV
메일 프록시 기능
- SMTP, POP3, IMAP 프록시
- STARTTLS 지원
- SSL 지원
2. 탄생배경
(위 영상을 보는 것을 추천합니다.)
가. Apache와 C10K
최초의 웹 서버 NCSA HTTPd는 버그가 많았다.
이러한 버그를 해결하고 성능을 끌어올린 Apache는 1995년에 등장과 동시에 웹 서비스의 업계 표준이 되었다.
하지만 Apache에겐 C10K 문제가 있었다.
C10K 문제란 Connection이 10K 개 즉 10000개 이상 발생할 때 서버가 새로운 Connection을 생성할 수 없는 문제다.
Apache는 하나의 요청을 처리하기 위해서 하나의 프로세스를 생성한다.
많은 Connection은 많은 프로세스를 만들고, 많은 프로세스는 곧 많은 메모리를 차지하게 된다.
여기에 더해 다양한 기능을 추가할 수 있는 Apache 특유의 높은 확장성이 더해져서 CPU는 과도한 Context switching을 감당해야 했다.
1999년 세기말 인터넷 트래픽이 급증하던 시절 C10K 문제는 Apache가 가진 치명적인 문제점으로 떠올랐다.
나. Nginx 등장
2004년 apache의 문제점을 해결한 새로운 구조의 웹 서버 Nginx가 등장한다.
Nginx는 apache와 달리 많은 Connection을 유지할 수 있었다.
하나의 프로세스가 여러 Connection을 담당한다.
Nginx의 프로세스는 Connection보단 이벤트 단위로 요청을 처리한다.
Nginx의 이벤트란 서버가 클라이언트의 요청을 처리하는 동안 발생하는 다양한 상태 변화를 의미한다.
주요 이벤트로는… Connection 요청 이벤트, 읽기 이벤트, 쓰기 이벤트, 타임아웃 이벤트 등이 있다.
운영체제의 커널이 이벤트를 Queue형식으로 프로세스에게 전달한다.
이벤트들은 Queue에 담겨 프로세스가 처리할 때까지 비동기 방식으로 대기한다.
실제로 이벤트를 처리하는 프로세스를 worker proccess라고 하는데 context switch을 줄이기 위해서 보통 CPU core의 수만큼만 생성한다.
하나의 worker proccess는 하나의 이벤트를 하나의 thread로 처리해 나간다.
이에 Nginx를 비동기 이벤트 기반 구조라고 한다.
Apache의 스레드/프로세스 기반 구조와는 달리, 불필요한 프로세스가 생성되지 않기 때문에 메모리 사용량이 적고 Context switching이 적게 발생하여 CPU 효율이 높다는 장점을 가지고 있다.
하지만 nginx의 비동기 이벤트 기반 구조는 하나의 커넥션을 하나의 프로세스가 처리하는 Apache보단 확장성이 떨어질 수밖에 없는 단점도 있다.
(+Nginx는 윈도우 환경에서는 성능이 저하될 수 있다.)
참고 : https://velog.io/@cjyooong/apache-nginx
2. 활용
Nginx는 다양한 용도로 사용된다.
용도 | 설명 |
웹 서버 | 정적 파일을 제공하고, 동적 콘텐츠를 처리하며, 다양한 웹 서비스 기능을 수행합니다. |
리버스 프록시 | 클라이언트의 요청을 다른 서버로 전달하여 부하를 분산시키고, 보안을 강화합니다. |
SSL 터미네이션 | Client와 Nginx 간의 통신은 Https 통신으로 보호하고, 내부 서버와는 Http 통신을 수행함으로써 서버가 복호화하는 부담을 덜 수 있다. |
HTTP 캐싱 | 자주 요청되는 콘텐츠를 캐싱하여 성능을 향상시킵니다. |
로드 밸런서 | 여러 서버에 트래픽을 분산시켜 서버의 부하를 균형 있게 유지합니다. |
메일 프록시 | SMTP, POP3, IMAP 등의 메일 프로토콜을 지원하여 메일 서버와 클라이언트 간의 통신을 중계합니다. |
이외에도 서버를 지원하기 위한 다양한 기능을 제공하고 있다.
3. How?
현업 개발자들이 많이 사용하는 Nginx 기본 설정을 포함한 템플릿.
Nginx의 주요 설정 파일에 대하여 알아보자.
nginx.conf
conf.d/
modules-available/
modules-enabled/
sites-available/
sites-enabled/
snippets/
mime.types
가. nginx.conf
- Nginx의 주요 설정 파일.
- Nginx 서버의 전역 설정을 담당.
- 워커 프로세스 수, 로깅 옵션 및 기타 기본 설정을 지정한다.
- 서버 블록, 이벤트 처리, 애플리케이션 설정 등 서버의 전체 동작을 정의하는 설정이 포함.
Nginx는 부팅 시 자동으로 nginx.conf
파일을 읽다.
user nginx;
worker_processes auto;
error_log /var/log/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# 부팅 시 읽을 설정 파일들
include conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
user nginx;
: Nginx를 실행할 운영체제 사용자를 지정. 여기서는nginx
사용자로 Nginx를 실행한다.worker_processes auto;
: 사용할 워커 프로세스의 수를 설정.
:auto
로 설정하면, Nginx가 자동으로 현재 시스템의 CPU 코어 수에 맞게 워커 프로세스를 설정.include conf.d/*.conf;
,include /etc/nginx/sites-enabled/*.conf;
: 부팅 시 읽을 설정 파일들.
: Nginx가 자동으로 읽는 것은nginx.conf
뿐이다. 추가적으로 읽어야 할 것은nginx.conf
에 include 한다.
나. conf.d
- 추가적인 설정 파일을 포함하는 디렉터리.
- 서버 블록(
server { ... }
)이나 기타 설정을 별도의 파일로 분리하여 관리. - 모듈식 설정을 가능하게 하여, 복잡한 설정을 더 쉽게 관리할 수 있도록 한다.
#nginx.conf
...
http {
...
# 부팅 시 읽을 설정 파일들
include conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
라. modules-available, modules-enabled
modules-available
는 서버에서 사용 가능한 모든 모듈의 설정 파일을 포함한다.modules-enabled
는modules-available
중 현재 서버에서 활성화된 모듈의 설정 파일에 대한 심볼릭 링크들.
마. sites-available, sites-enabled
sites-available
는 서버에서 설정할 수 있는 모든 사이트의 설정 파일을 포함.- 각 파일은 특정 사이트의 설정을 정의.
sites-enabled
는sites-available
중 현재 서버에서 활성화된 사이트의 설정 파일에 대한 심볼릭 링크.
#nginx.conf
...
http {
...
# 부팅 시 읽을 설정 파일들
include conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
sites-available
에 설정파일을 저장하고 sites-enabled
에 심볼릭 링크를 생성하는 이유는 뭘까?
당장 사용하지 않는 설정파일을 sites-available
에서 꺼내고 넣고 하지 않아 편하기 때문이다.
sites-available
에는 당장은 모든 설정파일을 담고 사용하는 설정파일만 sites-enabled
에 심볼릭 링크를 생성한다.
nginx.conf
에서 sites-enabled
를 include 하면 심볼릭 링크가 생성된 설정파일만 읽는다.
이에 실제 파일을 옮기지 않고 심볼릭 링크만으로 설정파일을 활성화 및 비활성화할 수 있다.
다. mime.types
- 파일 확장자와 MIME 타입을 매핑하는 파일.
- 다양한 파일 유형을 올바른 MIME 타입으로 제공하여 웹 브라우저가 파일을 올바르게 표시하거나 처리할 수 있도록 한다.
# nginx.conf
http {
include /etc/nginx/mime.types;
...
}
바. snippets
- 여러 설정 파일에서 재사용할 수 있는 공통 설정 조각을 포함.
- 이를 통해 설정 파일을 간소화하고 중복을 줄일 수 있다.
사. conf.d? modules-available? modules-enabled? sites-available? sites-enabled?
뭐가 많다.
설명만 읽고선 어떻게 사용해야 할지 잘 모르겠다.
맡고 있는 역할이 다 비슷비슷하다.
그래서 찾아보니…
결국은 편한 대로 사용하면 된다.
팩트는 nginx는 nginx.conf
만 읽는다.
conf.d
? modules-available
? modules-enabled
? sites-available
? sites-enabled
? 다 일종의 룰? 컨벤션? 같은 거다.
너무 신경 쓰지 말고 nginx.conf
에 include만 잘하면 된다.
'BE > Nginx' 카테고리의 다른 글
[Nginx] HTTPS 적용 (5) | 2024.08.04 |
---|---|
[Nginx] 리버스 프록시 (0) | 2024.08.04 |