Nginx 서버 최적화 기술 소개

10126 단어
대부분의 Nginx 설치 안내 서 는 다음 과 같은 기본 지식 을 알려 줍 니 다. apt - get 설 치 를 통 해 이곳 이나 그곳 의 몇 줄 설정 을 수정 합 니 다. 자, 웹 서버 가 있 습 니 다!그리고 대부분의 경우, 일반적인 설치 nginx 는 당신 의 사이트 에 있어 서 이미 잘 작 동 할 수 있 습 니 다.그러나 만약 당신 이 정말 nginx 의 성능 을 압출 하고 싶다 면, 당신 은 좀 더 깊이 들 어가 야 합 니 다.이 안내서 에서 나 는 Nginx 의 설정 을 미세 조정 하여 대량의 클 라 이언 트 를 처리 할 때의 성능 을 최적화 할 수 있 도록 설명 할 것 이다.주의해 야 할 것 은 이것 은 전면적 인 미조정 지침 이 아니다.이것 은 미조정 을 통 해 성능 설정 을 향상 시 킬 수 있 는 간단 한 미리보기 이다.당신 의 상황 은 다 를 수 있 습 니 다.기본 설정
우리 가 수정 할 유일한 파일 은 nginx. conf 입 니 다. 그 중에서 Nginx 의 서로 다른 모듈 의 모든 설정 을 포함 합 니 다.서버 의 / etc / nginx 디 렉 터 리 에서 nginx. conf 를 찾 을 수 있 을 것 입 니 다.우선, 우 리 는 전체 설정 에 대해 이야기 한 다음 에 파일 에 있 는 모듈 에 따라 어떤 설정 이 대량의 클 라 이언 트 가 방문 할 때 좋 은 성능 을 가 질 수 있 는 지, 왜 그들 이 성능 을 향상 시 킬 수 있 는 지 에 대해 이야기 할 것 이다.이 글 의 끝 에 완전한 프로필 이 있 습 니 다.고 층 배치
nginx. conf 파일 에서 Nginx 에는 모듈 부분 위 에 몇 개의 고급 설정 이 있 습 니 다.
   

   user www-data; 
  
    pid /var/run/nginx.pid;
    worker_processes auto;
    worker_rlimit_nofile 100000;

user 와 pid 는 기본 설정 에 따라 야 합 니 다. - 변경 여부 가 다 르 지 않 기 때문에 변경 하지 않 습 니 다.
worker_processes 는 nginx 가 대외 적 으로 웹 서 비 스 를 제공 할 때의 worder 프로 세 스 수 를 정의 합 니 다.가장 좋 은 값 은 CPU 핵의 수량, 데 이 터 를 저장 하 는 하드디스크 의 수량 과 부하 모드 를 포함 하 는 여러 가지 요소 에 달 려 있다.확실 하지 않 을 때 사용 가능 한 CPU 커 널 수로 설정 하 는 것 이 좋 은 시작 입 니 다. ("auto" 로 설정 하면 자동 으로 감지 하려 고 시도 합 니 다.)
worker_rlimit_nofile 에서 워 커 프로 세 스 의 최대 열 림 파일 수 제한 을 변경 합 니 다.설정 하지 않 았 다 면 이 값 은 운영 체제 의 제한 입 니 다.설정 후 운영 체제 와 Nginx 는 "ulimit - a" 보다 더 많은 파일 을 처리 할 수 있 기 때문에 이 값 을 높 게 설정 하면 nginx 는 "too many open files" 문제 가 없 을 것 입 니 다.이벤트 모듈
이벤트 모듈 에는 nginx 의 모든 처리 연결 설정 이 포함 되 어 있 습 니 다.
   

   events { 
  
        worker_connections 2048;
        multi_accept on;
        use epoll;
    }

