WordPressをサブディレクトリにインストール

今回サブディレクトリにWordPressをインストールしました。下記のようなURLの形式になるように設定しています。subdir配下がWordPessのディレクトリです。

http://example.com/subdir/

今回簡単かと思いきやNginxの設定に手こずったので設定をメモしておきます。

WordPressのインストール

まずWordPressのインストールですが今回は/var/www配下にsubdirという名称でインストールしました。そして設定の一般設定でWordPress アドレス (URL)およびサイトアドレス (URL)をhttp://example.com/subdirにしています。

NewImage

Nginxの設定

さっそく設定を貼っておきます。

server {

	listen 80;
	server_name _;

	fastcgi_read_timeout 300;
	client_max_body_size 10m;

	root /var/www;
	index index.php index.html;

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

	location /subdir {
		try_files $uri $uri/ /subdir.index.php?q=$uri&$args;
	}

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

}

ポイントはrootをWordPressの親ディレクトリを指定したところと、location /subdir の try_files の指定で /subdir/index.php を指定してるところです。このtry_filesの指定がないと記事を参照した際にエラーになりました。

トップページのアクセスをリダイレクト

そして次に http://example.com/ へのアクセスを http://example.com/subdir/ にリダイレクトするようにしました。

server {

    (省略)

    rewrite ^/$ /subdir redirect;
}

素直に動いてくれました。

WordPressの設定

ここまでの状態で狙い通りサブディレクトリでWordPressが動いてくれてると思います。

httpsでもうまくいくか確認します。Nginxの設定はこちら。

server {

	listen 443;
	server_name _;

    ssl on;
    ssl_certificate_key  /etc/nginx/ssl/key;
    ssl_certificate      /etc/nginx/ssl/cert;

	fastcgi_read_timeout 300;
	client_max_body_size 10m;

	root /var/www;
	index index.php index.html;

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

	location /subdir {
		try_files $uri $uri/ /subdir.index.php?q=$uri&$args;
	}

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

}

秘密鍵と証明書はオレオレ証明書で代用します。証明書の作り方はこちらを参考にしました。

http://d.hatena.ne.jp/ozuma/20130511/1368284304

上記のURLの手順で作成した鍵を /etc/nginx/ssl/key に証明書を /etc/nginx/ssl/cert に保存します。

プラグインのWordPress HTTPSをインストールし、管理画面へのアクセスをhttpsにします。これでうまくいきました。

リバースプロキシする際の注意点

今回WordPressをサブディレクトリにしてるのはトップに違う本体サイトを起きたいからなんですが、今回はサーバーを分けるため本体サイト側でWordPressへとリバースプロキシする設定をします。

upstream wp {
  ip_hash;
  server 192.168.33.10;
}

upstream wpssl {
  ip_hash;
  server 192.168.33.10:443;
}

server {

  (省略)

  location /subdir {
    proxy_pass http://wp$request_uri;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
  }
}
server {

  (省略)

  location /subdir {
    proxy_pass https://wpssl$request_uri;
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass_header Set-Cookie;
  }
}

upstreamの定義をhttpとhttpsで分けています。本体サイト側でhttpsでリクエストを受けた際にproxy_passで必ずWordPressにhttpsでリバースプロキシします。このようにしないとWordPressがCSSやJavaScriptのURLをhttpで返してしまうためうまく表示されなくなってしまいます。この点はリバースプロキシする際には注意が必要です。