Skip to content

nginx 연결 한도 상향 - #1223

Merged
m-a-king merged 2 commits into
devfrom
infra/1218-nginx-conn-limit
Oct 15, 2026
Merged

m-a-king merged 2 commits into
devfrom
infra/1218-nginx-conn-limit

Conversation

@m-a-king

Copy link
Copy Markdown
Collaborator

한눈에

core 서버 nginx 의 동시 연결 한도를 올리고 연결 수를 수집함

  • 이전: nginx 가 운영체제 패키지 기본값으로 연결을 최대 1,536개까지만 받음
    • 실시간 알림(SSE) 사용자 한 명이 연결 2개를 씀
    • 결과: 앱을 켠 동시 사용자 약 700명에서 모든 요청이 실패함
  • 배포가 nginx 기본 설정 파일도 덮어쓰게 함
    • 워커 하나당 연결 4,096개, 열 수 있는 파일 8,192개
  • nginx 연결 수를 Grafana 로 보냄
  • 머지하면 dev 자동 배포, prod 는 다음 승격 때 반영

Situation

착수 후 확인

  • nginx 연결 한도 상향 #1218
  • prod·dev 서버의 nginx 기본 설정은 패키지 원본 그대로
    • 파일 해시가 패키지 기록과 같음. 손으로 고친 흔적 없음
  • 지금까지 연결 부족 로그는 0건
  • 워커 프로세스가 열 수 있는 파일 수가 1024
    • 원인: systemd 가 nginx 에 따로 한도를 주지 않아 기본 soft 한도 1024 를 받음
    • 결과: worker_connections 만 올리면 1024 에서 막힘

Task

nginx 연결 한도 상향과 사용량 수집

Action

nginx 기본 설정 파일을 repo 정본으로 관리

