レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Nginx で WordPress を使う時の注意点

2013年5月11日 2015年5月3日
nginx wordpress point

Nginx 上で WordPress を動作される場合、いろいろな注意点があります。
今回は、その注意点について、簡単に解説してみたいと思います。

NginxでWordpressを使う場合の最初にやっておくこと

NginxでWordpressを扱う場合に以下の設定は、最初にやっておくべきでしょう。


/etc/nginx/nginx.confの設定例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
... 
http {
    ... 
    server {
        # TCPポート番号 80
        listen 80;
        # サーバー名 (www 有無両方を受け付ける)
        server_name domain1.com www.domain1.com;
        # アクセスログのファイルパス
        access_log   /var/log/httpd/domain1.com.access.log;
        # エラーログのファイルパス
        error_log    /var/log/httpd/domain1.com.error.log;
        # www 省略時は、www 付加してホスト名を統一する
        if ($http_host = "domain1.com") {
            rewrite  (.*)  http://www.domain1.com$1;
        }
        ...
        
        # WordPress カスタム パーマネントリンク対応
        try_files $uri $uri/ /index.php?q=$uri&$args;
        #  or
        # try_files $uri $uri/ /index.php;
        
        # PHPファイルの対応
        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/fastcgi_paramsの設定例

(以下はインストール時にデフォルトで設定されているものそのままです)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

try_files $uri $uri/ /index.php?q=$uri&$args;
Wordpressのカスタムパーマネントリンクの対応行っています。
要求されたURIが、ファイルあるいはディレクトリが存在するかチェックし、存在しない場合は、index.php へリダイレクトします。
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;
}
FastCGIの対応を設定しています。

fastcgi_pass   127.0.0.1:9000;
FastCGIが開いているソケットあるいはポートへのパスを設定します。
ここでは、FastCGIのサーバーおよびポート番号を設定します。
fastcgi_index  index.php;
FastCGIのファイル名省略時のデフォルトファイル名を設定します。
ここで指定されたファイル名は、/ で終了しているURIの場合、変数$fastcgi_script_nameに格納されます。
fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
FastCGIサーバのパラメータを設定します。
ここでは、SCRIPT_FILENAME パラメータを $document_root + $fastcgi_script_name 定義しています。
include        fastcgi_params;
FastCGIサーバのデフォルトパラメータを読み込みます。
Wordpressの設定として必要なものは、
try_files $uri $uri/ /index.php?q=$uri&$args; につきると思います。
Apacheでは、以下のように .htaccess に記述します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
これを、そのままNginxで記述してみると、
... 
http {
    ... 
    server {
        ... 
        location  / {
            ...
            try_files $uri $uri/ /index.php;
            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;
            }
            ...
        }
        ... 
    }
    ... 
}
... 
このようにtry_files の1行です。
先の例では、明示的に q パラメータと$args を設定していますが、上記の例のようにパラメータなしでも動作します。 ただ、プラグインの関連もありますので、十分に確認しましょう。

Nginx キャッシュでWordpressを使う場合に気を付けること

ここでは、 Nginx キャッシュ機能(リバースプロキシ、FCGIキャッシュ)とともにWordpressを使う場合に注意すべき点をまとめてみました。

WordPressの最大メモリ使用量に気を付けること

Wordpressは、あらかじめ設定されている最大メモリ使用量を超えた場合、真っ白なページ(White page あるいは Blank page と呼ばれる)を出力することがあります。 それも 正常なエラーステータス 200 で出力することがあります。

その場合、キャッシュに真っ白なページが保存され、キャッシュが更新されない間は、その真っ白なページが訪問者に表示されることがあります。

そのようなことがないように多少ゆとりもってメモリサイズを設定しておきましょう。

メモリサイズは、
wp-config.php 等で以下のように設定することができます。