worker_connections 설정 은 워 커 프로 세 스 가 동시에 열 수 있 는 최대 연결 수 입 니 다.위 에서 언급 한 worker 를 설정 하면rlimit_nofile, 우 리 는 이 값 을 매우 높 게 설정 할 수 있 습 니 다.
최대 클 라 이언 트 수도 시스템 의 사용 가능 한 socket 연결 수 에 의 해 제한 되 기 때문에 실제 와 맞지 않 는 높이 를 설정 하 는 것 은 좋 을 것 이 없다 는 것 을 기억 하 세 요.
multi_accept 는 nginx 에 게 새로운 연결 알림 을 받 은 후에 가능 한 한 많은 연결 을 받 도록 알려 줍 니 다.
use 설정 은 클 라 이언 트 스 레 드 를 재 활용 하 는 폴 링 방법 입 니 다.리 눅 스 2.6 + 를 사용한다 면 epoll 을 사용 해 야 합 니 다.만약 당신 이 * BSD 를 사용한다 면, 당신 은 kqueue 를 사용 해 야 합 니 다.이벤트 폴 링 에 대해 더 알 고 싶 으 세 요?위 키 피 디 아 를 보 세 요.
(주의해 야 할 것 은 Nginx 가 어떤 폴 링 방법 을 사용 해 야 하 는 지 모 르 면 운영 체제 에 가장 적합 한 것 을 선택 할 것 입 니 다).HTTP 모듈
HTTP 모듈 은 nginx http 처리 의 모든 핵심 기능 을 제어 합 니 다.여 기 는 아주 적은 설정 만 있 기 때문에 우 리 는 설정 의 일부분 만 선택 합 니 다.이 모든 설정 은 http 모듈 에 있어 야 합 니 다. 심지어 이 설정 에 특별히 주의 하지 않 을 것 입 니 다.
   

   http { 
  
        server_tokens off;
        sendfile on;
    
        tcp_nopush on;
        tcp_nodelay on;
    }

server_tokens 는 nginx 가 더 빨리 실행 되 지 는 않 지만 오류 페이지 에 있 는 nginx 버 전 숫자 를 닫 을 수 있어 안전성 에 좋 습 니 다.
sendfile 은 sendfile () 이 역할 을 발휘 할 수 있 습 니 다.sendfile () 은 디스크 와 TCP socket 사이 에서 서로 데 이 터 를 복사 할 수 있 습 니 다 (또는 임의의 두 파일 설명자).Pre - sendfile 은 데 이 터 를 전송 하기 전에 사용자 공간 에서 데이터 버퍼 를 신청 합 니 다.그 다음 에 read () 로 데 이 터 를 파일 에서 이 버퍼 로 복사 하고 write () 는 버퍼 데 이 터 를 네트워크 에 기록 합 니 다.sendfile () 은 디스크 에서 OS 캐 시 로 데 이 터 를 즉시 읽 습 니 다.이 복사 본 은 커 널 에서 이 루어 졌 기 때문에 sendfile () 은 조합 read () 와 write (), 닫 기 버퍼 를 여 는 것 보다 더 효과 적 입 니 다 (sendfile 에 관 한 것 이 더 많 습 니 다).
tcp_nopush 는 nginx 에 게 하나의 패 킷 에서 모든 헤더 파일 을 보 내 고 하나씩 보 내지 않 는 다 고 알려 줍 니 다.
tcp_nodelay 는 nginx 에 게 데 이 터 를 캐 시 하지 말고 한 단락 한 단락 의 전송 이 라 고 알려 주 었 습 니 다. 데 이 터 를 제때에 보 내야 할 때 이 속성 을 설정 해 야 합 니 다. 그러면 작은 데이터 정 보 를 보 낼 때 바로 반환 값 을 받 을 수 없습니다.
   

   access_log off; 
  
    error_log /var/log/nginx/error.log crit;

access_로그 설정 nginx 에서 접근 로 그 를 저장 할 지 여부 입 니 다.이 옵션 을 사용 하면 디스크 IO 를 더 빨리 읽 을 수 있 습 니 다 (aka, YOLO).
error_log 는 nginx 에 게 심각 한 오 류 를 기록 할 수 밖 에 없다 고 알려 줍 니 다.
   

   keepalive_timeout 10; 
  
    
    client_header_timeout 10;
    client_body_timeout 10;
    
    reset_timedout_connection on;
    send_timeout 10;

