NginxでWordPress用にPHPを動作させる設定




1年以上前に更新された記事です。
情報が古い可能性がありますので、注意してください。

デフォルトのままだとPHPが動かないので、動くように設定を変更する。
また、WordPressも動作するように同時に設定していく。

Nginx設定

$ sudo vi /etc/nginx/nginx.conf
user hoge hoge;
worker_processes 4;
worker_rlimit_nofile 1024;
 
events {
    multi_accept on;
    worker_connections  1024;
}
 
http {
    include         mime.types;
    default_type    application/octet-stream;
    charset         UTF-8;
 
    server_tokens   off;
    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
 
    keepalive_timeout           10;
    client_header_timeout       10;
    client_body_timeout         10;
    reset_timedout_connection   on;
    send_timeout                10;
 
    gzip                on;
    gzip_http_version   1.0;
    gzip_disable        "msie6";
    gzip_proxied        any;
    gzip_min_length     1024;
    gzip_comp_level     6;
    gzip_types          text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/json;
 
    root   /var/www;
    index  index.php index.html;
 
    # キャッシュが保管されるパス、キャッシュゾーン、容量を指定
    # path      キャッシュ保管場所
    # levels    サブディレクトリ階層の深さ
    # keys_zone キャッシュゾーン、メモリの割当量
    # max_size  ゾーン内に保存できるキャッシュ最大値
    # inactive  アクセスの無いキャッシュを削除するまでの期間
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=hvzone:4m max_size=64m inactive=1440m;
    proxy_cache      hvzone;
    proxy_cache_valid 200 404 30m;
 
    # プロキシサーバー
    server {
        listen 80 default_server;
        server_name harvestasya.com;
        
        # ドットファイルへのアクセスを禁止、ログを残さない
        location ~ /\. {deny all; access_log off; log_not_found off; }
        
        # robots.txt へのアクセスはログを残さない
        location = /robots.txt  { access_log off; log_not_found off; }
        
        # favicon へのアクセスはログを残さない
        location = /favicon.ico { access_log off; log_not_found off; }
        
        # JavaScript CSS 画像へのアクセスはログを残さない
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
            expires 7d;
            log_not_found off;
        }
 
        set $do_not_cache 0;
        # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
        if ($uri ~* "\.php$") {
            set $do_not_cache 1;
        }
 
        # POST 時はキャッシュしない
        if ($request_method = POST) {
            set $do_not_cache 1;
        }
 
        # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする
        set $proxy_cache_key "$scheme://$host$request_uri";
 
        # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
        if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
            set $proxy_cache_key "$2::$proxy_cache_key";
        }
        
        # プロキシ
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_no_cache      $do_not_cache;
            proxy_cache_bypass  $do_not_cache;
            proxy_cache_key     $proxy_cache_key;
            proxy_pass          http://unix:/var/run/nginx.sock;
        }
    }
 
    # ウェブサーバー
    server {
        listen unix:/var/run/nginx.sock;
        server_name harvestasya.com;
 
        # blogディレクトリ配下にWordPressを設置する場合
        location /blog {
            # WordPress カスタム パーマリンク対応
            try_files $uri $uri/ /blog/index.php?q=$uri&$args;
        }
 
        # PHP-FPM 設定
        location ~ \.php$ {
            fastcgi_pass        unix:/run/php/php7.0-fpm.sock;
            fastcgi_index       index.php;
            fastcgi_param       SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include             fastcgi_params;
            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";
            client_max_body_size 10M;    # アップロードを10M上限に
        }
    }
}

PHPでのアップロード上限変更

Nginxの設定でアップロード上限を10Mにしたので、PHP側もそれに合わせる。

$ sudo vi /etc/php/7.0/fpm/php.ini
upload_max_filesize = 10M

プロキシキャッシュをRAMディスクに変更

キャッシュは頻繁に書き換えられるので、SDカードの寿命が短くなる。
そこで、/etc/fstab に一行追加してメモリをディスクとして使用し、SDカードを延命する。

$ sudo vi /etc/fstab
tmpfs /var/cache/nginx tmpfs defaults,size=64m,noatime,mode=1777 0 0
$ sudo reboot

php-fpm設定

php-fpmの実行ユーザー等をNginxの実行ユーザーと合わせる。

$ sudo vi /etc/php/7.0/fpm/pool.d/www.conf
user = hoge
group = hoge
listen.owner = hoge
listen.group = hoge

動作確認

$ sudo mkdir /var/www
$ sudo chown rakaro. /var/www
$ sudo service php7.0-fpm restart
$ sudo service nginx restart
$ echo '<?php phpinfo(); ?>' > /var/www/index.php

サーバーにアクセスし、phpinfoのページが表示されることを確認する。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です