>  기사  >  운영 및 유지보수  >  Nginx 정적 파일 서비스를 구성하고 최적화하는 방법

Nginx 정적 파일 서비스를 구성하고 최적화하는 방법

WBOY
WBOY앞으로
2023-05-13 09:04:131554검색

루트 디렉터리 및 인덱스 파일

루트 지시문은 파일을 검색하는 데 사용할 루트 디렉터리를 지정합니다. 요청된 파일의 경로를 얻기 위해 nginx는 루트 지시문에 지정된 경로에 요청 URI를 추가합니다. 이 지시어는 http {}, server {} 또는 location {} 컨텍스트 내의 모든 수준에 배치될 수 있습니다. 다음 예에서는 가상 서버에 대해 root 지시문이 정의됩니다. 루트를 명시적으로 재정의하는 루트 지시문이 포함되지 않은 모든 위치 {} 블록에 대해 작동합니다.

server {
  root /www/data;

  location / {
  }

  location /images/ {
  }

  location ~ \.(mp3|mp4) {
    root /www/media;
  }
}

여기에서 /images/로 시작하는 uris용 nginx는 파일 시스템의 /www/ data/images/ 디렉터리에서 검색합니다. 해당 문서. URI가 .mp3 또는 .mp4 확장자로 끝나는 경우 nginx는 일치하는 위치 블록에 정의되어 있으므로 /www/media/ 디렉터리에서 파일을 검색합니다.

요청이 /로 끝나면 nginx는 이를 디렉터리에 대한 요청으로 처리하고 디렉터리에서 인덱스 파일을 찾으려고 시도합니다. index 지시문은 인덱스 파일의 이름을 정의합니다(기본값은 index.html). 예제를 계속하려면 요청 uri가 /images/some/path/ 인 경우 nginx는 /www/data/images/some/path/index.html 파일이 있으면 반환합니다. 그렇지 않은 경우 nginx는 기본적으로 http 404 오류(찾을 수 없음)를 반환합니다. 자동으로 생성된 디렉터리 목록을 반환하도록 nginx를 구성하려면 autoindex 지시문에 on 매개 변수를 포함하세요.

location /images/ {
  autoindex on;
}

index 지시문에 여러 파일 이름을 나열할 수 있습니다. nginx는 지정된 순서로 파일을 검색하고 찾은 첫 번째 파일을 반환합니다.

location / {
  index index.$geo.html index.htm index.html;
}

여기서 사용된 $geo 변수는 geo 지시어를 통해 설정된 맞춤 변수입니다. 변수 값은 클라이언트의 IP 주소에 따라 달라집니다.

인덱스 파일을 반환하기 위해 nginx는 파일이 존재하는지 확인한 다음 인덱스 파일 이름을 기본 URI에 추가하여 얻은 새 URI로 내부 리디렉션을 수행합니다. 내부 리디렉션으로 인해 해당 위치에 대한 새로운 검색이 발생하고 다음 예와 같이 다른 위치로 끝날 수 있습니다.

location / {
  root /data;
  index index.html index.php;
}

location ~ \.php {
  fastcgi_pass localhost:8000;
  #...

}

여기에서 요청의 uri가 /path/이고 /data/path/index.html이 검색된 경우 존재하지 않지만 /data/path/index.php가 존재하면 /path/index.php에 대한 내부 리디렉션이 두 번째 위치에 매핑됩니다. 결과적으로 요청이 프록시됩니다.

몇 가지 옵션을 시도해 보세요.

try_files 지시어는 지정된 파일이나 디렉터리가 존재하는지 확인하는 데 사용할 수 있습니다. nginx는 내부 리디렉션을 수행하고 그렇지 않은 경우 지정된 상태 코드를 반환합니다. 예를 들어 요청 uri에 해당하는 파일이 존재하는지 확인하려면 다음과 같이 try_files 지시문과 $uri 변수를 사용합니다.

server {
  root /www/data;

  location /images/ {
    try_files $uri /images/default.gif;
  }
}

파일은 현재 위치 또는 컨텍스트에 설정된 루트를 사용하여 uri로 지정됩니다. 처리를 위한 가상 서버 또는 별칭 지침. 이 경우 원본 uri에 해당하는 파일이 존재하지 않으면 nginx는 마지막 매개변수에 지정된 uri로 내부적으로 리디렉션하고 /www/data/images/default.gif 를 반환합니다.

마지막 매개변수는 상태 코드(등호로 직접 시작) 또는 위치 이름일 수도 있습니다. 다음 예에서는 try_files 지시문에 대한 인수가 기존 파일이나 디렉터리로 확인되지 않으면 404 오류가 반환됩니다.

