AmazonLinux+nginx+php-fpmでwordpressの高速化する時の設定のチューニングについてもう少し調べたのでメモ
nginx
・worker_procceses
syntax :worker_proccesses number|auto;
default :worker_proccess 1;
context :main
nginxが生成するworkerproccessの数を指定。様々な要因によって最適な値は変わるが、目安としてはcpuのcore数。autoでcpuのcore数を自動検出。workerproccessの数を増やせば多くのacceessをさばけるようになる。
・worker_connections
syntax :worker_connections number;
default:512;
context:events
1つのworkerproccessがさばける接続数。ここでの接続はクライアントだけではなく、プロキシなどとの接続も含む。worker_rlimit_nofileの値を変更できないため、連動して変更する必要がある。
・worker_rlimit_nofile
syntax:worker_rlimit_nofile number;
default:-
context:main
workerproccessたちが同時に開けるファイルディスクリプタの最大数。OSの設定sys.fs.file-maxの値を超えられないので、これと連動して変更する必要あり。(ファイルディスクリプタとはファイルや標準入出力を識別するために用いる識別子)
・accept_mutex,accept_mutex_delay
排他制御に関わる設定らしい。
設定すると、場合によってはパフォーマンスが上がるらしいが、正直公式のドキュメント読んでもよくわからない。
reuseportを使うならこの設定はいらないらしい。
・sendfile,tcp_nopush
syntax:sendfile on|off;
default:off
context:http
linuxのsendfile apiを使う。カーネル空間内でファイルの読み込み送信が完了するので、効率よくファイルの送信ができるらしい。
syntax:tcp_nopush on|off
default:off
context:http
sendingfileをonにしていると使える。linuxのオプションを使って、レスポンスヘッダとファイルの内容をまとめて送るようになるらしい。
・keepalive_timeout
syntax:keepalive_timeout number
default :75
context:http
0を指定すると無効化。
一度確立したセッションを一定時間保持し再利用することで、セッション確立のオーバーヘッドを削減して効率化。
・open_file_cache
syntax:open_file_cache off| max=number [inactive=time]
default:off
context:http
ファイルのディスクリプタ、サイズ、タイムスタンプ、ディレクトリの存在情報、404などのエラー情報をキャッシュする。
max でキャッシュする最大数を指定。キャッシュがいっぱいになったあとはLRUで削除されていく。
inactiveで指定した秒数アクセスがなければ、キャッシュから削除(デフォルトは60s)
ファイル本体をキャッシュするわけではないので、パフォーマンスがあまりあがらないかも。
・tcp_nodelay
syntax:tcp_nodelay on|off
default:on
context:http
onなら高速ネットワークでパフォーマンスが向上する可能性がある。
本来、tcp_nodelayと、tcp_nopushは相反する動作をするが、nginxはこれらを併用可能な実装をしている
nopushでパケットの送信を遅延→nopush off→nodelayでフラッシュ
・listen
①backlog=number
クライアントからリクエストを送ると、まずosとtcpセッションを確立してから、サーバーにacceptされるらしいが、acceptできないほど接続数が多ければ、tcpセッションを保持したままソケットキューというキューに入れられる(ソケットキューはポートごとに作られる)
backlogでソケットキューの長さを指定。
ソケットキューの長さはosの方でも設定があって(net.core.somaxconn)、そちらのほうがbacklogより優先されるのでそちらも適宜書き換える。
http://u-kipedia.hateblo.jp/entry/2015/01/01/001135
https://qiita.com/nk_yohn3301/items/515733ed244ee3f35522
②fastopen=number
数字を設定するとonになる
数字はtcpセッション確立(3way handshake)が済んでいないリクエストを入れるキューの長さ
onにするとtcpセッション確立のオーバーヘッドを削減できる
公式のドキュメントにDo not enable this feature unless the server can handle receiving the same SYN packet with data more than once.と書いてあるけれどいまいちよくわからない…
③reuseport
複数のプロセスが1つのポートをバインド出来るようになるらしい
そしてカーネルがどのworkerプロセスにリクエストをふるか決めるようになり、レイテンシを下げ、パフォーマンスを向上させるらしい。
https://no-ne.ws/computer/773
公式ドキュメントによるとInappropriate use of this option may have its security implications.とのこと
・ssl_session_cache
syntax: ssl_session_cache off|none|builtin[:size]|shared:name:size
default:none
context:server
tlsセッション確立のオーバーヘッド削減に役立つ
offで完全にオフ
noneでオフなんだけど、クライアントに再利用されるかもと通知するらしい
builtin opensslに組み込まれているキャッシュ。一つのworkerプロセスにしか使われない。sizeを指定しないと、20480件をキャシュするらしい。公式ドキュメントによると、メモリのフラグメンテーションを起こしうるらしい。
shared 全てのworkerプロセスでキャッシュが共有される。size1Mあたりおよそ4000セッション保存。キャッシュに名前をつけなければならない。複数のvirtual serverでキャッシュの名前は共有される。
・ssl_session_timeout
ssl_session_timeout time
default:5m
context:server
セッションのキャッシュの保持時間の設定
・ssl_session_tickets
syntax:ssl_session_tickets on|off
default:off
context:server
セッション情報を暗号化してクライアントに送り、それを用いることでtlsセッション確立のオーバーヘッド削減に役立つ
https://techblog.yahoo.co.jp/infrastructure/ssl-session-resumption/にはcacheとticketsはきちんと運用すればセキュリティ上問題ないことが書いてある
・ssl_stapling
syntax ssl_stapling on|off
default:off
context:server
・ssl_stapling_verify
syntax:ssl_stapling_verify on|off
default:off
context:server
・ssl_trusted_certificate
公式ドキュメントによるとIf the ssl_certificate file does not contain intermediate certificates, the certificate of the server certificate issuer should be present in the ssl_trusted_certificate file.とのこと。よくわからない…
・resolver
syntax:resolver ip [valid=time]
oscpレスポンダのip指定。validで有効時間指定。
・resolver_timeout
resolver_timeout time
oscpレスポンダへの問い合わせのタイムアウト指定。
本来tlsセッションをする時に認証局に問い合わせをして証明書が有効か確認するが、認証局が持っているoscpレスポンダというサーバーに問い合わせて確認することで一定時間有効か確認せずに済むようになりtlsセッション確立のオーバーヘッド削減に役立つ
https://rms-digicert.ne.jp/howto/basis/enabling-ocsp-stapling.html
・ssl_buffer_size
syntax ssl_buffer_size size
default:16k
context:server
tlsは一定サイズごとに通信暗号化するがデフォルトの16kだと大きすぎて、通信が遅くなる原因になるらしい。
自分が見たサイトでは4kを推奨していた。TTFB改善に役立つらしい。
・スレッドプール
http,server,locationのいずれかのcontextでaio threads;と書けば良い。 詳しい仕組みは、 https://fa-works.com/blog/thread-pools-boost-performance-9x
OS
・sys.fs.file-max
OS全体で使えるファイルディスクリプタの数。
・net.core.somaxconn
ソケットキューの長さ指定
・sys.net.tcp_fastopen
linuxでのtcpfastopenの設定
よくわからないが3を設定すると、クライアント側、サーバー側で有効になるため3がいいらしい。
http://asnokaze.hatenablog.com/entry/2017/05/09/223534 によると、時折謎な挙動をすることがあるらしい
https://html5experts.jp/jxck/3529/
http://kernhack.hatenablog.com/entry/2013/05/25/115634
・net.ipv4.tcp_fin_timeout
tcpプロトコルの細かい部分を理解していないのでよくわからないが、低すぎると問題になるらしい。
http://server.etutsplus.com/kernel-setting-tcp-fin-timeout/
プラグイン
headcleaner 不要なタグ、空白を削除したり、タグをまとめたり、CSSを圧縮したりするプラグイン。高速化に役立つと思われる。
unveil lazyload 画像の遅延読み込み。スクロールして画像の近くに来たら読み込む。読み込みデータ量の削減、httpリクエスト数の削減が出来るため、高速化に役立つと思われる。
php-fpm
php-fpmの設定ファイルで
pm = dynamic pm.max_children = 8 pm.start_servers = 2 pm.min_spare_servers = 2 pm.max_spare_servers = 4 pm.max_requests = 500
とするのがある程度一般的らしい。
max_children 同時に実行可能な子プロセス数
start_servers プロセス開始時に生成される子プロセス数
min_spare_server 待ち状態の子プロセスの最小数
max_spare_server 待ち状態の子プロセスの最大数
https://blog.xn--krsgw–n73t.com/blog/diary/php-fpm