실용적인 접근을하겠습니다.
이러한 모든 한계는 하드웨어가 느리고 비용이 많이 드는 지난 세기에 하드 코딩되어 설계되었습니다. 2016 년 현재 월마트 토스터는 평균보다 더 많은 요청을 처리 할 수 있습니다.
기본 설정은 실제로 위험합니다. 웹 사이트에 수백 명의 사용자가 있다는 것은 인상적인 것이 아닙니다.
worker_process
관련 설정에 대해 설명하면서 설명하겠습니다.
로드 밸런서로서의 nginx :
- HTTP로드 밸런싱을위한 1 명의 작업자
- HTTPS로드 밸런싱을위한 코어 당 1 명의 작업자
웹 서버로서의 nginx :
이것은 까다 롭습니다.
일부 응용 프로그램 / 프레임 워크 / 미들웨어 (예 : php-fpm)는 nginx 외부에서 실행됩니다. 이 경우, 1 개의 nginx 작업자는 일반적으로 많은 처리를 수행하고 자원을 먹는 외부 응용 프로그램이므로 충분합니다.
또한 일부 응용 프로그램 / 프레임 워크 / 미들웨어는 한 번에 하나의 요청 만 처리 할 수 있으며 과부하가 발생합니다.
일반적으로, 1 명의 작업자는 항상 안전한 내기입니다.
그렇지 않으면 자신이하는 일을 알고 있다면 코어 당 한 명의 작업자를 배치 할 수 있습니다. 그 경로를 최적화로 고려하고 적절한 벤치마킹 및 테스트를 조언합니다.
worker_connections
총 연결 량은입니다 worker_process * worker_connections
. 로드 밸런서 모드에서 절반입니다.
이제 토스터 부분에 도달했습니다. 심각하게 과소 평가 된 시스템 한계가 많이 있습니다.
- ulimits는 Linux에서 프로세스 당 최대 1k 열린 파일입니다 (일부 배포판에서는 1k 소프트, 4k 하드)
- 체계적 한계는 ulimits와 거의 같습니다.
- nginx 기본값은 작업 자당 512 개의 연결입니다.
- SELinux, sysctl, supervisord가 더있을 수 있습니다 (각 distro + version은 약간 다릅니다)
1k worker_connections
안전한 기본값은 1k를 어디에나 두는 것입니다.
내부 및 알려지지 않은 대부분의 사이트보다 훨씬 높을 수 있습니다. 다른 시스템 한계에 도달하지 않을 정도로 낮습니다.
10k worker_connections
특히 공개 웹 사이트의 경우 수천 명의 클라이언트가있는 것이 매우 일반적입니다. 나는 기본값이 낮아서 다운 된 웹 사이트의 수를 세는 것을 중단했습니다.
생산에 허용되는 최소값은 10k입니다. 허용하려면 관련 시스템 제한을 늘려야합니다.
너무 높은 한도는 없습니다 (사용자가없는 한도는 아무런 영향을 미치지 않습니다). 그러나 제한이 너무 낮 으면 사용자가 거부되고 사이트가 손상되는 매우 실제적인 것입니다.
10k 이상
10k는 훌륭하고 쉽습니다.
우리는 임의의 1000kk 제한을 설정할 수는 있지만 (실제로는 한계 일뿐), 실제로는 그다지 의미가 없으며, 트래픽을 얻지 못하고 어쨌든 취할 수 없습니다.
합리적인 설정으로 10k를 고수합시다. 더 많은 서비스를 원하고 실제로 할 수있는 서비스에는 특별한 조정 및 벤치마킹이 필요합니다.
특별 시나리오 : 고급 사용법
때때로 우리는 서버에 많은 리소스가 없다는 것을 알고 있으며 우리가 할 수없는 스파이크를 기대합니다. 시도하는 것보다 사용자를 거부하는 것이 좋습니다. 이 경우 적절한 연결 제한을 설정하고 멋진 오류 메시지 및 처리를 구성하십시오.
때로는 백엔드 서버가 제대로 작동하지만 최대 부하 까지만 걸리고 더 많은 것이 남게됩니다. 서버가 충돌하는 것보다 속도가 느려집니다. 이 경우 엄격한 제한으로 대기열을 구성하고 요청이 제한 속도로 배수되는 동안 nginx가 모든 열을 버퍼링하도록하십시오.