location / {
  try_files $uri $uri/ $uri.html =404;
}

다음 예에서는 원래 uri와 뒤에 슬래시가 추가된 uri가 모두 기존 파일이나 디렉터리로 확인되지 않으면 요청이 지정된 위치로 리디렉션되고 프록시 서버로 전달됩니다.

location / {
  try_files $uri $uri/ @backend;
}

location @backend {
  proxy_pass http://backend.example.com;
}

제공되는 콘텐츠의 성능을 최적화하세요

로드 속도는 모든 콘텐츠를 전달하는 핵심 요소입니다. nginx 구성을 약간만 최적화하면 생산성이 향상되고 최적의 성능을 달성하는 데 도움이 될 수 있습니다.

Enable sendfile

기본적으로 nginx는 파일 전송 자체를 처리하고 전송하기 전에 파일을 버퍼에 복사합니다. sendfile 지시문을 활성화하면 데이터를 버퍼에 복사하는 단계가 제거되고 데이터를 한 파일 설명자에서 다른 파일 설명자로 직접 복사할 수 있습니다. 또는 하나의 빠른 연결이 작업자 프로세스를 완전히 점유하지 않도록 하려면 sendfile_max_chunk 지시어를 사용하여 단일 sendfile() 호출에서 전송되는 데이터 양을 제한할 수 있습니다(이 경우 1MB):

location /mp3 {
  sendfile      on;
  sendfile_max_chunk 1m;
  #...

}

Enable tcp_nopush

tcp_nopush 지시문을 sendfile on 지시문과 함께 사용합니다. 이를 통해 nginx는 sendfile()이 데이터 덩어리를 얻은 직후 패킷에 http 응답 헤더를 보낼 수 있습니다.

location /mp3 {
  sendfile  on;
  tcp_nopush on;
  #...

}

Enable tcp_nodelay

tcp_nodelay 지시문을 사용하면 원래 느린 네트워크에서 작은 패킷 문제를 해결하기 위해 설계된 nagle 알고리즘을 재정의할 수 있습니다. 이 알고리즘은 여러 개의 작은 패킷을 하나의 큰 패킷으로 결합하고 200밀리초의 지연을 두고 패킷을 보냅니다. 오늘날에는 대용량 정적 파일을 제공할 때 패킷 크기에 관계없이 데이터를 즉시 전송할 수 있습니다. 지연 시간은 온라인 애플리케이션(Ssh, 온라인 게임, 온라인 거래 등)에도 영향을 미칩니다. 기본적으로 tcp_nodelay 지시문은 on으로 설정되어 있으며 이는 nagle의 알고리즘이 비활성화됨을 의미합니다. 이 지시어는 keepalive 연결에만 사용됩니다:

location /mp3 {
  tcp_nodelay    on;
  keepalive_timeout 65;
  #...
  
}

Optimize backlog queue

其中一个重要因素是 nginx 可以多快地处理传入连接。一般规则是在建立连接时,将其放入侦听套接字的 "listen" (监听)队列中。在正常负载下,队列很小或根本没有队列。但是在高负载下,队列会急剧增长,导致性能不均匀,连接中断,延迟增加。

显示积压队列使用命令 netstat -lan 来显示当前监听队列。输出可能如下所示,它显示在端口 80上的监听队列中,有 10 个未接受的连接,这些连接针对配置的最多 128 个排队连接。这种情况很正常。

current listen queue sizes (qlen/incqlen/maxqlen)
listen     local address     
0/0/128    *.12345      
10/0/128    *.80    
0/0/128    *.8080

相反,在以下命令中,未接受的连接数(192)超过了 128 的限制。当网站流量很大时,这种情况很常见。要获得最佳性能,需要在操作系统和 nginx 配置中增加可以排队等待 nginx 接受的最大连接数。

current listen queue sizes (qlen/incqlen/maxqlen)
listen     local address     
0/0/128    *.12345      
192/0/128    *.80    
0/0/128    *.8080

调整操作系统

将 net.core.somaxconn 内核参数的值从其默认值(128)增加到足以容纳大量流量的值。在这个例子中,它增加到 4096。

  • freebsd 的命令为 sudo sysctl kern.ipc.somaxconn=4096

  • linux 的命令为 1. sudo sysctl -w net.core.somaxconn=4096 2. 将 net.core.somaxconn = 4096 加入到 /etc/sysctl.conf 文件中。

调整 nginx

如果将 somaxconn 内核参数设置为大于 512 的值,请将 backlog 参数增加在 nginx listen 指令以匹配修改:

server {
  listen 80 backlog=4096;
  # ...

}

위 내용은 Nginx 정적 파일 서비스를 구성하고 최적화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제