Open9

サーバ構築メモ

ktkt

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サーバーを兼務できない

引用資料:
https://www.sbbit.jp/article/cont1/65256
https://www.a-frontier.jp/technology/performance02/

ktkt

Unixドメインソケット

POSIX系OSで提供されている機能
コンピュータ内部でしか使えない代わりに、高速に通信が行える

POSIX:
UNIX系OSに共通する機能などについて、
プログラムからの呼び出し方法などの標準を定めた規格
https://e-words.jp/w/POSIX.html

TCPとUDPによるソケット通信

◯外部のネットワークに繋がるインタフェースに接続

Unixドメインソケット

×外部インタフェースへの接続は行わない
◯カーネル内部で完結する高速なネットワークインタフェースを作成

ウェブサーバとNGINXなどのリバースプロキシとの間、
あるいはウェブサーバとデータベースとの間の接続を高速にできる場合あり

<使い方>

ファイルシステムのパスを指定する

引用資料:
https://ascii.jp/elem/000/001/415/1415088/#:~:text=TCPとの違いは,もまったく変わりません。

ktkt

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

引用資料:
https://webkaru.net/linux/php-fpm-server-reached-pm-max-children-warning/

ktkt

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
http://nginx.org/en/docs/ngx_core_module.html#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プロセスが開ける最大コネクション数
  ...
}

引用資料:
https://qiita.com/mikene_koko/items/85fbe6a342f89bf53e89

ktkt

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の値を上げていく

引用資料:
https://qiita.com/nnmr/items/a521fb4e18931cc647d6#warning-pool-www-seems-busy-you-may-need-to-increase-pmstart_servers-or-pmminmax_spare_servers-spawning-x-children-there-are-x-idle-and-x-total-children

ktkt

nginx関連の観測エラー系記事

fastcgi_buffer_size

FastCGIサーバから応答の最初の部分を読み込むために使われるバッファのsizeを設定
デフォルトでは、バッファサイズはメモリページと同じサイズ

引用記事:
http://mogile.web.fc2.com/nginx/http/ngx_http_fastcgi_module.html#fastcgi_buffer_size

an upstream response is buffered to a temporary file

メモリバッファが一杯になったのでファイルに吐き出しているという内容
デフォルトのメモリバッファの大きさは実行している計算機/OSのページサイズと
同じ値(4KBか8KB)となっており、これを大きくすることで解消できる

proxy_buffer_sizeを変更するときは、proxy_buffersも整合を持たせて変更する必要あり

引用記事:
https://www.torutk.com/projects/swe/wiki/Nginxの設定

ktkt

スレッドセーフ

マルチスレッド環境において、コンピュータプログラムを複数のスレッドで並行して実行しても
問題が生じない仕様や設計になっていること

引用資料:
https://e-words.jp/w/スレッドセーフ.html

ktkt

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 待機プロセスの最大数

引用資料:
https://kazuhira-r.hatenablog.com/entry/2021/02/07/214642

公式:
https://httpd.apache.org/docs/2.4/en/mod/worker.html

ktkt

サーバ内でシェルのファイル一覧を表示する

# ルートディレクトリから全てのshファイルを表示
find / -name "*.sh"