Nginx 에 대한 최적화: 어떻게 10 만 을 돌파 하고 병발 합 니까?

worker_processes 8;

nginx 프로 세 스 수 는 cpu 수 에 따라 지정 하 는 것 을 권장 합 니 다. 일반적으로 배수 입 니 다.
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

프로 세 스 마다 cpu 를 할당 합 니 다. 8 개의 프로 세 스 를 8 개의 cpu 에 할당 합 니 다. 물론 여러 개 를 쓰 거나 하나의 프로 세 스 를 여러 cpu 에 할당 할 수 있 습 니 다.
worker_rlimit_nofile 102400;

이 명령 은 nginx 프로 세 스 가 열 린 가장 많은 파일 설명자 수 를 말 합 니 다. 이론 적 값 은 최대 열 린 파일 수 (ulimit - n) 와 nginx 프로 세 스 수 를 제외 해 야 합 니 다. 그러나 nginx 배분 요청 이 고 르 지 않 기 때문에 ulimit - n 의 값 과 일치 하 는 것 이 좋 습 니 다.
use epoll;

epoll 의 I / O 모델 을 사용 합 니 다. 이 건 말 할 필요 가 없 죠?
worker_connections 102400;

모든 프로 세 스 가 허용 하 는 최대 연결 수, 이론 적 으로 모든 nginx 서버 의 최대 연결 수 는 worker 입 니 다.processes*worker_connections。
keepalive_timeout 60;

keepalive 시간 초과.
client_header_buffer_size 4k;

클 라 이언 트 가 머리 에 있 는 버퍼 크기 를 요청 합 니 다. 이것 은 시스템 페이지 크기 에 따라 설정 할 수 있 습 니 다. 보통 요청 한 머리 크기 는 1k 를 초과 하지 않 지만 일반 시스템 페이지 는 1k 이상 이 어야 하기 때문에 페이지 크기 로 설정 합 니 다.페이지 크기 는 명령 getconf PAGESIZE 로 가 져 올 수 있 습 니 다.
open_file_cache max=102400 inactive=20s;

이것 은 파일 을 열기 위해 캐 시 를 지정 합 니 다. 기본적으로 사용 되 지 않 았 습 니 다. max 는 캐 시 수량 을 지정 합 니 다. 파일 을 여 는 것 과 일치 하 는 것 을 권장 합 니 다. inactive 는 파일 이 요청 되 지 않 은 지 얼마나 되 었 는 지 를 말 합 니 다.
open_file_cache_valid 30s;

이것 은 캐 시 를 얼마나 자주 검사 하 는 지 에 대한 유효한 정 보 를 말한다.
open_file_cache_min_uses 1;

open_file_cache 명령 의 inactive 매개 변 수 는 시간 내 에 파일 의 최소 사용 횟수 입 니 다. 이 숫자 를 초과 하면 파일 설명 자 는 캐 시 에서 열 려 있 습 니 다. 예 를 들 어 inactive 시간 내 에 한 번 도 사용 되 지 않 으 면 삭 제 됩 니 다.
커 널 매개 변수 최적화
net.ipv4.tcp_max_tw_buckets = 6000

timewait 의 수량 은 기본적으로 180000 입 니 다.
net.ipv4.ip_local_port_range = 1024    65000

시스템 이 열 수 있 는 포트 범위 입 니 다.
net.ipv4.tcp_tw_recycle = 1

timewait 빠 른 회수 사용 하기.
net.ipv4.tcp_tw_reuse = 1

오픈 재사 용.TIME - WIT sockets 를 새로운 TCP 연결 에 다시 사용 할 수 있 도록 합 니 다.
net.ipv4.tcp_syncookies = 1

SYN Cookies 를 켜 면 SYN 대기 열 이 넘 칠 때 cookies 를 사용 합 니 다.
net.core.somaxconn = 262144

웹 응용 프로그램 에서 listen 함수 의 backlog 는 기본적으로 커 널 매개 변수 인 net. core. somaxconn 을 128 로 제한 하고 nginx 가 정의 하 는 NGX 를 제공 합 니 다.LISTEN_BACKLOG 는 기본적으로 511 이기 때문에 이 값 을 조정 할 필요 가 있 습 니 다.
net.core.netdev_max_backlog = 262144

