Apache から Nginx へ乗り換え

スポンサーリンク

 もう自分が Linux に触ったときから Web Server = Apache だったのだが、ここ数年は Nginx が凄い勢いでシェアを伸ばしつつあると感じる。Nginx は Web Server としても良いし、Load Balancer や Reverse Proxy としても重宝されている。
 Nginx の読み方はエンジンエックス と読むみたい。Engine X というこのスペルから E を抜いた物になるのが、何か意味ありげ。
 色んな技術系のサイトを見ていると「とにかく速い」「高負荷時にアドバンテージ」なんて謳い文句を見かける。ちょっと興味が湧いてしまったから、WMware に作ってある検証環境で実験したら確かに速いと体感したので、これは稼働ホストも Apache から卒業しようかなと。


 Apache から離れられなかった原因は .htaccess が余りに便利過ぎたからで、同じ制御を Nginx で行うのであれば結構な改修が必要だったから。だが、それも Nginx について勉強を進めていくうちに Nginx は設定の記述が簡潔で分かりやすいと分かってきた。
 .htaccess で数行書けてゴチャゴチャと書いてきたことが Nginx ならさらっと書けてしまったり。
 例えばこのコンテンツでやっている BOT の処理。

# ========== Apache (.htaccess)
SetEnvIf User-Agent "Baiduspider" acl_ng
SetEnvIf User-Agent "BaiduImagespider" acl_ng
SetEnvIf User-Agent "MJ12bot" acl_ng
Order Allow,Deny
Allow from all
Deny from env=acl_ng

# ========== Nginx
map $http_user_agent $ignore_bot {
    default 0;
    ~*(Baiduspider|BaiduImagespider) 1;
    ~*MJ12bot 1;
}
server {
    ..
    ..
    if ( $ignore_bot = 1 ) {
        return 403;
    }
}

 コードの見た目が綺麗。Nginx の map ディレクティブがなかなかイイ感じで、上記の例だと UA に左辺がマッチすれば $ignore_bot に右辺の “1” がセットされる。マッチしなければ default で示される “0” がセットされる。左辺では正規表現も扱えるから、より簡単な記述が可能。
 if 文で評価するときに 1 であれば拒否したい UA が含まれる意味になるから 403 を返してしまうと。
 ただ、map ディレクティブは http ブロックに記述するので、他の VirtualHost と内容を共有する事になる。セットする変数名は変えていった方が良い。でもあまり map を書きすぎてもなんだかなーなのでむずい所。
 更には HTTP/2 が実装されているので、簡潔な記述で直ぐに対応可能だった。

server {
    listen       443 ssl http2;
    server_name  bucci.bp7.org;
..
..

 ただ単に listen 443 で既存の HTTP/1.1 な SSL/TLS 通信 だが、更に ssl http2 と加えれば HTTP/2 でアクセス出来るし、非対応クライアントならフォールバックして HTTP/1.1 になる。Apache なら現状は 2.4.17 のソースからビルドしつつ、nghttp2 も必要だし、依存する spdylay もビルドしなきゃならない。更には OpenSSL 1.0.2 以降だったかそれもビルドしないといけない。結構大変だし実験的な実装でもあるからややこしくなりそう。
 他にもデフォルトサーバーを明示的に定義出来る所も良かった。Apache なら一番最初に定義されているホストがデフォルトになるから、ホスト毎にファイルを分けた場合にはファイル名にまで気を使うことすらあった。
 まだまだ良いと思った点はあるけど、全て書いていたら切りが無いから、またこのブログのホストで各種ベンチマークなどをやった結果をはってみたりする。
 GTmetrix
19_nginx_gtmetrix
 Google PageSpeed Insights
19_nginx_googlespeed
 Pingdom Website speed test
19_nginx_pingdom
 h2load -n 1000 -c 10 https://~~

$ h2load -n 1000 -c 10 https://bucci.bp7.org/
starting benchmark...
spawning thread #0: 10 total client(s). 1000 total requests
TLS Protocol: TLSv1.2
Cipher: ECDHE-RSA-AES128-GCM-SHA256
Application protocol: h2
progress: 10% done
(snip.
progress: 100% done

finished in 900.30ms, 1110.74 req/s, 65.50MB/s
requests: 1000 total, 1000 started, 1000 done, 1000 succeeded, 0 failed, 0 errored, 0 timeout
status codes: 1000 2xx, 0 3xx, 0 4xx, 0 5xx
traffic: 61838490 bytes total, 276000 bytes headers (space savings 4.17%), 61481000 bytes data
                     min         max         mean         sd        +/- sd
time for request:     3.82ms     18.55ms      8.00ms      2.03ms    78.70%
time for connect:    90.33ms     97.71ms     92.88ms      2.57ms    80.00%
time to 1st byte:   100.47ms    108.57ms    104.70ms      2.52ms    60.00%
req/s (client)  :     111.19      113.20      111.80        0.59    70.00%

 こんな調子に速いので、.htaccess にいつまでも捕らわれず、さっさと乗り換えて正解だったと思う。

スポンサーリンク