nginx設定メモ

忘れないようにメモ。

ドキュメント

公式のサイトよりwikiの方が充実してたのでwikiを参考にした。

自分の環境

$ nginx -V

で、configure optionsとか色々見られる。自分の所のはこんな感じだった。(見やすいように改行した。)

nginx version: nginx/0.7.65
TLS SNI support enabled
configure arguments:
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/lock/nginx.lock
--http-log-path=/var/log/nginx/access.log
--http-client-body-temp-path=/var/lib/nginx/body
--http-proxy-temp-path=/var/lib/nginx/proxy
--http-fastcgi-temp-path=/var/lib/nginx/fastcgi
--with-debug
--with-http_stub_status_module
--with-http_flv_module
--with-http_ssl_module
--with-http_dav_module
--with-http_gzip_static_module
--with-http_realip_module
--with-mail
--with-mail_ssl_module
--with-ipv6
--add-module=/build/buildd/nginx-0.7.65/modules/nginx-upstream-fair

/etc/nginx/nginx.confを覗いてみる

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
    include       /etc/nginx/mime.types;

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

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    tcp_nodelay        on;

    gzip  on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

nginxは、master processとworker processという2つのプロセスで動いている。masterはroot権限で実行されているんだけど、workerの方はwww-dataというユーザで実行されている。「user www-data;」は、workerを実行するユーザを指定しているっぽい。ここを変えたら実行されるユーザも変わると思うんだけど特に必要ないので試してない。
「worker_processes 1;」はworker processの数を指定している。この場合はworker processは1つ。
「error_log /var/log/nginx/error.log;」は文字通りエラーログが保存されている。自分の所だと、favicon.icorobots.txtを置いていないので、それが無いというエラーが出ていた。この/var/log/nginx/ディレクトリには他にもaccess.logとlocalhost.access.logというファイルがある。
「pid /var/run/nginx.pid;」にはnginxのプロセスIDがあり、このファイルをcatするとnginxプロセスのPIDが分かる。
「events { ... }」については http://wiki.nginx.org/EventsModule に詳しく書かれている。この中にはEventsModuleのディレクティブを書く模様。
ここでは「worker_connections 1024;」とだけ設定されている。max_clients = worker_processes * worker_connectionsと書かれてるんだけどmax_clientsが何を指しているのかはよく分かってない。多分同時に接続できるクライアント数だと思うけど。
「http { ... }」については http://wiki.nginx.org/Modules の Standard HTTP Modulesを見るとよく分かる。いくつかのモジュールに分割されていて、それぞれコンパイル時のオプションで無効にしたりできるっぽい。
「include /etc/nginx/mime.types;」のincludeは文字通りファイルを読み込む機能。ここでは/etc/nginx/mime.typesというファイルを読み込んでいる。このファイルは http://wiki.nginx.org/FullExample#mime_types のサンプルのように拡張子とMIMEタイプを対応付けている。
access_log /var/log/nginx/access.log;」はアクセスログのファイルを指定している。
「sendfile on;」は"Directive activate or deactivate the usage of sendfile()."と書いてあるんだけどよく分からない。このsendfile()はman 2 sendfileで出てくるsendfile関数のことだと思うけど。
「keepalive_timeout 65;」はkeep-aliveの値を設定している。この場合は65。
tcp_nodelay on;」はTCP_NODELAYの設定らしいんだけどそもそもTCP_NODELAYが何なのか分からない。 http://wiki.nginx.org/ReadMoreAboutTcpNodelay に説明が書いてある。
gzip on;」でGZIP圧縮を有効にしている。
gzip_disable "MSIE [1-6]\.(?!.*SV1)";」は正規表現にマッチするUserAgentの場合圧縮をしないように設定する。この場合だとInternetExplorer6以下の場合GZIP圧縮をしないようにしている。
「include /etc/nginx/conf.d/*.conf;」、「include /etc/nginx/sites-enabled/*;」はそれぞれファイルを読み込んでいる。自分の場合、/etc/nginx/conf.d/以下には何も無かった。/etc/nginx/sites-enabled/以下にはdefaultという/etc/nginx/sites-available/defaultへのシンボリックリンクが貼ってあった。

/etc/nginx/sites-available/defaultを覗いてみる。

色々コメントアウトされてる箇所があるんだけど、その辺は削った。

server {
        listen   80 default;
        server_name  localhost;

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

        location / {
                root   /var/www/nginx-default;
                index  index.html index.htm;
        }

        location /doc {
                root   /usr/share;
                autoindex on;
                allow 127.0.0.1;
                deny all;
        }

        location /images {
                root   /usr/share;
                autoindex on;
        }
}

「listen 80 default;」は文字通りlistenするポートを指定する。このファイルの場合、プロトコルはHTTPなので80番を指定。defaultというのは別に無くても動くので指定しなくても構わないけど、僕もちゃんと説明できないのでドキュメントをちゃんと読みましょう。
「server_name localhost;」はserver_nameを設定する。このserver_nameというのはクライアントが送ってくるHTTPヘッダのHostと対応するらしい。例えばwww.oh24.netとoh24.netという2つのserver{ ... }ブロックを用意しておいて、クライアントがoh24.net側にアクセスするとwww.oh24.net側にリダイレクトさせる、なんてことができる。
access_log /var/log/nginx/localhost.access.log;」はアクセスログの場所の設定。
その次にlocation { ... }ブロックが3つ続いている。とりあえず一番上のものを例に説明する。「location / { ... }」にはルートディレクトリ(つまり www.oh24.net/ )にアクセスした場合の処理が書かれている。「root /var/www/nginx-default;」はドキュメントルートを指定している。次の「index index.html index.htm;」はインデックスファイルの種類をしている。この場合はindex.htmlかindex.htmがインデックスファイルとなる。つまりこの場合、 www.oh24.net/ にアクセスすると、 /var/www/nginx-default/index.html の内容が返ってくる。
「autoindex on;」は、wikiを見ると"Enables or disables the automatic directory listing."と書かれているのでディレクトリの一覧を出力するかどうかの設定っぽい。
allow、denyはまんまですね。

色々変更したい

このままでも問題なくウェブサーバとして機能してくれますが、ちょっといじりたいですよね。

  • wwwなしにアクセスされたらwwwありにリダイレクトさせたり
  • ドキュメントルートを移動させたり(このままだとroot権限ないとファイルに触れない)
  • /docとか/imagesとかいらんやん

やりましょう!

というわけでとりあえず最小構成。

server {
        listen 80;
        server_name oh24.net;
        rewrite ^/(.*) http://www.oh24.net/$1 permanent;
}

server {
        listen   80;
        server_name www.oh24.net;

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

        location / {
                root   /home/akira/www;
                index  index.html index.htm;
        }
}
  • oh24.netをwww.oh24.netにリダイレクト
  • ドキュメントルートを/home/akira/www/ディレクトリへ移動

最初、リダイレクトのやり方でちょっとはまりました。wwwなしからwwwありへリダイレクトさせるには、server { ... }ブロックが1つはoh24.net用、もう1つはwww.oh24.net用と2つ必要になります。1つだけserver { ... }ブロックを用意して、その中でリダイレクトさせれば大丈夫だろうと思ったのですが、そうやっちゃうとリダイレクトループしてしまいました。
リダイレクトのルールは「rewrite ^/(.*) http://www.oh24.net/$1 permanent;」の様に書きます。Apacheと似てますね。この場合はhttp://oh24.net/*へのアクセスをhttp://www.oh24.net/*へリダイレクトしています。
あとドキュメントルートはホームにwwwを作り、そのディレクトリを指定しました。




とりあえずここまで。