모든 네트워크 인터페이스 에서 패 킷 을 받 는 속 도 는 커 널 이 이 패 킷 을 처리 하 는 속도 보다 빠 를 때 대기 열 에 보 내 는 패 킷 의 최대 수 를 허용 합 니 다.
net.ipv4.tcp_max_orphans = 262144

시스템 에서 최대 몇 개의 TCP 소켓 이 사용자 파일 핸들 에 연결 되 지 않 습 니 다.이 숫자 를 넘 으 면 고아 연결 은 즉각 리 셋 되 고 경고 메 시 지 를 출력 한다.이 제한 은 단지 간단 한 DoS 공격 을 방지 하기 위해 서 일 뿐, 그것 에 지나치게 의존 하거나 인위적으로 이 값 을 줄 일 수 없 으 며, 이 값 을 증가 시 켜 야 한다 (메모리 가 증가 하면).
net.ipv4.tcp_max_syn_backlog = 262144

클 라 이언 트 의 확인 정 보 를 받 지 못 한 연결 요청 의 최대 값 을 기록 합 니 다.128 M 메모리 가 있 는 시스템 의 경우 부족 한 값 은 1024 이 고 작은 메모리 의 시스템 은 128 이다.
net.ipv4.tcp_timestamps = 0

시간 스탬프 는 시리 얼 번호 의 와 인 딩 을 피 할 수 있다.1Gbps 의 링크 는 반드시 이전에 사 용 했 던 시리 얼 번 호 를 만 날 것 이다.타임 스탬프 는 커 널 로 하여 금 이러한 '이상' 데이터 패 키 지 를 받 아들 이게 할 수 있다.여 기 는 꺼 야 합 니 다.
net.ipv4.tcp_synack_retries = 1

커 널 은 엔 드 연결 을 열기 위해 SYN 을 보 내 고 앞의 SYN 에 응답 하 는 ACK 를 첨부 해 야 합 니 다.세 번 의 악수 중 두 번 째 악수 라 는 것 이다.이 설정 은 커 널 이 연결 을 포기 하기 전에 SYN + ACK 패 키 지 를 보 내 는 수량 을 결정 합 니 다.
net.ipv4.tcp_syn_retries = 1

커 널 이 연결 을 포기 하기 전에 SYN 패 키 지 를 보 내 는 수량 입 니 다.
net.ipv4.tcp_fin_timeout = 1

소켓 이 이 단 에서 닫 으 라 고 요구 하면 이 매개 변 수 는 FIN - WAIT - 2 상 태 를 유지 하 는 시간 을 결정 합 니 다.엔 드 에 오류 가 발생 할 수 있 으 며 연결 을 영원히 닫 지 않 을 수 있 으 며, 심지 어 는 의외로 컴퓨터 에 있 을 수도 있다.결 성 치 는 60 초 입 니 다.2.2 커 널 의 보통 값 은 180 초 입 니 다. 이 설정 을 누 를 수 있 습 니 다. 그러나 기억 해 야 할 것 은 기계 가 가 벼 운 WEB 서버 라 하 더 라 도 대량의 소켓 으로 인해 메모리 가 넘 칠 위험 이 있 습 니 다. FIN - WAIT - 2 의 위험성 은 FIN - WAIT - 1 보다 작 습 니 다. 최대 1.5K 메모리 만 먹 을 수 있 지만 생존 기간 이 길 기 때 문 입 니 다.
net.ipv4.tcp_keepalive_time = 30

keepalive 가 시 작 될 때 TCP 가 keepalive 메 시 지 를 보 내 는 빈도 입 니 다.결 성 은 2 시간 이다.
완전한 커 널 최적화 설정
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024    65000

간단 한 nginx 최적화 프로필
user  www www;
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;
error_log  /www/log/nginx_error.log  crit;
pid        /usr/local/nginx/nginx.pid;
worker_rlimit_nofile 204800;

events
{
  use epoll;
  worker_connections 204800;
}