keepalive_timeout 은 클 라 이언 트 에 keep - alive 링크 시간 을 초과 합 니 다.서버 는 이 시간 초과 후에 링크 를 닫 을 것 입 니 다.우 리 는 그것 을 좀 낮 게 설정 해서 ngnix 가 더 오래 일 할 수 있 도록 합 니 다.
client_header_timeout 와 clientbody_timeout 은 요청 헤더 와 요청 체 (각자) 의 시간 초과 시간 을 설정 합 니 다.우리 도 이것 을 좀 낮 출 수 있다.
reset_timeout_connection 은 nginx 에 응답 하지 않 는 클 라 이언 트 연결 을 닫 으 라 고 알려 줍 니 다.이것 은 클 라 이언 트 가 차지 하 는 메모리 공간 을 방출 할 것 이다.
send_timeout 에서 지정 한 클 라 이언 트 의 응답 시간 초과.이 설정 은 전체 전송 기 에 사용 되 지 않 고 두 번 의 클 라 이언 트 읽 기 동작 사이 에 있 습 니 다.이 기간 동안 클 라 이언 트 가 데 이 터 를 읽 지 않 으 면 nginx 는 연결 을 닫 습 니 다.
   

   limit_conn_zone $binary_remote_addr zone=addr:5m; 
  
    limit_conn addr 100;

limit_conn 은 주어진 key 에 최대 연결 수 를 설정 합 니 다.여기 키 는 addr 입 니 다. 저희 가 설정 한 값 은 100 입 니 다. 즉, 모든 IP 주소 가 최대 100 개의 연결 을 동시에 열 수 있 도록 합 니 다.
limit_conn_zone 설정 은 각종 key (예 를 들 어 현재 연결 수) 의 공유 메모리 인 자 를 저장 하 는 데 사 용 됩 니 다.5m 는 5 메가바이트 입 니 다. 이 값 은 저장 (32K * 5) 32byte 상태 나 (16K * 5) 64byte 상태 로 충분히 설정 되 어야 합 니 다.
   

   include /etc/nginx/mime.types; 
  
    default_type text/html;
    charset UTF-8;

include 는 현재 파일 에 다른 파일 내용 을 포함 하 는 명령 일 뿐 입 니 다.잠시 후에 사용 할 MIME 형식 을 불 러 오 는 데 사용 합 니 다.
default_type 설정 파일 에 사용 할 기본 MIME - type 입 니 다.
charset 는 헤더 파일 의 기본 문자 집합 을 설정 합 니 다.
다음 두 가 지 는 성능 향상 에 대해 위대 한 웹 마스터 스 StackExchange 에서 설명 한다.
   

   gzip on; 
  
    gzip_disable "msie6";
    
    # gzip_static on;
    gzip_proxied any;
    gzip_min_length 1000;
    gzip_comp_level 4;
    
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

gzip 는 nginx 에 게 gzip 압축 형식 으로 데 이 터 를 보 내 는 것 을 알려 줍 니 다.이것 은 우리 가 보 낸 데이터 의 양 을 줄 일 것 이다.
gzip_disable 은 지정 한 클 라 이언 트 에 gzip 기능 을 사용 하지 않 습 니 다.우 리 는 우리 의 방안 을 광범 위 하 게 호 환 할 수 있 도록 IE6 또는 더 낮은 버 전 으로 설정 했다.
gzip_static 는 nginx 에 게 자원 을 압축 하기 전에 미리 gzip 에서 처리 한 자원 이 있 는 지 찾 아 보라 고 알려 줍 니 다.이것 은 파일 을 미리 압축 해 야 합 니 다. (이 예 에서 주석 이 떨 어 졌 습 니 다) 최고 압축 비 를 사용 할 수 있 도록 해 줍 니 다. 그러면 nginx 는 이 파일 들 을 더 이상 압축 하지 않 아 도 됩 니 다. (더 자세 한 gzip static 정 보 를 원 하 시 면 여 기 를 클릭 하 십시오.)
gzip_proxied 는 요청 과 응답 을 기반 으로 하 는 응답 흐름 을 압축 하거나 금지 합 니 다.모든 요청 을 압축 하 는 것 을 의미 하 는 any 로 설정 합 니 다.
gzip_min_length 는 데이터 압축 을 위 한 최소 바이트 수 를 설정 합 니 다.만약 요청 이 1000 바이트 보다 작다 면, 우 리 는 그것 을 압축 하지 않 는 것 이 좋 습 니 다. 왜냐하면 이 작은 데 이 터 를 압축 하면 이 요청 을 처리 하 는 모든 프로 세 스 의 속 도 를 낮 출 수 있 기 때 문 입 니 다.
gzip_comp_level 데이터 의 압축 등급 을 설정 합 니 다.이 등급 은 1 - 9 사이 의 임 의 수치 일 수 있 으 며, 9 는 가장 느 리 지만 압축 비 는 가장 크다.우 리 는 4 로 설정 했다. 이것 은 비교적 절충 적 인 설정 이다.
gzip_type 압축 할 데이터 형식 을 설정 합 니 다.위의 예 에는 이미 몇 가지 가 있 으 니, 너 도 더 많은 형식 을 추가 할 수 있다.
   

   # cache informations about file descriptors, frequently accessed files 
  
    # can boost performance, but you need to test those values
    open_file_cache max=100000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    open_file_cache_errors on;
    
    ##
    # Virtual Host Configs
    # aka our settings for specific servers
    ##
    
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