...
// 以下は、128MB を設定しています。
//   -- wp-settings.phpの前に設定しておきましょう。
define('WP_MEMORY_LIMIT', '128M');
...
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
...
デフォルトのメモリサイズは、
Wordpress 3.0 以降では、/wp-includes/default-constants.php で設定され、
マルチサイトを運用している場合は、 64MB
シングルサイトを運用している場合は、 40MB
となっています。

以下はデフォルトのメモリサイズを設定している箇所です。
...
	// set memory limits
	if ( !defined('WP_MEMORY_LIMIT') ) {
		if( is_multisite() ) {
			define('WP_MEMORY_LIMIT', '64M');
		} else {
			define('WP_MEMORY_LIMIT', '40M');
		}
	}

...

WordPressでキャッシュしてはいけないディレクトリ、ファイルを設定する

Wordpressで、管理ページは、一切、キャッシュすべきではありません。

/etc/nginx/nginx.conf の server ディレクティブで、以下のように設定することができます。

...
server {
	listen 80;
	server_name domain1.com www.domain1.com;
	access_log   /var/log/httpd/domain1.com.access.log;
	error_log    /var/log/httpd/domain1.com.error.log;

	if ($http_host = domain1.com) {
		rewrite  (.*)  http://www.domain1.com$1;
	}

	location  / {
		# キャッシュ有無フラグの初期化を行います。
		# -- (0:キャッシュする、1:キャッシュしない)
		set $do_not_cache 0;
		# (*1)クッキーにより、ログイン中、コメント書き込み中、記事書き込み中の判断をします。
		if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
			set $do_not_cache 1;
		}
		# (*1)WordPressの専用ディレクトリはキャッシュなし。
		if ($request_uri ~ "^/wp-admin/.*"){
			set $do_not_cache 1;
		}
		if ($request_uri ~ "^/wp-content/.*"){
			set $do_not_cache 1;
		}
		if ($request_uri ~ "^/wp-includes/.*"){
			set $do_not_cache 1;
		}
		# (*1)WordPressのcronはキャッシュなし。
		if ($request_uri ~ "^/wp-cron.php.*"){
			set $do_not_cache 1;
		}
		# (*1)WordPressのloginはキャッシュなし。
		if ($request_uri ~ "^/wp-login.php.*"){
			set $do_not_cache 1;
		}
		#  FastCGI キャッシュの場合
		# -- (*2)存在するファイルはキャッシュなし。
		if ($request_uri ~* "\.(jpg|jpeg|gif|css|png|js|ico|xml|txt)$"){
			set $do_not_cache 1;
		}
		
		#  モバイル(携帯を含む)で出力を切り替えている場合は
		# -- (*3)通常のPCからのアクセスとモバイルで異なるページを出力している場合は、モバイル側をキャッシュなし。
		if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
			set $do_not_cache 1;
		}
		if ($http_profile ~ ^[a-z0-9\"]+) {
			set $do_not_cache 1;
		}
		if ($http_user_agent ~ ^.*(2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800).*) {
			set $do_not_cache 1;
		}
		if ($http_user_agent ~ ^(w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-).*) {
			set $do_not_cache 1;
		}
		if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
			set $do_not_cache 1;
		}
		if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
			set $do_not_cache 1;
		}
		
		# (*4)GET要求以外はキャッシュなし。
		if ($request_method != "GET") {
			set $do_not_cache 1;
		}

		#  FastCGI キャッシュ と リザーブプロキシ キャッシュ で、それぞれ以下のような設定を行います。
		#  -- それぞれで ディレクティブが異なります。
		
		#  FastCGI キャッシュの場合
		#  -- キャッシュするか否か
		fastcgi_no_cache        $do_not_cache; 
		#  -- キャッシュを使用するか否か
		fastcgi_cache_bypass    $do_not_cache;
		...

		#  リザーブプロキシ キャッシュの場合
		#  -- キャッシュするか否か
		proxy_no_cache          $do_not_cache;
		#  -- キャッシュを使用するか否か
		proxy_cache_bypass      $do_not_cache;
		...
		
	}
}
...
  • (*1)

    通常、Wordpressのログイン中は、Wordpressから以下のようにヘッダ情報が出力されます。

    ...
    Expires	Wed, 11 Jan 1984 05:00:00 GMT
    Cache-Control	no-cache, must-revalidate, max-age=0
    ...

    Expiresによって、キャッシュされてもキャッシュの保持期間は、0未満なので、すぐにキャッシュ開放されるようになっています。
    Cache-Control
    no-cache にてキャッシュしないようになっていて、
    must-revalidate にて更新が必要となっていて、
    max-age にてコンテンツの寿命なしとなっていて、
    キャッシュしないように、また、キャッシュされてもキャッシュの保持期間は、0なので、すぐにキャッシュ開放されるようになっています。

    そのため、上記のクッキーによるログイン中の判断やWordpressのディレクトリの判断によるキャッシュ制御は不要のように思われるかもしれません。
    ただ、注意しなければならないのは、既にキャッシュされていた場合、上記の設定がないとNginxでは、そのキャッシュが有効ならキャッシュを使用しようとする点です。

    上記の設定では、fastcgi_cache_bypass / proxy_cache_bypass によってキャッシュを利用しないようにしている点に注意してください。 この設定により、ログイン中の判断やWordpressのディレクトリ配下のファイルの場合は、仮にキャッシュが存在しても使用しないようになります。


  • (*2)

    Nginxの場合は、存在するファイルはキャッシュしない方が良いとされています。 キャッシュしてもキャッシュしない場合と同等かそれ以下の速度でしかレスポンスしないと言われていて、キャッシュする意味がありません。 (リザーブプロキシの場合で、ウェブサーバーと別サーバーとなっている場合は別です。)

    FastCGIキャッシュを使用している場合は、存在するファイル(画像ファイル、CSSファイル、JavaScriptファイル)はキャッシュしないようにします。


  • (*3)

    携帯を含むモバイルからのアクセスに対して、ページを切り替えている場合は、キャッシュしないようにする必要があります。
    これは、同じURLで表示イメージが違うからですが、モバイルとPCのどちらをキャッシュするかは、アクセスが少ない方をキャッシュすべきでしょう。 それは、ある程度、Google Analytics などを使ってアクセスを分析してから、判断するのが良いと思います。

    ここでは、とりあえずモバイルからのアクセスをキャッシュしないようにしています。


  • (*4)

    GET要求以外は、キャッシュしないようにする必要があります。
    要求として POST or HEAD などがありますが、POSTは、処理要求そのままですから、常に動的でなければなりません。また、最近増えているアクセスがHEADです。
    HEADは、文字通りヘッダー情報のみのやり取りを要求したもので、実際のページを出力しません。そのため、キャッシュには空白ページがキャッシュされ、キャッシュ以降に訪れたユーザは、真っ白なページを見ることになりかねないのです。
    (実際、このサイトでは、最近まで空白ページが出力されていました。気を付けましょう。)


