Nginx + php-fpm でWordPressを動かしてみる
ここまで、nginx + php-fpmのインストールと簡単なセットアップ方法について解説してきました。
CentOS / ScientificLinux
Debian / Ubuntu
今回は、nginx + php-fpmの環境下で、WordPressを動かしてみましょう。
ウェブサーバー(nginx)、PHP (php-fpm)、MySQLが動作すれば、WordPressも動作するはずです。
MySQLのセットアップは、ここでは解説しません。あえてmysql5.1系をインストールするなどの記事を参照ください。
結論から言うと、
nginxの設定ファイル(/etc/nginx/nginx.conf)を
server {
listen 80;
server_name www.example.com;
index index.php index.html index.htm;
root /var/www/html;
charset utf-8;
access_log /var/log/httpd/www.example.com.access.log;
error_log /var/log/httpd/www.example.com.error.log;
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
|
のように赤文字部分を追加するだけで、Wordpress自体は動作します。
ここでは、この簡単な解説と、アクセスログのWordpressの設定について解説してみます。
- 目次
- 履歴
2011年6月16日 初版
2013年5月16日 他ディストリビューション対応
nginx + php-fpm でWordpressを動かす時の注意点
nginx + php-fpm でWordpressを動かす場合の注意点がいくつかあります。
その注意点は、apacheで動作させる場合は、.htaccessやhttpd.confで対応していた問題を、nginxでは、すべて設定ファイル(/etc/nginx/nginx.conf)で対応しなければいけないことです。
ここでは、以下の2点について、簡単に解説してみます。
パーマリンク設定の問題
Wordpressでは、パーマリンク設定では、自由にパーマリンクを設定できます。あたかもカテゴリをディレクトリのように見せることも、記事を静的ページに見せることもできます。
つまり、ウェブサーバーは、存在しないディレクトリ名やファイル名にアクセスされた場合、エラー404を出力します。
もちろん、nginxでも、何も設定しない場合は、以下のように404エラーを出力します。
そんな時、apache、nginxでは、どのような設定になるか簡単に解説してみます。
apache での設定例
通常、apacheでは、.htaccessにて、以下のような記述を行って対応します。
1
2
3
4
5
6
7
8
| <IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
|
これは、以下のような意味になります。
- 4行目:要求ファイル名が、index.phpなら、そのまま処理を続けなさい。
- 5 – 7行目:要求ファイル名が存在しないか、要求ディレクトリ名が存在しない場合、/index.phpを処理しなさい。
nginx での設定例
先の意味は、
「要求されたファイルやディレクトリが存在しないなら/index.phpを処理しなさい。」
ということで、これをnginxでは、以下の1行で実現することができます。
1
| try_files $uri $uri/ /index.php?q=$uri&$args;
|
try_files
最後のパラメータ(ここでは、
/index.php?q=$uri&$args;)以外のパラメータ( ここでは、
$uri $uri/)が存在するかどうか確認します。
存在しない場合は、最後のパラメータで指定した処理を実施しなさい。
という意味になります。
$uri
URLのホスト名以降(パラメータ情報を除く)の情報
$args
URLに指定されたパラメータ情報
アクセスログの問題
アクセスログの制限を何もしない場合、どんなファイルへのアクセスもロギングされて、無駄な情報でファイルサイズが大きくなったり、本来必要なアクセスログが埋もれてしまうこともあります。
そんな時、apache、nginxでは、どのような設定になるか簡単に解説してみます。
apache での設定例
apacheでは、httpd.confの中でロギングの条件を設定することができます。
Wordpressを利用されておられる方なら、他人によっても異なりますが、概ね以下のような設定をしておられるのではないでしょうか。
何を隠そう自分も、apacheの場合、そのまんまこの設定をしています。
1
2
3
4
5
6
7
8
9
| SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(ico)|(css)|(js)$" nolog
SetEnvIf Request_URI "/wp-admin(.*)" nolog
SetEnvIf Request_URI "/wp-content(.*)" nolog
SetEnvIf Request_URI "/wp-includes(.*)" nolog
SetEnvIf Request_URI "/wp-cron.php(.*)" nolog
SetEnvIf Request_URI "/wp-login.php(.*)" nolog
SetEnvIf Request_URI "/wp-comments(.*)" nolog
...
CustomLog /var/log/httpd/httpd-access.log combined env=!nolog
|
これは、以下のような意味になります。
- 1行目:要求ファイル名の拡張子が、.gif .jpg .png .ico .css .jsなら、nologフラグを設定します。
- 2 – 7行目:要求ファイル名(あるいはディレクトリ名)に、
- /wp-admin
- /wp-content
- /wp-includes
- /wp-cron.php
- /wp-login.php
- /wp-comments
が含まれるなら、nologフラグを設定します。
- 11行目:nologフラグが設定されていないなら、httpd-access.logへロギングします。
nginx での設定例
これを、nginxで実現しようとすると、設定ファイル(/etc/nginx/nginx.conf)を以下のように編集しなければなりません。
このとき使うのは、access_log off;(アクセスログ情報をクリアする)です。
server {
listen 80;
server_name www.example.com;
index index.php index.html index.htm;
root /var/www/html;
charset utf-8;
access_log /var/log/httpd/www.example.com.access.log;
error_log /var/log/httpd/www.example.com.error.log;
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ /wp-content {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ /wp-includes {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ /wp-cron.php {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ /wp-login.php {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ /wp-comments {
access_log off;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
|
赤部分が、編集箇所です。
ちょっと、だらだらと長いですね。
基本的にlocaltionでは、そのスコープ内で処理を済ませる必要があるので、このような長い記述になってしまいました。
if文なども使えますが、そのif文のスコープでは、access_logなどのディレクティブが使えないなどの条件があります。
そこで有効に使えるのがincludeです。
includeは、指定したファイルを自動的に読み込んでくれます。
ここでは、オレンジ部分が全て同じ設定です。これを1つのファイルにして、includeを使うと見やすくなります。
まず、オレンジ部分をphp_execというファイル名で/etc/nginx/のディレクトリに作成します。
つまり、/etc/nginx/php_execは、以下のような内容になります。
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
|
次に、上記の設定ファイル(/etc/nginx/nginx.conf)を編集しなおすと以下のようになります。
server {
listen 80;
server_name www.example.com;
index index.php index.html index.htm;
root /var/www/html;
charset utf-8;
access_log /var/log/httpd/www.example.com.access.log;
error_log /var/log/httpd/www.example.com.error.log;
try_files $uri $uri/ /index.php?q=$uri&$args;
location ~* \.(gif|jpg|png|ico|css|js)$ {
access_log off;
}
location ~ /wp-admin {
access_log off;
include php_exec;
}
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-login.php {
access_log off;
include php_exec;
}
location ~ /wp-comments {
access_log off;
include php_exec;
}
include php_exec;
|
どうですか?
結構、すっきりしましたね。
今回は、ここまでです。
nginxの設定は、apacheに似せて設定することもできるようになっていますが、独自処理、高速化を優先させるような設定を推奨しています。
例えば、
apacheで以下のような設定を
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
|
nginxで以下のようにも設定できます。(非推奨)
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php last;
}
if (!-d $request_filename) {
rewrite ^(.+)$ /index.php last;
}
|
これなら、似てますね。非推奨ですけど。
nginxの設定は、意外と知られていないような設定もあるみたいです。
いろいろと設定を工夫すれば、もっとすっきりとした設定ができると思います。
軽いので、いろいろと試せすのが苦にならないのも良いですね。
nginxでWordpress を動かしてみたい方で、うまく動作しない方は、ここでの設定が参考になればうれしく思います。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない、検索ができないことがあります。
関連記事 :
コメントを投稿 :