「nginx + WordPress + multisite」で、アップロードしたファイルをちゃんと表示できるようになったので、簡単に記録しておきます。

ぶち当たった問題

  • 画像をアップロードして記事に埋め込んだが、画像が表示されない(404エラー)

原因

  • nginxの設定

解決方法

  1. WordPressで「nginx-helper」というプラグインを入れて、適切に設定する
  2. nginxの設定ファイルを適切に設定する。

参考になったページ

細かいこと

参考にしたページの設定は、「nginx-helper」というプラグインを利用するのが前提になっているようなので、忘れずに入れて設定しておきます。

プラグイン設定方法は、以下のとおりです。

  1. 「nginx-helper」をインストールする。
  2. 画面左側のメニューから「設定」→「Nginx Helper」とクリックして設定画面を出す。
  3. 「Enable Nginx Map.」にチェックを入れて「Save」します。

プラグインについては以上です。

ただし、このプラグインの情報にしたがって、nginxの設定を書きなおす必要があります。

必要な情報は以下のとおりです。

  1. 「save」した後、「Nginx Map」という設定が出てくるので、その中の「Nginx Map path to include in nginx settings」の右側の文字列をコピーして貼り付けます。
default map $http_host $blogid {<br> default -999;<br> include (ここに貼り付け);<br>}<br><br>(中略)<br><br>#WPMU Files<br>location ~ ^/files/(.*)$ {<br> try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1;<br> access_log off; log_not_found off; expires max;<br>}<br>

マルチサイトにした場合、サイト(ブログ)をごとに$blogidが割り振られますが、サイトのホスト名とIDを紐付けておくことで、nginxで画像を処理できるようになります。

この設定は、PHPの起動回数を減らすことにつながるので、サーバーの負荷を減らしたり、高速化を目指す場合は必須です。

で、問題は、この「WPMU Files」の設定なのですが、他の静的なファイルの設定は、この設定よりも前には書かないほうがよさそうです。

confファイル

最後に、ヴァーチャルホストの設定ファイルを晒しておきます。

継ぎ接ぎだらけですが、何かのお役に立てば幸いです。

default map $http_host $blogid {<br> default -999;<br> include /var/www/soc/wp-content/plugins/nginx-helper/map.conf;<br>}<br><br>server {<br> listen 80;<br> server_name .wp.nishimiyahara.net;<br><br> access_log /var/log/nginx/wp_soc.access.log;<br> error_log /var/log/nginx/wp_soc.error.log;<br><br> root /var/www/soc;<br> index index.php;<br><br> location = /favicon.ico {<br> log_not_found off;<br> access_log off;<br> }<br><br> location = /robots.txt {<br> allow all;<br> log_not_found off;<br> access_log off;<br> }<br><br> location / {<br> try_files $uri $uri/ /index.php?$args;<br> }<br><br> location ~ \.php$ {<br> include /etc/nginx/fastcgi.conf;<br> fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;<br> }<br><br> #WPMU Files<br> location ~ ^/files/(.*)$ {<br> try_files /wp-content/blogs.dir/$blogid/$uri /wp-includes/ms-files.php?file=$1;<br> access_log off;<br> log_not_found off;<br> expires max;<br> }<br><br> #WPMU x-sendfile to avoid php readfile()<br> location ^~ /blogs.dir {<br> internal;<br> alias /var/www/soc/wp-content/blogs.dir;<br> access_log off;<br> log_not_found off;<br> expires max;<br> }<br><br> location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {<br> log_not_found off;<br> expires max;<br> }<br>}<br>