今日から本気出すブログ

やりたいことだけやって生きていくためにコツコツと

さくらVPSでUbuntu 14.04 +Nginx PHP-FPM(FastCGIcache)+Wordpressの設定

業務でさくらVPSを使ってUbuntu+Nginxサーバーを立てました。

最初はみんなやってるということで、リバースプロキシ・キャッシュ構成にしようとしていたのですが、上位サーバーの名前解決が初回起動時以降再読み込みされないというNginxの仕様(?)にハマり、FastCGIでのキャッシュを使うことにしました。 こっちの方が設定が簡単だし、ちゃんとベンチしてませんが速度も早い気がします。 いいものなのに日本語の記事があまり無かったのでメモ代わりに書いておきます。

(Ubuntu14.04のインストールとufwファイヤーウォール・SSHの設定は省略)

Nginxをソースからビルド

$ apt-get update $ apt-get install nginx でもいいのですが、サードパーティのngx_cache_purgeを使いたいためソースからビルドしました。

このサイトを参考にしました。(http://server-setting.info/ubuntu/ubuntu-nginx-install.html) Nginxの公開鍵をダウンロードしてきます

$ wget "http://nginx.org/keys/nginx_signing.key"
$ sudo apt-key add nginx_signing.key

パッケージソースを追記

$ sudo vi /etc/apt/sources.list.d/nginx.list
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
$ sudo apt-get update

パッケージ作成に必要なdpkg-debとdh-makeをインストールします。 ついでにビルドに必要なパッケージも入れておきます。※追記:ここ、抜けていました…。

$ sudo apt-get install dpkg-dev
$ sudo apt-get install dh-make
$ sudo apt-get install libpcre3-dev libssl-dev zlib1g-dev

apt-get sourceで、/usr/src/nginx/にソースを引っ張ってくる。

$ sudo mkdir /usr/src/nginx/
$ cd /usr/src/nginx/
$ sudo apt-get source nginx

nginx-1.7.6といったディレクトリができているはずです。 同じ階層にNgx_cache_purgeもダウンロードして解凍します。

$ wget http://labs.frickle.com/files/ngx_cache_purge-2.1.tar.gz
$ tar xfz ngx_cache_purge-2.1.tar.gz
$ cp -rp ngx_cache_purge-2.1 /usr/src/nginx/nginx-1.7.6/
$ cd nginx-1.7.6

$ vi debian/rules

override_dh_auto_build:
        dh_auto_build
        mv objs/nginx objs/nginx.debug
        ./configure \
                --prefix=/etc/nginx/ \
                --sbin-path=/usr/sbin/nginx \
                ~~~~
                --with-ipv6 \
                --add-module=/usr/src/nginx-pkg/nginx-1.7.6/ngx_cache_purge-2.1 #この行を足す
~~~~
configure_debug:
        ./configure \
                --prefix=/etc/nginx/ \
                --sbin-path=/usr/sbin/nginx \
                ~~~~
                --with-ipv6 \
                --add-module=/usr/src/nginx-pkg/nginx-1.7.6/ngx_cache_purge-2.1 \ #この行を足す
                --with-debug

ビルドしてインストール

$ dpkg-buildpackage -uc -b -d
$ sudo dpkg -i ../nginx_1.7.1-64x.deb #ここのファイル名うろ覚えです 

以上でnginxのインストールは完了です。

$ sudo /etc/init.d/nginx configtest
$ sudo /etc/init.d/nginx restart

でnginxが動いているかチェックしてください

PHP-FPMの設定

まずはPHPをインストールしましょう。※追記:抜けていました

$ sudo apt-get install php5 php5-cgi php5-cli php5-mysql php5-gd php-apc php5-fpm php-pear
$ sudo vim /etc/php5/fpm/php-fpm.conf
;events.mechanism = epoll
=>events.mechanism=epoll #コメントアウトを外す

PHP-FPMが正常にソケット通信される設定になっているか確認します。

$ sudo vi /etc/php5/fpm/pool.d/www.conf

listen = /var/run/php5-fpm.sock #こうなってるのを確認
~~~
listen.owner = www-data
listen.group = www-data
#listen.mode = 0660
=>listen.mode = 0660 #コメントアウトを外す

設定をしたらPHP-FPMをリスタートしましょう。

$ sudo /etc/init.d/php-fpm restart

Nginx設定ファイル

私は以下のようなディレクトリを作ってそこにpublic_htmlを作りました。

$ sudo mkdir /var/www/ #/var/wwwを作成
$ sudo mkdir /var/www/ドメインを割り当てるディレクトリ
$ sudo mkdir /var/www/ドメインを割り当てるディレクトリ/log
$ sudo mkdir /var/www/ドメインを割り当てるディレクトリ/public_html
$ sudo chown -R www-data:www-data /var/www

次はnginxの設定ファイルを編集します。まずはバックアップから

$ sudo cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org

設定ファイル/etc/nginx/nginx.confの編集

いよいよ本題の設定ファイル晒しです。あくまでも参考程度に考えてください。

$ sudo vi /etc/nginx/nginx.conf

user  www-data;
worker_processes  2;

error_log  /var/www/yourdomain.com/log/nginx.error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    client_body_buffer_size 128k;
    client_body_temp_path   /var/run/nginx-cache/client_temp;
    client_max_body_size 5M;
    large_client_header_buffers 4 32k;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/www/yourdomain.com/log/nginx.access.log  main;

    sendfile        on;
    tcp_nopush     off;

    keepalive_timeout  1;

    gzip  on;
    gzip_http_version 1.0;
    gzip_types  text/plain
        text/xml
        text/css
        application/xml
        application/xhtml+xml
        application/rss+xml
        application/atom_xml
        application/javascript
        application/x-javascript
        application/x-httpd-php;
    gzip_disable    "MSIE [1-6]\.";
    gzip_disable    "Mozilla/4";
    gzip_comp_level 2;
    gzip_vary       on;
    gzip_proxied    any;
    gzip_buffers    4 8k;

    server_names_hash_bucket_size 128;

    proxy_buffering on;
    fastcgi_buffer_size     128k;
    fastcgi_buffers     256 16k;
    fastcgi_cache_path  /var/run/nginx-cache levels=1:2 keys_zone=zone1:4m inactive=1d max_size=20m;
    fastcgi_intercept_errors    on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_read_timeout    180;
    fastcgi_send_timeout    180;
    fastcgi_busy_buffers_size   256k;
    fastcgi_temp_file_write_size    256k;
    fastcgi_cache_valid     200 2h;
    fastcgi_cache_valid     302 2h;
    fastcgi_cache_valid     301 4h;
    fastcgi_cache_valid     any 1m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    fastcgi_cache_use_stale error timeout invalid_header http_500;
    fastcgi_ignore_headers Cache-Control Expires Set-Cookie; 
    fastcgi_cache_purge on;

    include /etc/nginx/conf.d/*.conf;
}
user:www-data 

ここが/etc/php5/fpm/pool.d/www.confのuser: owner:と一致していないといけない。

海外のフォーラムによるとwww-dataにした方がよいという感じでした。※現在のNginxのデフォルトはnginxになっていました。デフォルトのままのほうがユーザーを新たに作ったりしないで済むのでそのほうがいいかも。

設定ファイル/etc/nginx/conf.d/default.confの編集

$ sudo vi /etc/nginx/conf.d/default.conf

server {
   listen 80 default_server;
   server_name yourdomain.com www.yourdomain.com;
   access_log /var/www/yourdomain.com/log/access.log main;
   error_log /var/www/yourdomain.com/log/error.log warn;
   root /var/www/yourdomain.com/public_html;
   index index.html index.htm index.php;

location / {
    set $do_not_cache 0;
    
    if (-f $request_filename) {
            expires 30d;
            break;
        }
    if (!-e $request_filename) {
        rewrite ^.+?(/wp-.*) $1 last;
        rewrite ^.+?(/.*\.php)$ $1 last;
        rewrite ^ /index.php last;
        }
    if ($request_method != "GET") {
        set $do_not_cache 1;
        }

    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
            set $do_not_cache 1;
        }
    }
        location /wp-admin/ {
        allow 127.0.0.1;
        allow XXX.XXX.XX.XXX; 
        allow XXX.XX.XXX.XXX;
        deny all;
        error_log   off;
            include        php_exec;
        set $do_not_cache 1;
        }
        location /wp-login.php {
        allow 127.0.0.1;
        allow XXX.XXX.XX.XXX; 
        allow XXX.XX.XXX.XXX;
        deny all;
        error_log   off;
            include        php_exec;
        set $do_not_cache 1;
        }
        location /wp-config.php {
        allow 127.0.0.1;
        allow XXX.XXX.XX.XXX; 
        allow XXX.XX.XXX.XXX;
        deny all;
        set $do_not_cache 1;
        }
    location ~ .*\.(gif|jpg|png|ico|js|css|woff)$ {
        access_log  off;
        expires 10d;
    }   
        location /wp-content {
            access_log     off;
            include        php_exec;
        }
        location /wp-includes {
            access_log     off;
            include        php_exec;
        }
        location /wp-cron.php {
            access_log     off;
            include        php_exec;
        }
        location /wp-comments {
            access_log     off;
            include        php_exec;
        }
    location ~ \.php{
        if (!-f $request_filename){
        return 404;
        break;
        }
    fastcgi_cache       zone1;
    fastcgi_no_cache    $do_not_cache;
    fastcgi_cache_bypass    $do_not_cache;
        include php_exec;
    }
   location /purge(/.*) {
    allow 127.0.0.1;
    allow XXX.XXX.XX.XXX;
    allow XXX.XX.XXX.XXX;
    deny all;
    fastcgi_cache_purge zone1 "$scheme$request_method$host$request_uri$1";
   }

   error_page 500 502 503 504 /50x.html;
   location = /50x.html {
    root /usr/share/nginx/html;
    }

   location /\.ht {
      deny all;
    }
   location = /robots.txt {
    access_log off;
    log_not_found off;
    }
   location = /favicon.ico {
    access_log off;
    log_not_found off;
    }
   location /nothingtosee {
    auth_basic "Admin Login";
    auth_basic_user_file pma_pass;
    access_log  /var/www/yourdomain.com/log/pma.access.log main;
    error_log   /var/www/yourdomain.com/log/pma.error.log warn;
    include     php_exec;
    }
}

/etc/nginx/php_execの編集

/etc/nginx/conf.d/default.confでちょっと助長なやりかたで関連付けしたphpの設定ファイルです。

$ sud vi /etc/nginx/php_exec

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

以上の設定で動きました。

$ sudo /etc/init.d/nginx configtest
$ sudo /etc/init.d/nginx restart

これで動いていればNginxのFastCGIキャッシュの設定は完了です。 ngx_cache_purgeを簡単に動かすにはWordPressのnginx_helperプラグインを入れると簡単です。 .htaccessが使えないためWP-Super-Cacheはそのままでは使えませんが、この構成なら必要ありません。

あとはMysqlをインストールしてphpmyadminの設定をしてWordpressをインストールしてください。 phpmyadminは普通にapt-getするだけでは何やらエラーが出て面倒なことになります。 簡単な手順が英語のサイトで紹介されていたので、次はそれを紹介します。

※12/11追記 以前のNginx設定ファイルでも動いてましたがなんだかエラーが頻発したりしたので調整を繰り返したため、新しいソースに書き換えました。 ログを見たらwp-adminとwp-loginにアクセスしてきているbotが多かったので会社のIPとサーバーローカルIP以外を弾くようにしています。 ベンチをしたら結構いい速度出てました。 拙ブログで紹介しているphpmyadminをセキュアにする方法用の設定をしていますので、こちらも合わせてどうぞ。

Ubuntu 14.04+Nginxにたった3ステップでセキュアなphpmyadminを設定する方法 - tyama1234はunknown