サーバ構築メモ
NginxとApacheの比較
以下、引用内容
Nginx:特化タイプのWebサーバ
Apache:オールマイティータイプのWebサーバ
Apache:
すべての動作を平均的にこなすことができる、オールマイティーなWebサーバ
Nginx:
静的コンテンツの表示
リバースプロキシ、
ロードバランサー
といったWebサーバとしての基本的な動作を得意とする
Apacheに比べ、サーバのメモリ消費量を抑えることができる
Nginx=シングルスレッドのプロセス
たくさんのリクエストを並列で処理するアーキテクチャー
Apache=マルチプロセス
1リクエストに対して1プロセスで処理を行う
Apacheは同時接続のリクエストが増えれば増えるほどプロセスが増加
↓
サーバのメモリを消費→メモリ使用に限界→サーバがパンク
↓
C10K問題
大量のクライアントからのアクセスを同時に処理しようとすると
レスポンスが大きく下がる
Nginxのメリット
-
多くのリクエストを並列で早く処理することができる
→同時接続数が多い大規模サイトで力を最大限に発揮できる -
サーバのメモリ使用量を抑えることができる
-
サーバ台数、スペック低下によるコストダウン
デメリット
Webアプリケーションでよく用いられるPHPやPerl、CGIなどで実装される
動的コンテンツのようなCPUを使った処理が苦手
CPUを使用する処理は苦手なため、WebサーバーとAPサーバーを兼務できない
引用資料:
Unixドメインソケット
POSIX系OSで提供されている機能
コンピュータ内部でしか使えない代わりに、高速に通信が行える
POSIX:
UNIX系OSに共通する機能などについて、
プログラムからの呼び出し方法などの標準を定めた規格
TCPとUDPによるソケット通信
↓
◯外部のネットワークに繋がるインタフェースに接続
Unixドメインソケット
↓
×外部インタフェースへの接続は行わない
◯カーネル内部で完結する高速なネットワークインタフェースを作成
ウェブサーバとNGINXなどのリバースプロキシとの間、
あるいはウェブサーバとデータベースとの間の接続を高速にできる場合あり
<使い方>
ファイルシステムのパスを指定する
引用資料:
PHP-FPMのエラー
WARNING: [pool www] server reached pm.max_children setting (50)
Warningエラーに表示されているようにプロセスマネジャー(pm)の
子プロセスの数が最大値(max、ここでは50)に達していることが原因
対応
↓
PHP-FPMの設定ファイル(/etc/php-fpm.d/www.conf)を編集
pm.max_children = 100
引用資料:
Nginxのエラー worker_connections are not enough
777 worker_connections are not enough
worker_connectionsが足りなくなってしまっている
ここの値を上げるに当たってworker_rlimit_nofileも上げる必要あり
worker_rlimit_nofile
↓
Nginxのworker_connectionsの1workerプロセスにおける、 ファイルディスクリプタの上限値
Nginx - worker_rlimit_nofile
ファイルディスクリプタ
↓
プログラムがアクセスするファイルや標準入出力などをOSが識別するために用いる識別子
OSのファイルを扱える数
↓
OSごとにいくつファイルを扱えるか限界が決まっている
Nginxが動いているサーバーに入って確認
$ cat /proc/sys/fs/file-max
777
確認する理由
↓
OSで扱えるファイル数以上のファイルディスクリプタをNginxで使う設定すると・・
↓
NginxでOSで扱えない量のファイル数を見に行ってしまうのでエラーになる。
超えない値に調整する必要があり、そのために現状のOSで扱える最大ファイル数を確認する必要があります
worker_connectionsのプロセスがいくつ動いているか?
nginx.confを確認
worker_processes 6;
# CPUコア数でプロセス数をNginxが自動設定するので調べる必要あり
worker_processes auto;
設定値の選定
workerプロセス数 * 設定する予定のworker_rlimit_nofileの値 < OS全体で扱えるファイル数以下の値
S全体で扱えるファイル数 / workerプロセス数 = 設定すべきworker_rlimit_nofileの値
↑上限ギリギリは良くないので 5% くらい減らす
worker_connections??
↓
Nginxのworker_connectionsの1workerプロセスにおける、ファイルディスクリプタの上限値
worker_connections * 2 < worker_rlimit_nofile
↑の理由:
1接続で2ファイルディスクリプタを使う
通常、1つの接続につき以下のファイルディスクリプタを消費
- エフェメラルポート用のソケットファイル
- 実際に返答するコンテンツファイル
通常のケースで設定やバックエンドシステムによってはもっと増える可能性あり
基本的には設定したファイルディスクリプタの半分の値
一応余裕を持って3~4倍が良さげ
設定例:
worker_rlimit_nofile 83000; # worker_connections の2~4倍以上の値を設定。OS全体で扱うことができるファイル数を超えないように注意
events {
worker_connections 4096; # 1つのworkerプロセスが開ける最大コネクション数
...
}
引用資料:
PHP-FPMのエラー WARNING: [pool www] seems busyについて
pm.max_children
↓
同時に処理をする可能性がある子プロセス数
pm.start_servers
↓
プロセス開始時に生成される子プロセス
pm.min_spare_server
↓
待ち状態の子プロセスの最小の数
もし待ち状態のプロセスの数がここに設定されている数値より少ない場合、
何個かの子プロセスが作成される
pm.max_spare_server
↓
待ち状態の子プロセスの最大の数
もし待ち状態のプロセスの数がここに設定されている数値より多い場合、
何個かの子プロセスが消される
WARNING: [pool www] server reached pm.max_children setting (XXX), consider raising it
pm.max_childrenの値が小さい場合に発生する
↓
pm.max_childrenの値を大きくする
pm.start_servers = 3
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning X children, there are X idle, and X total children
pm.max_children, pm.start_servers, pm.min_spare_server, pm.max_spare_server の
値次第で子プロセスの数が左右しますよというもの
単純にpm.start_serversの値を上げることで対応できるが、以下パターンで対応が 分岐
pm.max_spare_serversを上げていくと一回のプロセスで生成される子プロセスの数が増加するため、
pm.max_childrenの数値を上げる必要もある
pm.max_childrenの値を大きくする
↓
- "there are 0 idle"が連続する場合
- "there are X idle"の数値が何かしらの数字で連続する場合
"there are 0 idle"が連続する場合
こちらは実質で待機プロセスが発生していないのでそのままでも問題ないhttp://kakakakakku.hatenablog.com/entry/2016/04/13/222912
もしメモリに余裕があるのならば、エラーが無くなるまでpm.start_serversの値を上げていく
"there are X idle"の数値が何かしらの数字で連続する場合
数値がpm.max_spare_serversを超えるタイミングが無ければ恐らく問題ない
超過する場合、pm.max_spare_serversを超えるエラーが無くなるまで
pm.start_serversの値を上げていく
引用資料:
nginx関連の観測エラー系記事
fastcgi_buffer_size
FastCGIサーバから応答の最初の部分を読み込むために使われるバッファのsizeを設定
デフォルトでは、バッファサイズはメモリページと同じサイズ
引用記事:
an upstream response is buffered to a temporary file
メモリバッファが一杯になったのでファイルに吐き出しているという内容
デフォルトのメモリバッファの大きさは実行している計算機/OSのページサイズと
同じ値(4KBか8KB)となっており、これを大きくすることで解消できる
proxy_buffer_sizeを変更するときは、proxy_buffersも整合を持たせて変更する必要あり
引用記事:
スレッドセーフ
マルチスレッド環境において、コンピュータプログラムを複数のスレッドで並行して実行しても
問題が生じない仕様や設計になっていること
引用資料:
apache prefork MPMの設定値メモ
見本
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
ServerLimit 256
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
| ディレクティブ名 | 説明 |
|---|---|
| StartServers | 最初に起動するプロセス数 |
| MaxRequestWorkers | プロセス数の上限(MaxRequestWorkersよりも大きい値である必要がある) |
| ServerLimit s | プロセス数の上限(プロセス数の上限(MaxRequestWorkersよりも大きい値である必要がある) |
| MinSpareServers | 待機プロセスの最少数 |
| MaxSpareServers | 待機プロセスの最大数 |
引用資料:
公式:
サーバ内でシェルのファイル一覧を表示する
# ルートディレクトリから全てのshファイルを表示
find / -name "*.sh"