ホームページ > バックエンド開発 > PHPチュートリアル > 高同時実行時のnginxのより良い設定方法のご紹介(コード解析編)

高同時実行時のnginxのより良い設定方法のご紹介(コード解析編)

不言
リリース: 2023-04-04 07:42:02
オリジナル
1776 人が閲覧しました

この記事では、高同時実行時の nginx のより良い設定方法 (コード解析) を紹介します。一定の参考価値があります。必要な友人は参考にしてください。お役に立てれば幸いです。

1. ここでの最適化とは、主に nginx の構成の最適化を指します。一般的に、nginx 構成ファイル内の次の項目は、最適化により効果的です:

nginx プロセスの数、提案CPU の数に応じて指定されます。通常、CPU コアの数と同じかその倍数になります。

worker_processes 8;
ログイン後にコピー

各プロセスにCPUを割り当てる 上記の例では8つのプロセスを8つのCPUに割り当てていますが、もちろん複数書いたり、1つのプロセスを複数のCPUに割り当てることも可能です。

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
ログイン後にコピー

次のコマンドは、nginx プロセスによって開かれるファイル記述子の最大数を参照します。理論値は、システム内で開かれるファイルの最大数 (ulimit-n) を nginx プロセスの数で割った値である必要があります。 , ただし、nginx はリクエストを割り当てます。それほど均一ではないため、ulimit -n の値と一致させる方が良いでしょう。

worker_rlimit_nofile 65535;
ログイン後にコピー

epoll の I/O モデルを使用し、このモデルを使用して非同期イベントを効率的に処理します

use epoll;
ログイン後にコピー

プロセスごとに許可される接続の最大数理論的には、nginx サーバーごとの最大接続数は worker_processes です*worker_connections。

worker_connections 65535;
ログイン後にコピー

http 接続タイムアウト、デフォルトは 60 秒です。この機能は、クライアントからサーバーへの接続を設定時間内に有効にし続けることです。サーバーへの後続のリクエストが発生した場合、この機能は回避します。確立または再確立により接続が確立されます。このパラメータはあまり大きく設定できないことに注意してください。そうしないと、多くの無効な http 接続が nginx 接続の数を占有し、最終的に nginx がクラッシュします。

keepalive_timeout 60;
ログイン後にコピー

クライアント リクエスト ヘッダーのバッファ サイズは、システムのページング サイズに応じて設定できます。通常、リクエストのヘッダー サイズは 1k を超えませんが、一般的なシステム ページングは​​ 1k より大きいため、ここではページングサイズに設定されています。ページング サイズは、getconf PAGESIZE コマンドで取得できます。

client_header_buffer_size 4k;
ログイン後にコピー
ログイン後にコピー

次のパラメータは、開いているファイルのキャッシュを指定します。デフォルトでは有効になっていません。最大値はキャッシュの数を指定します。開いているファイルの数と一致させることをお勧めします。非アクティブとは、どれくらいの期間を指しますかキャッシュが削除されるまで、ファイルはリクエストされていません。

open_file_cache max=102400 inactive=20s;
ログイン後にコピー

次は、キャッシュされた有効な情報がチェックされる頻度を示します。

open_file_cache_valid 30s;
ログイン後にコピー

open_file_cache ディレクティブの inactive パラメータ内のファイルの最小使用数。この数を超えると、ファイル記述子は常にキャッシュ内で開かれます。上の例のように、ファイルが非アクティブ時間内に一度も使用されなかった場合は削除されます。

open_file_cache_min_uses 1;
ログイン後にコピー
ログイン後にコピー

応答ヘッダー内のオペレーティング システムと Web サーバー (Nginx) のバージョン番号に関する情報を非表示にします。これはセキュリティに役立ちます。

server_tokens off;
ログイン後にコピー

は sendfile() を機能させることができます。 sendfile() は、ディスクと TCP ソケットの間でデータ (または任意の 2 つのファイル記述子) をコピーできます。 Pre-sendfile は、データを送信する前にユーザー空間のデータ バッファーを申請することです。次に、read() を使用してファイルからこのバッファにデータをコピーし、write() を使用してバッファ データをネットワークに書き込みます。 sendfile() は、データをディスクから OS キャッシュに即座に読み取ります。このコピーはカーネル内で行われるため、sendfile() は、read() と write() を組み合わせて破棄バッファのオンとオフを切り替えるよりも効率的です (sendfile について詳しく説明します)。

sendfile on;
ログイン後にコピー

すべてのヘッダー ファイルを次々に送信するのではなく、1 つのパケットで送信するように nginx に指示します。つまり、データパケットはすぐに送信されるのではなく、データパケットが最大のときに一度に送信されるため、ネットワークの混雑を解消することができます。

tcp_nopush on;
ログイン後にコピー

データをキャッシュせずに少しずつ送信するように nginx に指示します。データを時間内に送信する必要がある場合は、この属性をアプリケーションに設定する必要があります。これにより、小さなデータを送信するときに、情報の場合、戻り値をすぐに取得することはできません。

tcp_nodelay on;
ログイン後にコピー

例:

http { 
server_tokens off; 
sendfile on; 
tcp_nopush on; 
tcp_nodelay on; 
......
}
ログイン後にコピー

