ホームページ  >  記事  >  バックエンド開発  >  Nginx関連の構成の最適化

Nginx関連の構成の最適化

WBOY
WBOYオリジナル
2016-07-29 09:15:18846ブラウズ

ほとんどの Nginx インストール ガイドでは、次の基本事項が説明されています。apt-get 経由でインストールし、あちこちの設定を数行変更すると、ほら、Web サーバーがすでに存在します。また、ほとんどの場合、nginx を定期的にインストールすると、Web サイトで問題なく動作します。ただし、Nginx のパフォーマンスを本当に絞り出したい場合は、もう少し深く掘り下げる必要があります。このガイドでは、多数のクライアントを処理するときにパフォーマンスを最適化するために微調整できる Nginx の設定について説明します。これは微調整のための包括的なガイドではないことに注意することが重要です。これは単純なプレビューであり、パフォーマンスを向上させるために調整できる設定の概要です。あなたの状況は異なるかもしれません。

基本 (最適化) 構成

変更する唯一のファイルは nginx.conf で、これには Nginx のさまざまなモジュールのすべての設定が含まれています。 nginx.conf はサーバーの /etc/nginx ディレクトリにあるはずです。まず、いくつかのグローバル設定について説明し、次にファイル内の各モジュールを確認して、多数のクライアントがアクセスされたときにどの設定が良好なパフォーマンスを提供するか、およびその設定によってパフォーマンスが向上する理由について説明します。完全な構成ファイルはこの記事の最後にあります。

高度な構成

nginx.conf ファイルでは、モジュール部分の上に Nginx の高度な構成がいくつかあります。

<ol>
<li>user www-data; </li>
<li>pid /var/run/nginx.pid; </li>
<li><span>worker_processes auto; </span></li>
<li><span>worker_rlimit_nofile 100000; </span></li>
</ol>

user と pid はデフォルトのままである必要があります。変更してもしなくても違いはないため、これらは変更しません。

worker_processes は、nginx が外部に Web サービスを提供する際のワーカープロセスの数を定義します。最適な値は、CPU コアの数、データを保存するハード ドライブの数、負荷パターンなど (ただしこれらに限定されない) 多くの要因によって異なります。疑わしい場合は、利用可能な CPU コアの数に設定するのが良いでしょう (「自動」に設定すると、自動的に検出しようとします)。

worker_rlimit_nofile ワーカープロセスのオープンファイルの最大数制限を変更します。設定されていない場合、この値はオペレーティング システムの制限になります。設定後、オペレーティング システムと Nginx は「ulimit -a」より多くのファイルを処理できるため、nginx で「開いているファイルが多すぎる」問題が発生しないように、この値を高く設定します。

イベント モジュール

イベント モジュールには、nginx で接続を処理するためのすべての設定が含まれています。

<ol>
<li>events { </li>
<li><span>worker_connections 2048; </span></li>
<li>multi_accept on; </li>
<li><span>use epoll; </span></li>
<li>} </li>
</ol>

worker_connections ワーカー プロセスによって同時に開くことができる接続の最大数を設定します。前述のworker_rlimit_nofileが設定されている場合、この値を非常に高く設定できます。

クライアントの最大数は、システム上で使用可能なソケット接続の数 (~64K) によっても制限されるため、非現実的に高く設定してもメリットがないことに注意してください。

multi_accept は、新しい接続通知を受信した後、できるだけ多くの接続を受け入れるように nginx に指示します。

use クライアントスレッドを再利用するためのポーリング方法を設定します。 Linux 2.6 以降を使用している場合は、epoll を使用する必要があります。 *BSD を使用する場合は、kqueue を使用する必要があります。

(Nginx がどのポーリング方法を使用すべきかわからない場合は、オペレーティング システムに最適な方法が選択されることに注意してください)

HTTP モジュール

HTTP モジュールは、nginx http 処理のすべてのコア機能を制御します。ここには構成の量が少ないため、構成のごく一部のみを抜粋します。これらの設定はすべて http モジュール内にあるはずですが、特にこの設定に気づくことはありません。

<ol>
<li>http { </li>
<li>server_tokens off; </li>
<li>sendfile on; </li>
<li>tcp_nopush on; </li>
<li>tcp_nodelay on; </li>
<li>... </li>
<li>} </li>
</ol>

server_tokens は nginx の実行を高速化するものではありませんが、エラー ページで nginx のバージョン番号をオフにすることができるため、セキュリティには優れています。

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

tcp_nopush は、すべてのヘッダー ファイルを次々に送信するのではなく、1 つのパケットで送信するように nginx に指示します。

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

<ol>
<li>access_log off; </li>
<li>error_log /var/log/nginx/error.log crit; </li>
</ol>

access_log nginxがアクセスログを保存するかどうかを設定します。このオプションをオフにすると、読み取りディスク IO 操作が高速化されます (別名、YOLO)

error_log は、重大なエラーのみをログに記録するように nginx に指示します:

<ol>
<li>keepalive_timeout 10; </li>
<li>client_header_timeout 10; </li>
<li>client_body_timeout 10; </li>
<li>reset_timedout_connection on; </li>
<li>send_timeout 10; </li>
</ol>

keepalive_timeout キープアライブ リンク タイムアウトをクライアントに割り当てます。このタイムアウトの後、サーバーはリンクを閉じます。 ngnix がより長く動作し続けることができるように、この値を低く設定しました。

client_header_timeout と client_body_timeout は、リクエスト ヘッダーとリクエスト ボディ (それぞれ) のタイムアウトを設定します。これを低く設定することもできます。

reset_timeout_connection は、応答しないクライアント接続を閉じるように nginx に指示します。これにより、そのクライアントが占有しているメモリ領域が解放されます。

send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。

<ol>
<li>limit_conn_zone $binary_remote_addr <span>zone</span>=<span>addr</span>:5m; </li>
<li>limit_conn addr 100; </li>
</ol>

limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。

limit_conn 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。

<ol>
<li>include /etc/nginx/mime.types; </li>
<li>default_type text/html; </li>
<li>charset UTF-8; </li>
</ol>

include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。

default_type 设置文件使用的默认的MIME-type。

charset 设置我们的头文件中的默认的字符集

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

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 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。

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

open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间。我们可以设置一个相对高的最大时间,这样我们可以在它们不活动超过20秒后清除掉。

open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。

open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。

open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。

一个完整的配置

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

编辑完配置后,确认重启nginx使设置生效。

<ol><li>sudo service nginx restart</li></ol>

以上就介绍了Nginx 相关配置优化,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。