선택지 장점 비용
기본 설정 파일 전체를 repo 가 소유 (채택) 리뷰되는 정본 하나. 기존 백업·검증·롤백 흐름 재사용 패키지가 기본 파일을 바꿔도 반영 안 됨
서버에서 sed 로 수정 파일 소유 없음 서버 상태가 리뷰되지 않음. 패키지 기본 문구가 바뀌면 조용히 어긋남
modules-enabled 에 include 추가 기본 파일 그대로 events 블록은 한 번만 올 수 있어 worker_connections 를 못 넣음
  • 패키지 원본에서 바꾼 줄은 셋
    • worker_connections 768 에서 4096
    • worker_rlimit_nofile 8192 추가
    • 127.0.0.1:9112 의 연결 상태 페이지(stub_status) 추가
  • 연결 상태 페이지를 사이트 파일이 아니라 기본 설정에 둠
    • 원인: 배포가 sites-enabled 의 다른 파일을 지움
  • 배포가 사이트 설정과 함께 백업하고 nginx -t 실패 시 둘 다 되돌림
  • CI 에 기본 설정 문법 검증 추가
    • 파일은 infra/nginx/main/ 아래에 둠
    • 원인: 기존 검증이 infra/nginx/*.conf 를 사이트 조각으로 감싸 검사함

값 산정

  • 4096 은 연결이 워커 하나에 몰려도 SSE 약 2,000명을 받는 값
    • 원인: 한도는 워커마다 따로 걸리고 리눅스는 연결을 한 워커에 몰아주는 경향이 있음
  • 미리 잡는 메모리는 워커당 약 2MB
  • 열 수 있는 파일 수는 연결당 1개에 로그 파일 등을 더해 2배

연결 수 exporter 컨테이너 추가

  • nginx-prometheus-exporter 1.5.3 을 서버 런타임 프로비저닝 스크립트가 띄움
  • host 네트워크로 띄우고 127.0.0.1 에서만 받음
선택지 장점 비용
host 네트워크 (채택) DB 서버 exporter 2개와 같은 방식 컨테이너가 서버 네트워크를 그대로 씀
bridge 네트워크와 docker 게이트웨이 IP 의 상태 페이지 네트워크 격리 부팅 때 docker0 보다 nginx 가 먼저 뜨면 bind 실패로 nginx 전체가 못 뜸
  • 서비스 라벨은 piki-nginx
    • 원인: piki-core 로 붙이면 앱이 죽어도 대시보드의 core 생존 표시가 1 로 남음
  • 이미지와 인자가 같으면 다시 띄우지 않음

Result

dev 서버 수동 적용

  • 서버의 기본 설정을 이 파일로 바꾸고 reload, exporter 를 띄움
    • 다음 dev 배포가 같은 내용을 정식으로 덮어씀
항목 이전 이후
워커가 열 수 있는 파일 1024 8192
worker_connections 768 4096
nginx 지표 시계열 없음 62개 (서버당)
exporter 메모리 없음 2.5MiB
  • 외부 API 응답 정상 (인증 필요 401, 문서 200, actuator 차단 403)
  • Grafana 에 up{job="piki-nginx"} 1 과 활성 연결 수 들어옴
  • 위험: 패키지 업데이트가 nginx 기본 설정 파일을 바꾸면 자동 업데이트가 그 패키지를 건너뛸 수 있음
    • Ubuntu 보안 업데이트가 이 파일을 바꾸는 경우는 드묾
  • 위험: 연결 상태 페이지의 활성 연결 수는 클라이언트 쪽만 셈
    • 앱 쪽 연결은 빠짐. 실제 사용량은 약 2배

후속

  • 한눈 대시보드에 nginx 연결 수 패널 추가 (별도 PR)
  • infra 포트 정본의 예약 포트에 9112·9113 추가

연관 이슈

- nginx 기본 설정(nginx.conf)을 repo 정본으로 추가하고 배포가 덮어씀
  - worker_connections 768 에서 4096 으로 상향
  - worker_rlimit_nofile 8192 추가
    - 원인: systemd 기본 soft 한도 1024 가 워커당 연결 수를 막음
  - 127.0.0.1:9112 에 stub_status 추가
  - 대안: 서버에서 sed 로 기본 파일 수정
    - 기각: 서버 상태가 리뷰되지 않음. 패키지 기본 문구가 바뀌면 조용히 어긋남
  - 대안: modules-enabled 에 include 추가
    - 기각: events 블록은 한 번만 올 수 있어 worker_connections 를 못 넣음
- 사이트 설정과 같이 백업하고 nginx -t 실패 시 둘 다 되돌림
- CI 에 기본 설정 문법 검증 추가
  - 기본 설정은 infra/nginx/main/ 아래에 둠
    - 원인: 기존 검증이 infra/nginx/*.conf 를 사이트 조각으로 감싸 검사함
- provision-runtime.sh 에 nginx-prometheus-exporter 1.5.3 컨테이너 추가
  - 서비스 라벨 piki-nginx
    - 원인: piki-core 로 붙이면 앱이 죽어도 up{job="piki-core"} 가 1 로 남음
  - host 네트워크와 127.0.0.1 listen
    - 대안: bridge 네트워크와 docker 게이트웨이 IP 의 stub_status
      - 기각: 부팅 때 docker0 보다 nginx 가 먼저 뜨면 bind 실패로 nginx 전체가 못 뜸
  - 이미지와 인자가 같으면 다시 띄우지 않음
@m-a-king m-a-king added the infra 운영 환경 (IaC·클라우드 리소스·secret·배포 workflow) label Oct 15, 2026
@m-a-king m-a-king linked an issue Oct 15, 2026 that may be closed by this pull request
@m-a-king m-a-king self-assigned this Oct 15, 2026
@github-actions

Copy link
Copy Markdown

Discord 스레드 연동용 메타데이터입니다. discord-pr-bot 워크플로가 자동 생성하며, 수정·삭제하면 PR 과 Discord 알림 연동이 끊깁니다.

@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Repository: TeamPiKi/core/.coderabbit.yml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: e7b57e6c-f2cb-4c4a-a705-5c85789d1454
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@m-a-king
m-a-king merged commit a074ac9 into dev Oct 15, 2026
5 checks passed
@m-a-king
m-a-king deleted the infra/1218-nginx-conn-limit branch October 15, 2026 07:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

infra 운영 환경 (IaC·클라우드 리소스·secret·배포 workflow)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

nginx 연결 한도 상향

1 participant