ここで注意すべき点は、アドレス(URL)をチェックする際に、$request_uri を使って判断している点です。
$uriでないことに注意してください。
例えば、Wordpressでパーマリンクの設定を /カテゴリ/ポスト名 としていたとします。 以下の設定例では、http://www.domain1.com/sample-category/sample-post については、キャッシュしないようにしたわけです。
    ...
    try_files $uri $uri/ /index.php?q=$uri&$args;
    ...
    set $do_not_cache 0;
    # ここでURIをチェック
    #   カテゴリ : sample-category
    #   ポスト   : sample-post
    if ($uri ~ "^/sample-category/sample-post"){
        set $do_not_cache 1;
    }
    fastcgi_no_cache        $do_not_cache; 
    fastcgi_cache_bypass    $do_not_cache; 
    ...
この設定では思ったとおりキャッシュなしになりません
これは、try_files で $uri が変更されるからです。
これが厄介なのは、try_files が if 文の前であっても後であっても結果は同じで、キャッシュなしになりません
    ...
    set $do_not_cache 0;
    # ここでURIをチェック
    #   カテゴリ : sample-category
    #   ポスト   : sample-post
    if ($uri ~ "^/sample-category/sample-post"){
        set $do_not_cache 1;
    }
    fastcgi_no_cache        $do_not_cache; 
    fastcgi_cache_bypass    $do_not_cache; 
    ...
    try_files $uri $uri/ /index.php?q=$uri&$args;
    ...
