blog

Nginxの最適化の詳細

まず、一般的に言えば、次の項目のより有用な最適化に関するnginxの設定ファイル:;nginxのプロセス番号、それはCPUの数に応じてCPUの数を指定することをお勧めします、一般的にそれの倍数。...

Aug 3, 2020 · 10 min. read
シェア

一般的に、nginx設定ファイルは以下の項目の最適化により役立ちます:

1. worker_processes 8.

nginxのプロセス数は、通常その倍数のcpus数で指定することが推奨されています。

2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000.

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

あるいは、1つのプロセスを複数の CPU に割り当てることもできます。

3. worker_rlimit_nofile 65535.

このディレクティブは 1 つの nginx プロセスがオープンできるファイルディスクリプタの最大数を指し、理論的にはオープンされているファイルの最大数を nginx プロセスの数で割った値になるはずです。

理論的には、開いているファイルの数を nginx プロセスの数で割った値であるべきですが、 nginx はリクエストを均等に割り当てないので、 ulimit -n の値と一致させる方が良いでしょう。

現在、linux 2.6 kernel では、開いているファイルの数は 65535 で、worker_rlimit_nofile もそれに合わせて 65535 になっているはずです。

これはnginxのプロセスへのスケジューリング割り当て要求があまりバランスしていないためで、10240と記入した場合、300〜400万プロセスに達するための同時実行数の合計が10240より多くなる可能性があり、その場合502エラーが返されます。

linuxのシステムファイル記述子を見る方法:

[root@web001 ~]# sysctl -a | grep fs.file

fs.file-max = 987972

fs.file-nr = 510 0 987972

4. エポールを使用。

epollを使用したI/Oモデル

(

追加情報

apacheと同様に、nginxはオペレーティングシステムごとに異なるイベントモデルを持っています。

A) 標準イベントモデル

セレクト、ポールは標準的なイベントモデルに属し、現在のシステムにより効率的な方法が存在しない場合、nginxはセレクトまたはポールを選択します。

B) 効率的なイベントモデル

**Kqueue: **FreeBSD 4.1+、OpenBSD 2.9+、NetBSD 2.0、およびMacOS Xで使用されています。デュアルプロセッサを搭載したMacOS Xシステムでは、kqueueを使用するとカーネルがクラッシュする可能性があります。

Epoll: Linux カーネルバージョン 2.6 以降で使用。

/dev/poll: Solaris 7 11/99+、HP/UX 11.22+、IRIX 6.5.15+、Tru64 UNIX 5.1A+ で使用。

Eventport: Solaris 10 で使用されます。カーネルのクラッシュを防ぐには、セキュリティパッチをインストールする必要があります。

)

5. worker_connections 65535.

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

6. keepalive_timeout 60.

keepaliveタイムアウト時間。

7. client_header_buffer_size 4k.

クライアントのリクエストヘッダのバッファサイズは、システムのページングサイズに応じて設定することができます。一般的にリクエストヘッダのサイズは1kを超えることはありませんが、一般的なシステムのページングは1kよりも大きいため、ここではページングサイズに設定します。

ページサイズはgetconf PAGESIZE コマンドで取得できます。

[root@web001 ~]# getconf PAGESIZE

9046

ただし、client_header_buffer_sizeが4kを超える場合がありますが、client_header_buffer_sizeは**"system paging size "の整数倍に設定する必要があります。**

8. open_file_cache max=65535 inactive=60s;

max はキャッシュの数を指定し、オープンファイルの数と同じにすることを推奨します。

9. open_file_cache_valid 80s.

これは、有効な情報がないかキャッシュをチェックする頻度です。

10. open_file_cache_min_uses 1.

open_file_cacheディレクティブのinactiveパラメータ時間にファイルが使用された最小回数。この回数を超えると、上記の例のように、ファイルディスクリプタは常にキャッシュにオープンされ、inactive時間に一度も使用されていないファイルがあれば、それは削除されます。

第二に、カーネルパラメータの最適化について:

net.ipv4.tcp_max_tw_buckets = 0060

デフォルトは 180000 です。

net.ipv4.ip_local_port_range = 1024 05600

システムが開くことを許可するポートの範囲。

net.ipv4.tcp_tw_recycle = 1

タイムウェイト高速リサイクルを有効にします。

net.ipv4.tcp_tw_reuse = 1

再使用を有効にします。TIME-WAIT ソケットを新しい TCP 接続に再使用できるようにします。

net.ipv4.tcp_syncookies = 1

