[nginx] （nginxに）跪くまで5分だけ！！

早い話がnginxに乗り換えようかなって考えてる人を後押しするための記事です。
もう既にnginxの人はお呼びではないかもしれませんが、あったあったて頷いてくれると嬉しいです。
独白視点で興奮気味に語っていきます。
（以下Apache = Apache HTTP Serverです。）

##経緯
CentOS7でWEB + PHP + Node.jsという新しいシステムを構築しようとしていた時にQiitaで結構目についたnginxという言葉。

* [CentOSにNodeJS+nginxの環境を構築する](http://qiita.com/polidog/items/e94f9cbb32b603042698)
* [はじめは躓くよCentOS7セットアップ](http://qiita.com/egnr-in-6matroom/items/8bda88125f56ee68448a)
* [nginx + php-fpm socketで接続する](http://qiita.com/monkick@github/items/610d1435d812beb853e2)

nginxとは一体なんぞや？
google先生は今日も博識だった。

##出会い
まぁ、まずは[Wikipedia](http://ja.wikipedia.org/wiki/Nginx)を見ないことには始まりませんね。（一部抜粋）

>nginxは、フリーかつオープンソースのWebサーバである。
>加えて、HTTP、SMTP、POP3、IMAPのリバースプロキシの機能も持つ。
>処理性能・高い並行性・メモリ使用量の小ささに焦点を当てて開発されている。

* え、Webサーバーなの？
  Apacheしか知らなかった俺氏にとっては新しい技術なんじゃね？（好奇心むき出し）

* そしてリバースプロキシ機能付き！
Node.jsとの連携がクソ楽勝になるじゃん！！

* そして高性能！！
なんと！？
そんなすごいWebサーバーがあるのですか？

##プログラムはあなたの思ったように動かなくても、設定に書いてあるように動く
Apacheは嫌いだった。
そんなに頻繁に人が訪れるサイトを管理しているわけではないので速度や[C10K問題](http://d.hatena.ne.jp/yohei-a/20120504/1336157667)なんてどうでもよかった。
最も許せず、わかり辛かったことは設定ファイルである。
何度も何度もGoogle先生に聞いて、ダブってる箇所を訂正しエラーを潰していく。
Apacheの設定を変えることは本当に一日仕事だった。

だがnginxの設定ファイルはわけが違った。
（設定ファイルのPathについてはUbuntu・Arch Linux環境におけるものです。）

```nginx:/etc/nginx/nginx.conf
user  nginx nginx;
worker_processes  8;

error_log  /var/log/nginx/error.log warn;

events {
    worker_connections  1024;
}

http {
    server_tokens off;
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_iso8601] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    charset         UTF-8;
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout             0;
    keepalive_timeout              65;
    server_names_hash_bucket_size  64;
    types_hash_max_size            4096;
    types_hash_bucket_size         128;

    #gzip  on;

    # SSL関係の設定
    ssl_session_cache    shared:SSL:50m;
    ssl_session_timeout  1d;
    ssl_session_tickets  off;

    ssl_protocols  TLSv1.2 TLSv1.3;
    ssl_ciphers    ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256;

    ssl_prefer_server_ciphers  on;

    # OCSP Stapling
    ssl_stapling         on;
    ssl_stapling_verify  on;

    # HSTS
    # RootDomainがあるServerでのみ有効化（SubDomainで有効化しても無意味）
    #add_header Strict-Transport-Security  'max-age=31536000; includeSubDomains; preload';

    # server設定ファイルを以下のPathから読み込む
    include /etc/nginx/conf.d/*.conf;
}
```

```nginx:/etc/nginx/conf.d/default.conf
geo $access_allowed {
    default 0;
    127.0.0.1 1;
    192.168.0.0/24 1;
}

server {
    listen       80;
    server_name  localhost;

    charset     UTF-8;
    access_log  /var/log/nginx/localhost/access.log  main;
    error_log   /var/log/nginx/localhost/error.log;

    location / {
        root   /var/www;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
        if ($access_allowed = 0) { return 403; }
    }
    
    # pass the PHP scripts to FastCGI server listening on /var/run/php5-fpm.sock

    location ~ \.php$ {
        root           /var/www;
        fastcgi_pass   unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    }
}
```

テスト環境のみで使っているコンフィグファイルの**丸コピ（全文）**である。
細かいことは気にしなくていい。
だが、はっきりとわかることがあると思う。

**そう！Apacheとは比にならないほど綺麗であると！**
VirtualHostの設定がどこそこでロードファイルの読み込みがどこそこでサーバールートの設定がどこそこで・・・
そして意味不明なコンフリクト（設定の衝突・競合）が発生するのである。
**勘弁しろ下さい！！**

##で？
**Apacheは金輪際出入り禁止！！**
nginx初見者の俺氏にとって死角はなかった！！
Apacheさんにはテスト環境からも本番環境からも即刻退去してもらいました。

##nginxのいいとこまとめ

* リバースプロキシ機能付きWebサーバー（各言語のWebフレームワークと相性いい）
* リバースプロキシ機能を全面に押し出して使用することも可能
* （↑ロードバランサー・SSLアクセラレーション・WAF・Apacheとの共存）
* 同時接続数がApacheの10～100倍は耐えられます（開発者の言葉）
* [多分これが一番早いと思います](http://dic.nicovideo.jp/a/%E5%A4%9A%E5%88%86%E3%81%93%E3%82%8C%E3%81%8C%E4%B8%80%E7%95%AA%E6%97%A9%E3%81%84%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99)
* メモリの扱いがApacheより上手い
* 設定ファイルがスクリプトライクで簡潔
* 軽量サーバーの中では一番の有望株（長く使われるほど、お手入れが活発化する）


##以上で５分位だと思いますが、それ以上にnginxをよく知るためのリンク集
* [高速・軽量・高機能……Nginxの基礎知識](http://www.atmarkit.co.jp/ait/articles/1406/17/news013.html)
* [［Apacheを超えるWebサーバー「Nginx」］ 膨大なアクセスを効率的に処理](http://itpro.nikkeibp.co.jp/atclact/active/14/378464/121600004/)
* [apacheとnginxの比較表とベンチマーク](http://qiita.com/sion_cojp/items/edb20a6b87f10e186c23)
* [nginxの紹介](https://www.slideshare.net/ttkzw/nginx-intro)
* [応答速度28.8倍。WordPressをApacheからNginxに移行して感じたブログ運営](http://hamako9999.net/apache2nginx/)

こんなもんかね。

##おまけ
因みに・・・
nginxを使わないでNode.jsと共存させたい場合。

* [ApacheとNode.jsを共存させる](http://o.inchiki.jp/obbr/43)
* [ApacheとNode.jsを共存させてWebSocketも通す](http://o.inchiki.jp/obbr/50)

node-http-proxyなるものがあるらしい。