感覚的には、try_files で $uri が変更されるのだから、その前のif文では、$uri=/sample-category/sample-post なのではないかと思いがちですが、 上記も同じ結果を得ます。

つまり 設定ファイルの書き順通りに処理されるわけではないことに注意する必要があります。
ユーザのブラウザから要求されたURIで判断したい場合は、変更されない $request_uri を使用しなければならないことに注意してください。
上記のイメージを実現するには、以下のように書き換えれば良いです。
    ...
    set $do_not_cache 0;
    # ここでURIをチェック
    #   カテゴリ : sample-category
    #   ポスト   : sample-post
    # if ($uri ~ "^/sample-category/sample-post"){
    if ($request_uri ~ "^/sample-category/sample-post"){
        set $do_not_cache 1;
    }
    fastcgi_no_cache        $do_not_cache; 
    fastcgi_cache_bypass    $do_not_cache; 
    ...
    try_files $uri $uri/ /index.php?q=$uri&$args;
    ...
ここでは、FastCGIキャッシュを使っていますが、リバースプロキシキャッシュも同じ動作です。

いかがだったでしょうか?
Nginx + WordPressを使う場合の注意すべきポイントを簡単に解説してみました。

FastCGIキャッシュ、リバースプロキシ キャッシュともに、 思ってもいないようなキャッシュによって、期待しないページが表示されることもあります。
特にキャッシュを使う時は、気を付けましょう。
ご利用のブラウザは、広告ブロック(AdBlockなど) が適用となっていませんか?
このサイトでは、コンテンツの一部が非表示、あるいは、コメント、お問い合わせの投稿ができない検索ができないことがあります。


関連記事 :

Nginx + php-fpm でWordpressを動かしてみる

ここまで、nginx + php-fpmのインストールと簡単なセットアップ方法について解説してきました。 CentOS / Sc ...

CentOS 7 でLAMP(Nginx+MariaDB(MySQL)+PHP)インストールからWordPressを動かすまで(Nginx編)

今回は、CentOS,ScientificLinuxでLAMP(Nginx+MySQL+PHP)インストールからWordPressを ...

CentOS,ScientificLinuxでLAMP(Nginx+MySQL+PHP)インストールからWordPressを動かすまで(Nginx編)

今回は、最短でLAMPインストールし、Wordpressを動かすまでの手順について解説してみたいと思います。 とりあえず、CentOS / S ...

Windowsで(L)AMP(Nginx,MySQL,PHP)インストールからWordpressを動かすまで

Windowsで(L)AMP(Apache,MySQL,PHP)インストールからWordPressを動かすまで では、Windows に Apa ...

Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた

ウェブサーバーのキャッシュ機能は、動的なページの高速化にかなり役立ちます。 例えば、Wordpressなどは覿面(てきめん)で ...



コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

[ 画像提供元 : Amazon ] 先日、1TBのディスクの入れ替え時にバックアップをとろうとディスクコピーを行いました。 その際 ...

Windows で Linux ファイルシステム Ext4 のディスクをマウントするには? Ext3Fsd が、おそらく、最も簡単なツール ...

今回は、Windows で Compass を使ってみました。 Compass とは、 Sass(サス、Syntactica ...

今回は、Anti Adblock を使ってみました。 Anti Adblock とは、 そもそも Adblock という ウェブ ...

デスクトップ環境でない サーバーで、Webページのキャプチャー画像をコマンドで撮る には、wkhtmltoimage, CutyCapt ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • ソーシャルブックマーク

  • はてなブックマークへ追加するはてな登録数
ページトップへ
Time : 0.2814 [s]