http
{
  include       mime.types;
  default_type  application/octet-stream;

  charset  utf-8;

  server_names_hash_bucket_size 128;
  client_header_buffer_size 2k;
  large_client_header_buffers 4 4k;
  client_max_body_size 8m;

  sendfile on;
  tcp_nopush     on;

  keepalive_timeout 60;

  fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2
                keys_zone=TEST:10m
                inactive=5m;
  fastcgi_connect_timeout 300;
  fastcgi_send_timeout 300;
  fastcgi_read_timeout 300;
  fastcgi_buffer_size 16k;
  fastcgi_buffers 16 16k;
  fastcgi_busy_buffers_size 16k;
  fastcgi_temp_file_write_size 16k;
  fastcgi_cache TEST;
  fastcgi_cache_valid 200 302 1h;
  fastcgi_cache_valid 301 1d;
  fastcgi_cache_valid any 1m;
  fastcgi_cache_min_uses 1;
  fastcgi_cache_use_stale error timeout invalid_header http_500;
  
  open_file_cache max=204800 inactive=20s;
  open_file_cache_min_uses 1;
  open_file_cache_valid 30s;
  


  tcp_nodelay on;
  
  gzip on;
  gzip_min_length  1k;
  gzip_buffers     4 16k;
  gzip_http_version 1.0;
  gzip_comp_level 2;
  gzip_types       text/plain application/x-javascript text/css application/xml;
  gzip_vary on;


  server
  {
    listen       8080;
    server_name  ad.test.com;
    index index.php index.htm;
    root  /www/html/;

    location /status
    {
        stub_status on;
    }

    location ~ .*\.(php|php5)?$
    {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fcgi.conf;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
    {
      expires      30d;
    }

    log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
    access_log  /www/log/access.log  access;
      }
}

FastCGI 에 대한 몇 가지 명령
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;

이 명령 은 FastCGI 캐 시 에 경로, 디 렉 터 리 구조 등급, 키워드 영역 저장 시간 과 비활성 삭제 시간 을 지정 합 니 다.
fastcgi_connect_timeout 300;
       FastCGI     。
fastcgi_send_timeout 300;

 
FastCGI 에 요청 을 전송 하 는 시간 초과, 이 값 은 악 수 를 두 번 마 친 후 FastCGI 에 요청 을 전송 하 는 시간 초과 입 니 다.
fastcgi_read_timeout 300;

FastCGI 응답 을 받 는 시간 초 과 는 악 수 를 두 번 마 친 뒤 FastCGI 응답 을 받 는 시간 초 과 를 말한다.
fastcgi_buffer_size 16k;

FastCGI 응답 첫 부분 을 읽 는 데 얼마나 큰 버퍼 가 필요 한 지 지정 합 니 다. fastcgi 로 설정 할 수 있 습 니 다.buffers 명령 이 지정 한 버퍼 크기 입 니 다. 위의 명령 은 16k 버퍼 를 사용 하여 응답 의 첫 번 째 부분, 즉 응답 헤드 를 읽 습 니 다. 사실 이 응답 헤드 는 일반적으로 작 습 니 다 (1k 를 초과 하지 않 습 니 다). 하지만 fastcgibuffers 명령 에 버퍼 크기 를 지정 하면 fastcgi 를 할당 합 니 다.buffers 가 지정 한 버퍼 크기 를 캐 시 합 니 다.
fastcgi_buffers 16 16k;

FastCGI 의 응답 을 로 컬 에서 얼마나 많은 버퍼 로 버퍼 링 해 야 하 는 지 지정 합 니 다. 위 와 같이 phop 스 크 립 트 가 만 든 페이지 크기 가 256 k 이면 16k 버퍼 16 개 를 할당 합 니 다. 256 k 이상 이면 256 k 이상 의 부분 은 fastcgi 로 캐 시 합 니 다.temp 가 지정 한 경로 에 서 는 물론 서버 부하 에 있어 서 현명 하지 못 한 방안 입 니 다. 메모리 에서 데이터 처리 속도 가 하 드 디스크 보다 빠 르 기 때 문 입 니 다. 보통 이 값 의 설정 은 사이트 의 phop 스 크 립 트 가 만 든 페이지 크기 의 중간 값 을 선택해 야 합 니 다. 예 를 들 어 사이트 의 대부분 스 크 립 트 가 만 든 페이지 크기 가 256 k 이면 이 값 을 16 16k 로 설정 할 수 있 습 니 다.또는 4 64k 또는 64 4k 이지 만 분명 한 것 은 두 가지 가 좋 은 설정 방법 이 아 닙 니 다. 만약 에 발생 하 는 페이지 가 32k 밖 에 없 기 때문에 4 64k 를 사용 하면 64k 의 버퍼 를 1 개 나 나 누 어 캐 시 할 것 입 니 다. 64 4k 를 사용 하면 4k 의 버퍼 를 8 개 나 누 어 캐 시 할 것 입 니 다. 16 16k 를 사용 하면 16k 를 2 개 나 누 어 캐 시 할 것 입 니 다. 그러면 더욱 합 리 적 인 것 같 습 니 다.
fastcgi_busy_buffers_size 32k;

이 명령 은 나 도 무엇 에 쓰 는 지 모 르 겠 지만, 기본 값 이 fastcgi 인 것 만 알 고 있다.buffers 의 두 배.
fastcgi_temp_file_write_size 32k;

fastcgi 를 쓰 고 있 습 니 다.temp_path 시 몇 개의 큰 데이터 블록 을 사용 합 니까? 기본 값 은 fastcgi 입 니 다.buffers 의 두 배.
fastcgi_cache TEST

FastCGI 캐 시 를 열 고 이름 을 만 듭 니 다.개인 적 으로 캐 시 를 여 는 것 이 매우 유용 하 다 고 생각 합 니 다. CPU 부 하 를 효과적으로 낮 추고 502 오 류 를 방지 할 수 있 습 니 다.그러나 이 캐 시 는 동적 페이지 이기 때문에 많은 문 제 를 일 으 킬 수 있 습 니 다.구체 적 으로 사용 하려 면 자신의 수요 에 따라 야 한다.
fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;

지정 한 응답 코드 에 캐 시 시간 을 지정 합 니 다. 예 를 들 어 상기 200, 302 응답 캐 시 1 시간, 301 응답 캐 시 1 일, 기타 1 분 입 니 다.
fastcgi_cache_min_uses 1;

캐 시 는 fastcgicache_path 명령 inactive 매개 변수 값 시간 내 최소 사용 횟수 입 니 다. 예 를 들 어 5 분 동안 한 파일 이 한 번 도 사용 되 지 않 으 면 이 파일 은 삭 제 됩 니 다.
fastcgi_cache_use_stale error timeout invalid_header http_500;

이 매개 변수의 역할 을 모 르 겠 습 니 다. nginx 에 게 어떤 종류의 캐 시 를 알 리 는 것 이 소 용이 없 을 것 같 습 니 다.이상 은 nginx 에서 FastCGI 와 관련 된 매개 변수 입 니 다. 또한 FastCGI 자체 도 최적화 해 야 할 설정 이 있 습 니 다. php - fpm 를 사용 하여 FastCGI 를 관리 하면 설정 파일 의 다음 값 을 수정 할 수 있 습 니 다.
<value name="max_children">60</value>

동시에 처리 하 는 병렬 요청 수, 즉 최대 60 개의 스 레 드 를 열 어 병렬 연결 을 처리 합 니 다.
<value name="rlimit_files">102400</value>

최대 파일 수 를 엽 니 다.
<value name="max_requests">204800</value>

모든 프로 세 스 가 리 셋 되 기 전에 실행 할 수 있 는 최대 요청 수 입 니 다.
다음 그림 은 6 대의 기계 에서 웹 벤 치 - c 30000 - t 600 을 동시에 실행 하 는 것 이다.http://ad.test.com:8080/index.html명령 후 테스트 결과: netstat 를 사용 하여 걸 러 낸 연결 수: phop 페이지 가 status 에 있 는 결과 (phop 페이지 는 phopinfo 호출): php 페이지 가 netstat 에서 걸 러 낸 연결 수: FastCGI 캐 시 를 사용 하지 않 기 전의 서버 부하: 이 때 php 페이지 를 열기 가 어렵 습 니 다. 여러 번 새로 고침 을 해 야 열 수 있 습 니 다.위의 그림 에서 cpu 0 부하 가 낮은 것 은 테스트 할 때 네트워크 카드 중단 요청 을 모두 cpu 0 에 할당 하고 nginx 에서 7 개의 프로 세 스 를 각각 cpu 1 - 7 로 설정 하기 때 문 입 니 다.FastCGI 캐 시 사용 후: php 페이지 를 쉽게 열 수 있 습 니 다.
이 테스트 는 데이터 베 이 스 를 연결 하지 않 았 기 때문에 참고 가치 가 없습니다. 그러나 상기 테스트 가 한계 에 도 달 했 는 지 는 모 르 겠 습 니 다. 메모리 와 cpu 의 사용 상황 에 따라 없 는 것 같 지만 웹 벤 치 를 실행 할 수 있 는 여분의 기계 가 없습니다.

좋은 웹페이지 즐겨찾기