さくら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