(base) root@ubuntu:/etc/nginx/sites-available# ls /etc/nginx/sites-enabled/
default mysite
현재 활성화된 설정을 우선 찾는다.
설정 적용 후, nginx -t 로 문법 검사
sudo systemctl restart nginx
sudo systemctl status nginx.service
journalctl -xeu nginx.service
수정 후 재시작, 안되면 로그 분석
가장 빈번한 오류는 nginx 가 포트를 다 받기 때문에 fastapi 와 같은 추가 서비스의 경우 다른 포트로 서비스를 해야 한다는 것이다.
이 때, 세밀한 컨트롤의 위해 특정포트의 http로 접속되는 경우 https로 넘겨주지 않으면 nGinX에서 403에러가 나오는데 server{ 설정을 새로 해도 오류가 난다. 이 때의 핸들링 방법은 [중급편]책에서 볼 수 있겠다.

- Nginx는 80(HTTP)과 443(HTTPS) 포트를 기본적으로 점유합니다.
- 추가 서비스(예: FastAPI)가 같은 포트를 사용하려고 하면 바인딩 실패가 발생합니다.
해결 전략:
- 추가 서비스는 다른 포트(8001, 8002 등)에서 실행
- Nginx를 리버스 프록시로 설정하여 요청을 적절한 서비스로 전달
실제 적용 예시:
- WordPress: 80/443 포트
- FastAPI: 8001 포트
- 다른 마이크로서비스: 8002, 8003 포트
Nginx의 역할:
- 모든 들어오는 요청을 중앙에서 관리
- 각 서비스를 적절한 포트/경로로 라우팅
- SSL 종료 (HTTPS 처리)
- 로드 밸런싱 및 보안 계층 제공
주요 요약
- NGINX를 1000만 명 동시 접속 서비스에 맞추려면, 단일 인스턴스 튜닝 또는 클러스터 설정이 필요하며, 이는 복잡한 작업입니다.
- 연구에 따르면 단일 NGINX 인스턴스는 적절한 하드웨어에서 수십만 연결을 처리할 수 있지만, 1000만 연결에는 여러 인스턴스와 로드 밸런서가 필요할 가능성이 높습니다.
- 중앙 관리, 라우팅, SSL 종료, 로드 밸런싱, 보안 계층 제공을 위해 NGINX를 최적화하려면 작업자 프로세스, 연결 수, 파일 디스크립터 한계를 조정해야 합니다.
- 예상치 못한 점: 단일 서버로 1000만 연결을 처리하려면 매우 고성능 하드웨어가 필요하며, 실제로는 클러스터가 더 현실적입니다.
NGINX 설정 방법
개요
1000만 명 동시 접속을 처리하려면 NGINX를 단일 인스턴스로 튜닝하거나, 여러 인스턴스를 클러스터로 구성하고 로드 밸런서를 추가해야 합니다. 이는 서비스의 중앙 관리, 적절한 포트/경로 라우팅, SSL 종료, 로드 밸런싱, 보안 계층 제공을 모두 지원해야 합니다. 복잡한 작업이므로 하드웨어와 트래픽 패턴에 따라 조정이 필요합니다.
단일 NGINX 인스턴스 튜닝
- 작업자 프로세스 설정: CPU 코어 수에 따라
worker_processes
를 설정하세요. 예를 들어, 32코어 서버라면worker_processes 32;
로 설정. - 연결 수 조정:
worker_connections
를 설정해 총 연결 수(작업자 프로세스 ×worker_connections
)가 1000만 이상이 되도록 합니다. 예: 32코어에worker_connections 312500;
으로 설정하면 1,000,000 연결 가능. - 시스템 리소스 확보: 파일 디스크립터 한계를 늘려야 합니다.
ulimit -n
을 적어도worker_connections
값 이상으로, 시스템의fs.file-max
를 총 연결 수에 맞게 설정하세요. - 성능 최적화:
sendfile on;
,tcp_nopush on;
,keepalive_timeouts 60;
등으로 성능을 개선하세요.
클러스터 설정 (권장)
- 여러 NGINX 인스턴스를 설정하고, 각 인스턴스를 위와 같이 튜닝하세요.
- 로드 밸런서(예: NGINX 또는 HAProxy)를 추가해 트래픽을 분산시키세요. 이는 고가용성과 확장성을 보장합니다.
- 예: 7개 NGINX 서버, 각 서버가 약 142,857 연결을 처리하도록 설정하면 총 1,000,000 연결 가능.
SSL 종료 및 보안
- 각 NGINX 서버에서 SSL 종료를 처리하도록 HTTPS 설정을 구성하세요.
- 보안 계층은 NGINX의 rate limiting, access control 등을 통해 제공 가능합니다.
라우팅 및 로드 밸런싱
location
블록을 사용해 요청을 적절한 포트/경로로 라우팅하세요.- 업스트림 서버에 로드 밸런싱을 설정해 트래픽을 여러 백엔드 서비스에 분산시키세요.
이 설정은 하드웨어와 트래픽 패턴에 따라 달라질 수 있으므로, 테스트와 모니터링을 통해 최적화하세요.
상세 보고서
이 보고서는 NGINX를 1000만 명 동시 접속 서비스에 맞추기 위한 설정 방법을 상세히 다룹니다. 이는 중앙 관리, 라우팅, SSL 종료, 로드 밸런싱, 보안 계층 제공을 포함하며, 복잡한 작업임을 고려해 다양한 시나리오를 다룹니다.
배경 및 개요
NGINX는 웹 서버, 리버스 프록시, 로드 밸런서로 사용되며, 높은 성능과 확장성을 자랑합니다. 1000만 명 동시 접속은 단일 인스턴스로는 도달하기 어려운 수준으로, 하드웨어와 설정에 따라 다르지만, 일반적으로 클러스터 설정이 필요합니다. 연구에 따르면 단일 NGINX 인스턴스는 수십만 연결을 처리할 수 있으며, 1000만 연결에는 여러 인스턴스와 로드 밸런서가 필요할 가능성이 높습니다.
단일 인스턴스 튜닝 방법
단일 NGINX 인스턴스를 1000만 연결에 맞추려면 다음과 같은 단계가 필요합니다:
- 작업자 프로세스 설정:
worker_processes
는 CPU 코어 수에 따라 설정됩니다. 예를 들어, 32코어 서버라면worker_processes 32;
로 설정. 이는 각 코어가 요청을 효율적으로 처리하도록 합니다. - 연결 수 계산:
worker_connections
는 각 작업자 프로세스가 처리할 수 있는 최대 연결 수를 정의합니다. 총 연결 수는worker_processes × worker_connections
로 계산됩니다. 1000만 연결을 처리하려면, 예를 들어 32코어에worker_connections 312500;
으로 설정하면 1,000,000 연결 가능. 그러나 실제로는 메모리와 CPU 한계로 인해 더 높은 값이 필요할 수 있습니다. - 파일 디스크립터 한계 조정: 각 연결은 파일 디스크립터를 사용하므로, 시스템의
ulimit -n
과fs.file-max
를 늘려야 합니다. 예:ulimit -n 312500;
으로 설정하고,sysctl -w fs.file-max=2000000
로 시스템 한계를 조정. - 성능 최적화 파라미터: 추가적으로
sendfile on;
,tcp_nopush on;
,tcp_nodelay on;
,keepalive_timeouts 60;
등으로 성능을 개선할 수 있습니다. 이는 디스크 I/O와 네트워크 지연을 줄이는 데 도움을 줍니다.
클러스터 설정 및 로드 밸런싱
단일 인스턴스가 한계에 도달할 경우, 여러 NGINX 인스턴스를 클러스터로 구성하고 로드 밸런서를 추가하는 것이 현실적입니다. 예를 들어:
- 인스턴스 수 계산: 각 인스턴스가 약 160,000 연결을 처리할 수 있다고 가정하면, 1000만 연결을 위해 약 63개 인스턴스가 필요합니다. 더 현실적으로, 7개 인스턴스에 각 142,857 연결을 분배.
- 로드 밸런서 설정: 로드 밸런서는 트래픽을 NGINX 인스턴스에 분산시키며, NGINX 자체를 로드 밸런서로 사용하거나 HAProxy 같은 도구를 사용할 수 있습니다. 예: NGINX 로드 밸런서 설정은
upstream backend { server server1; server server2; ... }
와 같이 구성. - 고가용성: 여러 로드 밸런서 인스턴스를 설정해 단일 실패 지점을 방지하세요. 이는 DNS 라운드 로빈이나 keepalived를 통해 가능합니다.
중앙 관리 및 라우팅
질문에서 강조된 “모든 들어오는 요청을 중앙에서 관리”는 로드 밸런서가 트래픽을 분산시키는 역할을 함을 의미합니다. 각 NGINX 서버는 location
블록을 통해 요청을 적절한 포트/경로로 라우팅하며, 예를 들어:
server {
listen 443 ssl;
server_name example.com;
location /api/ {
proxy_pass http://backend_api;
}
location /static/ {
proxy_pass http://backend_static;
}
}
이는 백엔드 서비스로 요청을 라우팅하며, proxy_pass
는 로드 밸런싱을 통해 여러 서버에 트래픽을 분산시킵니다.
SSL 종료 및 보안 계층
SSL 종료는 각 NGINX 서버에서 처리되며, HTTPS 설정을 통해 SSL/TLS를 활성화합니다. 예:
server {
listen 443 ssl;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
...
}
보안 계층은 NGINX의 rate limiting(limit_conn_zone
, limit_req_zone
), access control, DDoS 방어 등을 통해 제공됩니다. 이는 소규모 DDoS 공격을 늦출 수 있지만, 대규모 공격에는 추가 방어 도구가 필요할 수 있습니다.
예상 연결 수와 하드웨어 요구사항
각 연결은 약 4KB의 메모리를 사용한다고 가정하면, 1000만 연결은 약 40GB의 메모리가 필요합니다. 이는 단일 서버로 처리하기 어렵기 때문에, 클러스터 설정이 더 현실적입니다. 예를 들어, 7개 서버에 분배하면 각 서버는 약 5.7GB 메모리만 필요.
테이블: NGINX 튜닝 파라미터 예시
파라미터 | 설정 값 예시 | 설명 |
---|---|---|
worker_processes | 32 | CPU 코어 수에 따라 설정 |
worker_connections | 312500 | 각 작업자 프로세스가 처리할 최대 연결 수 |
worker_rlimit_nofile | 312500 | 파일 디스크립터 한계 |
keepalive_timeouts | 60 | 연결 유지 시간, 성능 최적화 |
sendfile | on | 디스크 I/O 최적화 |
결론
단일 NGINX 인스턴스로 1000만 연결을 처리하려면 고성능 하드웨어(32코어 이상, 40GB+ 메모리)가 필요하며, 현실적으로는 클러스터 설정이 더 적합합니다. 로드 밸런서를 통해 중앙 관리와 트래픽 분산을 보장하며, 각 NGINX 서버는 SSL 종료, 라우팅, 로드 밸런싱, 보안 계층을 처리합니다. 설정은 테스트와 모니터링을 통해 최적화해야 합니다.
주요 인용
- NGINX tuning for best performance
- Any experience with Nginx as load balancer traffic handling?
- ubuntu – Nginx 10k concurrent connections
- C10k problem – Wikipedia
- Nginx architecture and why can Nginx handle thousands of requests concurrently?
- How To Limit Number of Connections (Requests) in NGINX
- How to fix NGINX : worker connections are not enough
- reverse proxy – What happens to the 513th concurrent request to nginx?
- Tuning NGINX for Better Performance
—>
한 동안 블로그 포스트에 SEO 분석 결과도 함께 넣기로 했다. 요스트의 가이드가 절대적이진 않지만, 바로 바로 알 수 있으니… 그리고 nginx 보다 DNS 서버 로드 벨런싱이 중요한데 서비스 성공전에는 굳이 고민 안해도 되는 문제.
- 키문구 분포: 초점 키문구를 전체 텍스트에 고르게 분포시켰습니까?
- 외부 링크: 현재 페이지에 외부 링크가 보이지 않습니다.. 추가하기!
- 내부 링크: 현재 페이지에 내부 링크가 보이지 않습니다., 내부링크 추가하기!
- 서두의 키프레이즈: 키프레이즈 또는 그 동의어가 첫 단락에 나타나지 않습니다. 주제를 즉시 명확히 하세요.
- SEO 제목의 키프레이즈: 키 구문 “nginx 설정”의 모든 단어가 SEO 제목에 표시되지 않습니다. 최상의 SEO 결과를 얻으려면, SEO 제목에 핵심 문구를 정확히 일치하게 쓰고 제목의 시작 부분에 핵심 문구를 넣습니다..
- 메타 디스크립션 길이: 메타 디스크립션이 없습니다. 검색엔진은 기본 페이지 정보를 보여주게 됩니다.. 정확한 메타 디스크립션을 추가하세요!
- 텍스트 길이: 이 글에는 60 개의 단어 가 있습니다. 최소 권장 단어수는 300 단어 입니다. 더 많은 내용을 추가하세요.
개선 (2)
- 이미지 키프레이즈: 이 페이지의 이미지에 텍스트의 주제를 반영하는 대체 속성이 없습니다. 관련 이미지의 대체 태그에 키프레이즈 또는 동의어를 추가하세요!
- 슬러그의 키프레이즈: (일부) 키프레이즈가 슬러그에 나타나지 않습니다. 변경하세요!