Nginxの設定を行いましょう

Nginxのビルドが出来たので、設定を行いましょう。

こちらでは、設定とチューニング例を紹介します。

Nginxの設定ファイルはnginx.confです

vim /etc/nginx/nginx.conf

設定ファイルを開きましょう。

worker_processesは自分の契約したさくらのVPSのコア数に合わせてください。512MBプランは1なのでこのサイトのVPSの設定は

worker_processes 1;

となっています。

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

こちらの行の次の行に

    # バックエンド用ログフォーマット
    log_format backend '$http_x_forwarded_for - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent"';

バックエンド用のログフォーマット用設定を追加します。
Nginxではリバースプロキシという仕組みを使って、静的ファイルを高速にさばきます。
アクセスログはフロントエンドとバックエンドに分かれて残ります。
アクセスログの場所は /var/log/nginx/ 以下です。

次に、keep aliveです。

keepalive_timeout  65;

こちらを5に変更してください。

最後に、

include /etc/nginx/conf.d/*.conf;

この行の上に、こちらの内容をすべてコピーして貼り付けます。

終わったら :wq で保存してエディタから抜けてください。

共通confファイルを設置する

共通で利用するconfファイルを設置します。

mkdir /etc/nginx/conf.d/common

conf.dディレクトリの中にcommonディレクトリを掘ります。

vi /etc/nginx/conf.d/common/drop.conf

こちらの中身をコピーして貼り付けてください。

終わったら例によって :wq でエディタから抜けます。

次に、expiresヘッダの設定ファイル。

vi /etc/nginx/conf.d/common/expires.conf

こちらの中身をコピーして貼り付けです。

終わったら例によって :wq でエディタから抜けます。

WordPressに必要な設定ファイル

WordPressにはシングルサイトでの利用と、マルチサイトでの利用が可能です。これらはURLの読み込み方等が変わる為、設定が変わります。そこで、シングルサイト用とマルチサイト用の設定ファイルを別々に用意しています。

まずはシングルサイト用。

vi /etc/nginx/conf.d/common/wp-single.conf

エディタを開いたら、以下をコピペします。

rewrite /wp-admin$ $uri/ permanent;

include /etc/nginx/conf.d/common/drop.conf;

location / {
    index  index.php index.html index.htm;
    # static files
    include /etc/nginx/conf.d/common/expires.conf;
    # request to index.php
    if (!-e $request_filename) {
        rewrite ^(.+)$  /index.php?q=$1 last;
    }
}

location ~ \.php$ {
    expires        off;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param  REMOTE_ADDR      $http_x_real_ip;
    fastcgi_pass_header "X-Accel-Redirect";
    fastcgi_pass_header "X-Accel-Buffering";
    fastcgi_pass_header "X-Accel-Charset";
    fastcgi_pass_header "X-Accel-Expires";
    fastcgi_pass_header "X-Accel-Limit-Rate";
}

次にマルチサイト用。

vi /etc/nginx/conf.d/common/wp-multi.conf

こちらを貼り付けます。

location / {
    try_files $uri $uri/ /index.php?$args;
}
 
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
 
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 24h;
    log_not_found off;
}
 
rewrite /files/$ /index.php last;
 
set $cachetest "$document_root/wp-content/cache/ms-filemap/${host}${uri}";
if ($uri ~ /$) {
    set $cachetest "";
}
if (-f $cachetest) {
    rewrite ^ /wp-content/cache/ms-filemap/${host}${uri} break;
}
 
if ($uri !~ wp-content/plugins) {
    rewrite /files/(.+)$ /wp-includes/ms-files.php?file=$1 last;
}
 
if (!-e $request_filename) {
    rewrite ^/[_0-9a-zA-Z-]+(/wp-.*) $1 last;
    rewrite ^/[_0-9a-zA-Z-]+.*(/wp-admin/.*\.php)$ $1 last;
    rewrite ^/[_0-9a-zA-Z-]+(/.*\.php)$ $1 last;
}
 
location ~ \.php$ {
    try_files $uri =404;
 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
    fastcgi_param  REMOTE_ADDR      $http_x_real_ip;
    fastcgi_pass_header "X-Accel-Redirect";
    fastcgi_pass_header "X-Accel-Buffering";
    fastcgi_pass_header "X-Accel-Charset";
    fastcgi_pass_header "X-Accel-Expires";
    fastcgi_pass_header "X-Accel-Limit-Rate";
}

サイト毎(ドメイン毎)の設定ファイルを作ります

リバースプロキシ側の設定ファイル

vi /etc/nginx/conf.d/example.com-proxy.conf

example.com の部分はご自分のサイトのドメインに置き換えてください。

 server {
    listen      80;
    # example.com、example.com/wordpress、wp.example.comなどを指定する。
    server_name example.com;
    # ドキュメントルートの設定
    root        /var/www/html/$host;
    index       index.html index.htm;
    charset     utf-8;

    access_log  /var/log/nginx/$host.access.log  main;
    error_log   /var/log/nginx/$host.error.log;

    # アクセスログ、Not Foundログを無効にするための設定を読み込みます
    include     /etc/nginx/conf.d/common/drop.conf;

    rewrite /wp-admin$ $scheme://$host$uri/ permanent;

    # 変数の初期化
    set $mobile '';

    location ~* ^/wp-(content|admin|includes) {
        index   index.php index.html index.htm;
        if ($request_filename ~ .*\.php) {
            break;
            proxy_pass http://backend;
        }
        # expiresヘッダー用の設定を読み込みます。
        include /etc/nginx/conf.d/common/expires.conf;
    }

    location / {
        # PHPファイルへのアクセスの場合バックエンドに処理が投げられる。
        if ($request_filename ~ .*\.php) {
            break;
            proxy_pass http://backend;
        }
        # expiresヘッダー用の設定を読み込みます。
        include /etc/nginx/conf.d/common/expires.conf;

        # デフォルトではキャッシュするように変数に0をセットする。
        set $do_not_cache 0;
        # WordPressにログインしている場合はキャッシュしないように変数に1をセットする。
        if ($http_cookie ~* "comment_author_|wordpress_(?!test_cookie)|wp-postpass_" ) {
            set $do_not_cache 1;
        }
        # POSTアクセスの場合もキャッシュしないように変数に1をセットする。
        if ($request_method = POST) {
            set $do_not_cache 1;
        }
        proxy_no_cache     $do_not_cache;
        proxy_cache_bypass $do_not_cache;

        proxy_redirect     off;
        proxy_cache        czone;
        proxy_cache_key    "$scheme://$host$request_uri$mobile";
        proxy_cache_valid  200 0m;
        # do_not_cacheの値が1の場合バックエンドに処理が投げられる。
        proxy_pass http://backend;
    }

    # 50x系のページ設定/usr/share/nginx/htmlにあるファイルが使用される
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

example.com
となっている部分をご自分のサイトのドメインに置き換えます。

root /var/www/html/$host
となっている所ですが、これがサイトのドキュメントルートになります。
フォルダ名とドメイン名を合わせておくと楽です。

example.comであれば、

/var/www/html/example.com/
以下にWordpressのファイルを置くことになります。

変更して貼り付けて保存して終了。

バックエンド側の設定ファイル

vi /etc/nginx/conf.d/example.com-backend.conf

先ほどと同様、ドメインを置き換えてくださいね。

server {
    listen      8000;
    # example.com、example.com/wordpress、wp.example.comなどを指定する。
    server_name example.com;
    # ドキュメントルートの設定
    root        /var/www/html/$host;
    index       index.php index.html index.htm;

    access_log  /var/log/nginx/$host.backend.access.log backend;

    keepalive_timeout 25;
    port_in_redirect  off;

    gzip              off;
    gzip_vary         off;

    # シングルサイトの場合はwp-single.confを、マルチサイトの場合はwp-multi.confを読み込みます。
    # どちらか一方のみ読み込む事。読み込まない方は先頭に#を付けてコメントアウトして下さい。
    include /etc/nginx/conf.d/common/wp-single.conf;
    #include /etc/nginx/conf.d/common/wp-multi.conf;
}

マルチサイトの場合は、最後の行にある2行のコメントアウトを入れ替えればOKです。

    #include /etc/nginx/conf.d/common/wp-single.conf;
    include /etc/nginx/conf.d/common/wp-multi.conf;

保存して閉じます。

プロキシキャッシュ用のフォルダを作る

mkdir /var/cache/nginx/proxy_cache
chown nginx:root /var/cache/nginx/proxy_cache

Nginxが作るキャッシュファイルは /var/cache/nginx/proxy_cache/ 以下にたまります。キャッシュがクリアできなくておかしいという時はこちらの中身を空にすると解決する事が多いですよ。

rm /var/cache/nginx/proxy_cache/* -Rf

次はphpの設定を行います。上記の設定変更でnginxをリロードすると動かなくなってしまうのでひとまずNginxはこのまま置いておいて次のステップをやっつけてしまいましょう→データベース:MySQLとPHP-fpmのインストール

オススメNginx本

nginx実践入門 (WEB+DB PRESS plus) 単行本(ソフトカバー) – 2016/1/16

nginxを現場で活用するための知識を、実践的なノウハウを交えて解説した書籍です。nginxのインストール方法や基本的な設定方法からはじめ、nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集、そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので、nginxをこれから使う方はもちろん、さらに活用したい方にもお勧めです。

公開日:
最終更新日:2016/02/17