クライアント要求ヘッダーのバッファ サイズ。これはシステム ページング サイズに従って設定できます。通常、要求ヘッダーのサイズは 1k を超えません。ただし、一般的なシステムにより、ページングは​​ 1k より大きくなければならないため、ページング サイズはここで設定されます。

client_header_buffer_size 4k;
ログイン後にコピー
ログイン後にコピー

クライアント リクエスト ヘッダーのバッファ サイズ。これはシステム ページング サイズに応じて設定できます。通常、リクエスト ヘッダーのサイズは 1k を超えません。ただし、システム ページングは​​通常 1k より大きいため、 1k、ここで設定されます、ページング サイズです。ページング サイズは、getconf PAGESIZE コマンドで取得できます。

[root@test-huanqiu ~]# getconf PAGESIZE 
4096
ログイン後にコピー

ただし、client_header_buffer_size が 4k を超える場合もありますが、client_header_buffer_size の値は「システム ページング サイズ」の整数倍に設定する必要があります。

開いているファイルのキャッシュを指定します。これはデフォルトでは有効になっていません。最大値はキャッシュの数を指定します。開いているファイルの数と一致させることをお勧めします。非アクティブとは、ファイルが以前に要求されていない期間を指します。キャッシュが削除されます。

open_file_cache max=65535 inactive=60s;
ログイン後にコピー

open_file_cache ディレクティブの非アクティブなパラメータ時間内のファイルの最小使用回数。この数を超えると、ファイル記述子は常にキャッシュ内で開かれます。上の例のように、ファイルが非アクティブ時間内に一度も使用されなかった場合、削除されます。

open_file_cache_min_uses 1;
ログイン後にコピー
ログイン後にコピー

キャッシュされた有効な情報を確認する頻度を指定します。

open_file_cache_valid 80s;
ログイン後にコピー

以下は、使用される単純な nginx 設定ファイルです:

[root@dev-huanqiu ~]# cat /usr/local/nginx/conf/nginx.conf
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 65535;
 
events
{
   use epoll;
   worker_connections 65535;
}
 
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   huan.wangshibo.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;
       }
}
ログイン後にコピー

2. FastCGI に関するいくつかの手順

この手順では、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传送请求的超时时间。

fastcgi_send_timeout 300;
ログイン後にコピー

接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

fastcgi_read_timeout 300;
ログイン後にコピー

指定读取FastCGI应答第一部分 需要用多大的缓冲区,这里可以设置为fastcgi_buffers指令指定的缓冲区大小,上面的指令指定它将使用1个 16k的缓冲区去读取应答的第一部分,即应答头,其实这个应答头一般情况下都很小(不会超过1k),但是你如果在fastcgi_buffers指令中指 定了缓冲区的大小,那么它也会分配一个fastcgi_buffers指定的缓冲区大小去缓存。

fastcgi_buffer_size 16k;
ログイン後にコピー

指定本地需要用多少和多大的缓冲区来 缓冲FastCGI的应答,如上所示,如果一个php脚本所产生的页面大小为256k,则会为其分配16个16k的缓冲区来缓存,如果大于256k,增大 于256k的部分会缓存到fastcgi_temp指定的路径中, 当然这对服务器负载来说是不明智的方案,因为内存中处理数据速度要快于硬盘,通常这个值 的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值,比如你的站点大部分脚本所产生的页面大小为 256k就可以把这个值设置为16 16k,或者4 64k 或者64 4k,但很显然,后两种并不是好的设置方法,因为如果产生的页面只有32k,如果用4 64k它会分配1个64k的缓冲区去缓存,而如果使用64 4k它会分配8个4k的缓冲区去缓存,而如果使用16 16k则它会分配2个16k去缓存页面,这样看起来似乎更加合理。

fastcgi_buffers 16 16k;
ログイン後にコピー

这个指令我也不知道是做什么用,只知道默认值是fastcgi_buffers的两倍。

fastcgi_busy_buffers_size 32k;
ログイン後にコピー

在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍。

fastcgi_temp_file_write_size 32k;
ログイン後にコピー

开启FastCGI缓存并且为其制定一个名称。个人感觉开启缓存非常有用,可以有效降低CPU负载,并且防止502错误。但是这个缓存会引起很多问题,因为它缓存的是动态页面。具体使用还需根据自己的需求。

fastcgi_cache TEST
ログイン後にコピー

为指定的应答代码指定缓存时间,如上例中将200,302应答缓存一小时,301应答缓存1天,其他为1分钟。

fastcgi_cache_valid 200 302 1h;
fastcgi_cache_valid 301 1d;
fastcgi_cache_valid any 1m;
ログイン後にコピー

缓存在fastcgi_cache_path指令inactive参数值时间内的最少使用次数,如上例,如果在5分钟内某文件1次也没有被使用,那么这个文件将被移除。

fastcgi_cache_min_uses 1;
ログイン後にコピー

不知道这个参数的作用,猜想应该是让nginx知道哪些类型的缓存是没用的。

fastcgi_cache_use_stale error timeout invalid_header http_500;
ログイン後にコピー

相关推荐:

nginx+keepalived配置高可用HTTP群集

高流量站点NGINX与PHP-fpm配置优化(译)

以上が高同時実行時のnginxのより良い設定方法のご紹介(コード解析編)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート