WordPressインストール

■概要

hogepon.netはWordPressを使用している。
WordPressをインストールした際の備忘録を書く。

■環境

OS:Ubuntu 16.04.1 LTS
nginx:ver1.10
php:ver7.0.8
MariaDB:ver5.5
WordPress:ver4.7

■MariaDBのインストール・DB作成

・MariaDBインストール

$ sudo apt install mariadb-server
$ sudo mysql_secure_installation
※rootのパスワード、その他もろもろ聞かれるのでYと答える。

・WordPress用データベース作成

$ sudo mysql -u root -p
MariaDB [(none)]> create database wordpress;
MariaDB [(none)]> create user wp_user@localhost identified by 'password';
※パスワードはダミーです。複雑な文字列にしましょう
MariaDB [(none)]> grant all privileges on wordpress.* to wp_user@localhost;
※grant後、よく「flush privileges;」をやっているのを見かけるが、
「flush privileges;」はINSERT、UPDATE、DELETEなど直で権限テーブル更新した際のみ必要。

おまけ

ちなみにsudoなしの「mysql -u root -p」ではmysqlへログインできない。
つまり、ログインユーザと同じ名前でしかDBを使用できない。PostgreSQLのpeer設定と同様の機能。
理由は、Userのpluginに「unix_socket」が入っているため。

MariaDB [(none)]> use mysql;
MariaDB [mysql]> select Host,User,plugin from user limit 1;
+-----------+------+-------------+
| Host | User | plugin |
+-----------+------+-------------+
| localhost | root | unix_socket |
+-----------+------+-------------+
※update user set plugin='' where User='root'などとしてやれば
 sudoなしでデータベースにアクセスできる。

■nginx,php7,WordPressインストール

・もろもろインストール

$ sudo apt install nginx
$ sudo apt -y install php7.0 php7.0-common php7.0-gd php7.0-fpm php7.0-mysql php7.0-mbstring
$ wget -O - 'https://ja.wordpress.org/wordpress-4.7-ja.tar.gz' | tar zxvf -
$ sudo mv ~/wordpress /var/www/html/wordpress_hogepon/
$ sudo chown -R www-data:www-data /var/www/html/wordpress_hogepon/
$ sudo chmod -R 755 /var/www/html/wordpress_hogepon/

おまけ

php7.0-fpmは、PHPのFastCGI実装のひとつ。FastCGIってのは、処理が終わるたびプロセスを終了しちゃうCGIとちがって、処理が終わってもプロセスがメモリに残るので高速に動作するやつ。
nginxとphp-fpmはUNIXドメインソケットで通信する。
TCP/IPでも通信できるけどオーバーヘッドが大きいので通常はUNIXドメインソケットを使用する。

・confファイル

WordPressのパーマリンクに対応する。
要は、apacheの.htaccessでやっていた以下のようなことができればよい。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

存在しないファイルやディレクトリへのアクセスは、すべて/index.phpに処理を渡すだけの処理である。
nginxの実際のconfファイルは以下。極力シンプルにした。
ubuntu(debian)流の書き方である。

/etc/nginx/sites-available/hogepon.net.confの内容

server {
  server_name hogepon.net;
  listen 80;

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

  location / {
    # try_filesは内部リダイレクトを行う
    #「$uri」を試して、なければ「$uri/」を試して、なければ「@wordpress」を試す
    # $uriはQUERY_STRINGは含まない
    try_files $uri $uri/ @wordpress;
  }

  # 管理画面 
  # おそらく使わないがPATH_INFO形式(http://fqdn/hoge.php/foo/bar)にも
  # 対応(正規表現の「(/|$)」の部分)
  location ~ ^/wp-admin/.*\.php(/|$) {
    # 気休めかもしれないが、Basic認証も付け2重認証とした
    auth_basic "Basic Auth";
    auth_basic_user_file "/etc/nginx/.htpasswd";
    # debian系OSの書き方
    # fastcgi-php.confを読むことで/etc/nginx/fastcgi_paramsにないSCRIPT_FILENAMEと
    # PATH_INFOが補完される
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  # 管理画面以外のphp (/index.php /wp-login.phpなど) 
  # こちらもPATH_INFO形式に対応しているが、おそらくPATH_INFOは使っていないので冗長。
  location ~ [^/]\.php(/|$) {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  }

  #wordpress用パーマリンク設定。
  location @wordpress {
    # fastcgi-php.confでは*.phpの実在チェックをしているので使えない。
    # 各種環境変数と定義しているfastcgi.confを直に読み込むが、このファイルを直に読み込むと
    # PATH_INFOがセットされない。まあ、PATH_INFOは使わないのでよしとしよう。
    include fastcgi.conf;
    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
    # SCRIPT_FILENAME書き換え
    fastcgi_param SCRIPT_FILENAME /var/www/html/wordpress_hogepon/index.php;
  } 
}

Basic認証用の.htpasswdを作成する。

$sudo apt install apache2-utils
$sudo htpasswd -c /etc/nginx/.htpasswd admin

nginxにはa2ensiteコマンドがないので、自分でシンボリックリンク張る。

$ sudo ln -s /etc/nginx/sites-available/hogepon.net.conf /etc/nginx/sites-enabled/
$ sudo service nginx reload

あとはhttp://hogepon.net/に接続すればインストーラが動く。簡単!

おまけ

よく使われるnginx各種パラメータ意味は以下の通り。

(1)$request_filename:
リクエストされたURIに基づく
例)
URI:http://www.example.com/hoge/
=>/var/www/html/hoge/

URI:http://www.example.com/hoge/index.php
=>/var/www/html/hoge/index.php

(2)$document_root
ドキュメントルートそのまんま
=>/var/www/html

(3)$fastcgi_script_name
スクリプトファイル名。ドキュメントルートは含まない。
URI:http://www.example.com/hoge/index.php
=>/hoge/index.php

スラッシュで終わっている場合、fastcgi_indexの値追加
例)
URI:http://www.example.com/hoge/
=>/hoge/index.php

fastcgi_split_path_info ^(.+\.php)(/.+)$;
と設定されている場合、最初にマッチした方が$fastcgi_script_name、2番目にマッチした方は$fastcgi_path_infoになる。
fastcgi_split_path_infoは/etc/nginx/snippets/fastcgi-php.confで定義されている。

実際にnginxのパラメータを確認してみる。
add_headerをつけて、

  # 管理画面以外のphp (/index.php /wp-login.phpなど)
location ~ [^/]\.php(/|$) {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  add_header hoge1 $request_filename;
  add_header hoge2 $document_root;
  add_header hoge3 $fastcgi_script_name;
  add_header hoge4 $fastcgi_path_info;
}

curlで確認。

$ curl -I http://hogepon.net/info.php/foo/bar
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Tue, 13 Dec 2016 02:12:12 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
hoge1: /var/www/html/wordpress_hogepon/info.php
hoge2: /var/www/html/wordpress_hogepon
hoge3: /info.php

あれ??$fastcgi_path_infoが表示されてない。
fastcgi_split_path_infoを定義している/etc/nginx/snippets/fastcgi-php.confを見てみる。

# Bypass the fact that try_files resets $fastcgi_path_info
# see: http://trac.nginx.org/nginx/ticket/321
set $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

うーん、try_files使うと$fastcgi_path_infoがリセットされてしまうんか。
$path_infoに値を退避しているようなので、こちらを参照するようにする。

  # 管理画面以外のphp (/index.php /wp-login.phpなど)
location ~ [^/]\.php(/|$) {
  include snippets/fastcgi-php.conf;
  fastcgi_pass unix:/run/php/php7.0-fpm.sock;
  add_header hoge1 $request_filename;
  add_header hoge2 $document_root;
  add_header hoge3 $fastcgi_script_name;
  add_header hoge4 $path_info;
}

/foo/barが表示された。

$ curl -I http://hogepon.net/info.php/foo/bar
HTTP/1.1 200 OK
Server: nginx/1.10.0 (Ubuntu)
Date: Tue, 13 Dec 2016 02:22:10 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
hoge1: /var/www/html/wordpress_hogepon/info.php
hoge2: /var/www/html/wordpress_hogepon
hoge3: /info.php
hoge4: /foo/bar

次は各種環境変数にどんな値が入っているか確かめてみよう。
適当なphpファイル作って、

 $ sudo vi info.php
 <?php var_export($_SERVER)?>

curlで叩いてみる。

$ curl http://hogepon.net/info.php
array (
 'USER' => 'www-data',
 'HOME' => '/var/www',
 'HTTP_ACCEPT' => '*/*',
 'HTTP_USER_AGENT' => 'curl/7.47.0',
 'HTTP_HOST' => 'hogepon.net',
 'REDIRECT_STATUS' => '200',
 'SERVER_NAME' => 'hogepon.net',
 'SERVER_PORT' => '80',
 'SERVER_ADDR' => '160.16.69.183',
 'REMOTE_PORT' => '42642',
 'REMOTE_ADDR' => '160.16.69.183',
 'SERVER_SOFTWARE' => 'nginx/1.10.0',
 'GATEWAY_INTERFACE' => 'CGI/1.1',
 'REQUEST_SCHEME' => 'http',
 'SERVER_PROTOCOL' => 'HTTP/1.1',
 'DOCUMENT_ROOT' => '/var/www/html/wordpress_hogepon',
 'DOCUMENT_URI' => '/info.php',
 'REQUEST_URI' => '/info.php',
 'SCRIPT_NAME' => '/info.php',
 'CONTENT_LENGTH' => '',
 'CONTENT_TYPE' => '',
 'REQUEST_METHOD' => 'GET',
 'QUERY_STRING' => '',
 'SCRIPT_FILENAME' => '/var/www/html/wordpress_hogepon/info.php',
 'PATH_INFO' => '',
 'FCGI_ROLE' => 'RESPONDER',
 'PHP_SELF' => '/info.php',
 'REQUEST_TIME_FLOAT' => 1481593295.1527281,
 'REQUEST_TIME' => 1481593295,
)

confで「location ~ [^/]\.php(/|$)」として、snippets/fastcgi-php.confとの組み合わせでPATH_INFOにも対応したが、PATH_INFOに正常に値がセットされるか確認してみる。

$ curl http://hogepon.net/info.php/foo/bar
array (
 'USER' => 'www-data',
 'HOME' => '/var/www',
 'HTTP_ACCEPT' => '*/*',
 'HTTP_USER_AGENT' => 'curl/7.47.0',
 'HTTP_HOST' => 'hogepon.net',
 'REDIRECT_STATUS' => '200',
 'SERVER_NAME' => 'hogepon.net',
 'SERVER_PORT' => '80',
 'SERVER_ADDR' => '160.16.69.183',
 'REMOTE_PORT' => '42678',
 'REMOTE_ADDR' => '160.16.69.183',
 'SERVER_SOFTWARE' => 'nginx/1.10.0',
 'GATEWAY_INTERFACE' => 'CGI/1.1',
 'REQUEST_SCHEME' => 'http',
 'SERVER_PROTOCOL' => 'HTTP/1.1',
 'DOCUMENT_ROOT' => '/var/www/html/wordpress_hogepon',
 'DOCUMENT_URI' => '/info.php',
 'REQUEST_URI' => '/info.php/foo/bar',
 'SCRIPT_NAME' => '/info.php',
 'CONTENT_LENGTH' => '',
 'CONTENT_TYPE' => '',
 'REQUEST_METHOD' => 'GET',
 'QUERY_STRING' => '',
 'SCRIPT_FILENAME' => '/var/www/html/wordpress_hogepon/info.php',
 'PATH_INFO' => '/foo/bar',
 'FCGI_ROLE' => 'RESPONDER',
 'PHP_SELF' => '/info.php/foo/bar',
 'REQUEST_TIME_FLOAT' => 1481593721.472111,
 'REQUEST_TIME' => 1481593721,
)

「 ‘PATH_INFO’ => ‘/foo/bar’」がセットされていることがわかる。
確認したら、このファイルは必ず消しておこう。

■参考

https://www.nginx.com/resources/wiki/start/topics/examples/phpfcgi/
http://qiita.com/kotarella1110/items/33d6cfbe6cb897c2af4d

シェアする

  • このエントリーをはてなブックマークに追加

フォローする