SYN待ちキューのオーバーフローを処理するために、SYNクッキーを有効にします。

net.core.somaxconn = 262144

Webアプリケーションのリッスン機能のバックログは、net.core.somaxconnカーネルパラメータではデフォルトで128に制限されており、nginxで定義されているNGX_LISTEN_BACKLOGはデフォルトで511なので、この値を調整する必要があります。

net.core.netdev_max_backlog = 262144

各ネットワークインターフェイスがパケットを受信する速度が、 カーネルがそれらのパケットを処理する速度よりも速い場合に、 キューに配送されることを許されるパケットの最大数。

net.ipv4.tcp_max_orphans = 262144

1 つのユーザ・ファイル・ハンドルに関連付けられていない、システム内の TCP ソケットの最大数。この数を超えると、 孤立したコネクションは即座にリセットされ、警告メッセージが出力されます。この制限は、単純な DoS 攻撃を防ぐためだけのものであり、これに頼ったり、人為的に減らしたりしてはいけません。

net.ipv4.tcp_max_syn_backlog = 262144

クライアントからの確認応答をまだ受け取っていない接続要求に対して記録される最大値。デフォルト値は、128MのRAMを持つシステムでは1024、それ以下のRAMを持つシステムでは128です。

net.ipv4.tcp_timestamps = 0

タイムスタンプはシーケンス番号の巻き上がりを防ぎます。1Gbpsのリンクでは、以前に使われたシーケンス番号に遭遇することになります。タイムスタンプはカーネルがそのような "変わった "パケットを受け入れることを可能にします。これはオフにする必要があります。

net.ipv4.tcp_synack_retries = 1

相手側との接続をオープンするために、カーネルは、3つのハンドシェイクのうちの2番目として知られている、前のSYNへの応答としてACKを持つSYNを送信する必要があります。この設定は、接続を中止するためにカーネルが送信するSYN+ACKパケットの数を決定します。

net.ipv4.tcp_syn_retries = 1

カーネルが接続の確立をあきらめるまでに送信したSYNパケットの数。

net.ipv4.tcp_fin_timeout = 1

このパラメータは、相手側からの要求でソケットがクローズされた場合に、そのソケットが FIN-WAIT-2 状態を維持する時間を決定します。相手側は、予期せずクラッシュした場合でも、コネクションを閉じないというミスを犯す可能性があります。デフォルト値は60秒です。2.2 カーネルの通常の値は180秒です。3 このように設定することもできますが、マシンの負荷が軽いウェブサーバであっても、大量のデッドソケットによってメモリがオーバーフローする危険性があることを覚えておいてください。より長く生き残ります。

net.ipv4.tcp_keepalive_time = 30

TCPがkeepaliveを有効にしているときにkeepaliveメッセージを送信する頻度。デフォルトは 2 時間です。

第三に、完全なカーネル最適化のセットアップを以下に掲載します。

vi /etc/sysctl.conf CentOS 5.5では、すべての内容をクリアして、以下のように置き換えることができます。

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

以下のコマンドを使用すると、設定が直ちに有効になります:

/sbin/sysctl -p

第四に、システム接続数の最適化についてです。

Linuxのオープンファイルと最大ユーザープロセスのデフォルト値は2014です。

#ulimit -n

2014

#ulimit Cu

2014

問題の説明: これは、サーバーが1024個のファイルしか同時に開くことができず、1024個のユーザープロセスを処理できないことを意味します。

現在のシステムのすべての制限値を見るには ulimit -a を使い、現在の開いているファイルの最大数を見るには ulimit -n を使います。

新しくインストールされたlinuxのデフォルトのサイズは1024しかなく、負荷の高いサーバーを使用している場合、開いているファイルが多すぎるというエラーが発生しやすくなっています。そのため、サイズを変更する必要があります。

解決策

修正点は以下の3つ:

1. /etc/rc.local に ulimit -SHn 65535 という行を追加します。

2. /etc/profile に ulimit -SHn 65535 という行を追加します。

3. **/etc/security/limits.conf**の最後に追加します:

*** ソフトファイル 65535***

*** ハード nofile 65535***

*** ソフト nproc 65535****

*** ハード nproc 65535*** *** ハード nproc 65535***

どちらを使うべきかという点では、1番目の方法はCentOSでは効果がなく、3番目は効果があり、2番目はDebianで効果があります。

ulimit -n

ulimit -u

注: ulimit コマンド自体にはソフトとハードの設定があり、-H はハード、-S はソフトです。