open_file_cache 는 캐 시 를 여 는 동시에 캐 시 최대 수량 과 캐 시 시간 도 지정 합 니 다.우 리 는 20 초 이상 활동 하지 않 은 후에 제거 할 수 있 도록 상대 적 으로 높 은 시간 을 설정 할 수 있다.
open_file_cache_valid 는 openfile_cache 에서 정확 한 정 보 를 감지 하 는 간격 을 지정 합 니 다.
open_file_cache_min_uses 정의 openfile_cache 에서 명령 파라미터 가 활동 하지 않 는 시간 동안 가장 작은 파일 수 입 니 다.
open_file_cache_errors 는 파일 을 검색 할 때 오류 정 보 를 캐 시 할 지 여 부 를 지정 합 니 다. 설정 에 파일 을 다시 추가 하 는 것 도 포함 합 니 다.저희 도 서버 모듈 을 포함 하고 있 습 니 다. 이것 은 서로 다른 파일 에서 정 의 된 것 입 니 다.서버 모듈 이 이 위치 에 없다 면 이 줄 을 수정 해서 정확 한 위 치 를 지정 해 야 합 니 다.완전한 설정
   

   user www-data; 
  
    pid /var/run/nginx.pid;
    worker_processes auto;
    worker_rlimit_nofile 100000;
    
    events {
        worker_connections 2048;
        multi_accept on;
        use epoll;
    }
    
    http {
        server_tokens off;
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
    
        access_log off;
        error_log /var/log/nginx/error.log crit;
    
        keepalive_timeout 10;
        client_header_timeout 10;
        client_body_timeout 10;
        reset_timedout_connection on;
        send_timeout 10;
    
        limit_conn_zone $binary_remote_addr zone=addr:5m;
        limit_conn addr 100;
    
        include /etc/nginx/mime.types;
        default_type text/html;
        charset UTF-8;
    
        gzip on;
        gzip_disable "msie6";
        gzip_proxied any;
        gzip_min_length 1000;
        gzip_comp_level 6;
        gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
        open_file_cache max=100000 inactive=20s;
        open_file_cache_valid 30s;
        open_file_cache_min_uses 2;
        open_file_cache_errors on;
    
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }

설정 을 편집 한 후 nginx 를 다시 시작 하 는 것 을 확인 하 십시오.
   

sudo service nginx restart

후기
이렇게!당신 의 웹 서버 는 이미 준비 가 되 었 습 니 다. 이전에 당신 을 괴 롭 혔 던 많은 방문 자 들 의 질문 을 하 세 요.이것 은 사 이 트 를 가속 화 하 는 유일한 방법 이 아니 라 곧 나 는 다른 가속 사이트 방법 을 소개 하 는 글 을 더 쓸 것 이다.

좋은 웹페이지 즐겨찾기