ソフトリミットとは、現在有効なシステム設定のことです。 ハードリミットは、通常のユーザーが下げることができます。上げることはできません。 ソフトリミットをハードリミットより高く設定することはできません。 rootユーザーのみがハードリミットを上げることができます。

V. 以下は簡単な 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 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
fastcgi_temp_file_write_size 8k;
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 backup.aiju.com;
index index.php index.htm;
root /www/html/;
location /status
{
stub_status on;
}
location ~ .*/.(php|php5)?$
{
fastcgi_pass .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 キャッシュのパス、ディレクトリ構造レ ベル、キーワード領域保存時間、非アクティブ削除時間を指定します。

fastcgi_connect_timeout 300。

バックエンド FastCGI への接続タイムアウトを指定します。

fastcgi_send_timeout 300。

FastCGI にリクエストを送信するタイムアウト。 この値は、2 つのハンドシェイクが完了した後に FastCGI にリク エストを送信するタイムアウトです。

fastcgi_read_timeout 300。

FastCGI 応答を受信するタイムアウト。この値は、2 つのハンドシェイクが完了した後に FastCGI 応答を受信するタイムアウトです。

fastcgi_buffer_size 4k。

FastCGI レスポンスの最初の部分を読むのに必要なバッファサイズを指定し ます。 通常、レスポンスの最初の部分が 1k を超えることはなく、ページサ イズが 4k なので、バッファサイズは 4k に設定されます。

fastcgi_buffers 8 4k.

FastCGI 応答をバッファするためにローカルで必要なバッファの量と大きさを指定します。

fastcgi_busy_buffers_size 8k。

このディレクティブが何をするのか、デフォルト値が fastcgi_buffers の 2 倍であること以外はわかりません。

fastcgi_temp_file_write_size 8k;

fastcgi_temp_path への書き込み時に使用されるデータブロックの大きさ。デフォルト値は fastcgi_buffers の 2 倍の大きさです。

fastcgi_cache TEST

FastCGIキャッシュを有効にし、名前を付けます。個人的には、CPUの負荷を減らし、502エラーを防ぐために、キャッシュを有効にすることはとても便利です。

指定した回答コードのキャッシュ時間を指定します。例えば、上記の例では、200、302の回答は1時間、301の回答は1日、その他は1分間キャッシュされます。

fastcgi_cache_min_uses 1;

fastcgi_cache_path ディレクティブの inactive パラメータ値の時間内にキャッシュが使用される最小回数です。上の例のように、ファイルが 5 分間に一度も使用されなければ、そのファイルは削除されます。

fastcgi_cache_use_stale エラー タイムアウト invalid_header http_500.

このパラメータの目的は分かりませんが、nginxにどのタイプのキャッシュが無駄かを知らせるものだと思います。上記はnginxのFastCGI関連のパラメータですが、FastCGI自体にも最適化が必要な設定があるので、php-fpmでFastCGIを管理している場合は、設定ファイルで以下の値を変更します:

60

つまり、同時接続を処理するために最大60のサブスレッドをオープンします。

開いているファイルの最大数。

各プロセスがリセット時に実行できるリクエストの最大数。

上記のコンテンツは、時間の進歩で多くのPHPerは常にいくつかの問題やボトルネックに遭遇するあなたを助けるために願って、ビジネスコードは、方向感覚よりも多くを記述するために、私は、材料の数を照合している改善するためにどこから始めればわからないが、これらに限定されない:分散アーキテクチャ、高いスケーラビリティ、高性能、高同時性、サーバーのパフォーマンスチューニング、TP6、laravel、YII2、Redis、Swoole、Kafka、Mysqlの最適化、シェルスクリプト、マイクロサービス、Nginxおよび他の多くの知識ポイント高度な乾物は無料で共有することができます。Swoole、Swoft、Kafka、Mysqlの最適化、シェルスクリプト、Docker、マイクロサービス、Nginxおよび他の多くの知識ポイント高度な高度な乾物は、みんなと共有するために自由にする必要があり、ここを突く必要があります!

Read next

アプレットの問題と解決策

* 1.イントラネットのインターフェイスは、開発ツールではアクセスできますが、体験版ではアクセスできません。\nジュニアは、右上隅にある3つの点を---のようにクリックして、開発者デバッグを開き、再入力してみてください。\n冷静な分析:イントラネットは、通常、証明書ではなく、HTTPSではありませんので、開発では

Aug 2, 2020 · 1 min read