ConoHa での Nginx + WordPress CentOSでの環境構築メモ


このメモは、[ConoHa](http://www.conoha.jp/) の Nginx + WordPress CentOS というテンプレートを使用する時のメモです。
また、常に更新と修正が行われていきます。

独自ドメインの DNS レコードの設定については触れていません。
各自設定しておくようにお願いします。

## テンプレートを利用して VPS を追加
ConoHa には予め WordPress を快適に利用する為のテンプレートが用意されている。
インフラ知識ないし、折角なのでありがたく利用させていただく。
VPS を追加する際 ``[ テンプレート ] Nginx + WordPress CentOS`` を選択して VPS を追加する。


## 全てのファイルをアップデート
何も考えずに取り敢えず最新にしてみる。

```shell
$ yum update
```

## ポート番号の設定
### IPv4 の設定

```shel
$ vi /etc/sysconfig/iptables
$ ggVGd
```

以下をペースト。

```shel
*filter
:INPUT   ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT  ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]

-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
````

変更した設定を適用する。

```shell
$ service iptables restart
```

> この節は[CentOS に iptables の設定を行う (IPv4)](http://www.websec-room.com/2014/01/12/1511)より引用

### IPv6 の設定

```shel
$ vi /etc/sysconfig/ip6tables
$ ggVGd
```

以下をペースト。

```shel
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmpv6 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80    -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443   -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 546 --sport 547 -s fe80::/10 -d fe80::/10 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp6-adm-prohibited

-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT
```

変更した設定を適用する。

```shell
$ service ip6tables restart
```

> この節は[CentOS に ip6tables の設定を行う(IPv6)](http://www.websec-room.com/2014/01/13/1532)より引用

### SSHのポート番号を変更

```shell
$ vi /etc/ssh/sshd_config
```

``#Port 22`` と記述されている箇所があるので ``Port 10022`` に変更して保存。
変更した設定を適用する。

```shell
service sshd restart
```

> この節は[CentOS の SSH ポート番号を変更する](http://www.websec-room.com/2014/01/16/1552)より引用


## phpMyAdmin を更新
### 最新バージョンがあるか確認

```shell
$ yum list | grep phpMyAdmin
```

最新バージョンがある場合、以下のように表示される。

```shell
phpMyAdmin.noarch                       4.2.6-2.el6.remi            remi
```

最新バージョンがあった場合はインストール。

```shell
$ yum --enablerepo=remi install phpmyadmin
```

### Nginx の設定ファイルを追加
#### phpMyAdmin を動かす為のドメイン設定ファイルを追加
```shell
$ vi /etc/nginx/conf.d/phpmyadmin.conf
```

以下をペーストし、``server_name`` を環境にあわせて書き換える。

```shell
server {
    listen      80;
    server_name phpmyadmin.example.com;
    root        /var/www/vhosts/default;
    index       index.html index.htm;
    charset     utf-8;

    include     /etc/nginx/drop;

    # phpMyAdmin
    location /phpMyAdmin {
        alias                /usr/share/phpMyAdmin;
        index                index.php;
        include              /etc/nginx/expires;
        auth_basic           "Local Security";
        auth_basic_user_file "/var/www/vhosts/default/.htpasswd";
    }
    location ~ ^/phpMyAdmin/.+\.php$ {
        alias /usr/share/phpMyAdmin;
        fastcgi_pass   phpfpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME /usr/share$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

.htpasswd ファイルを作成する。

```shell
htpasswd -nbs YourName YourPassword > /var/www/vhosts/default/.htpasswd
```


Nginx をリスタートする。

```shell
$ service nginx restart
```

なお、``/etc/nginx/conf.d/default.conf`` をそのまま使用する場合、``/etc/nginx/conf.d/default.conf`` の 53 行目のコメントアウトを外して、Nginx を再起動するだけで完了です。
Basic 認証を掛ける場合は、``auth_basic`` と ``auth_basic_user_file`` の部分を追加してください。

## MySQL 設定

### MySQL の root アカウントを設定

```shell
$ mysqladmin -u root password '好きなパスワード'
$ mysql -u root -p mysql
$ DELETE FROM user WHERE user = '';
$ DELETE FROM user WHERE host != 'localhost';
```
パスワードは、半角英数字 + 大文字英字 + 小文字英字 + 記号で構成するようにする。

## Git の削除と最新版のインストール
Git は既にインストールされているが、バージョンが 1.7 であったため一旦削除し最新版をインストールする。
### Git の削除

```shell
$ yum remove git
```

### 最新版の Git のインストール

```shell
$ yum install make curl-devel gcc openssl-devel expat-devel  cpan
$ yum install gettext  asciidoc xmlto
$ mkdir /root/temp/
$ cd /root/temp/
$ wget https://www.kernel.org/pub/software/scm/git/git-2.2.1.tar.gz
$ yum install zlib-devel.x86_64
$ tar -zxf git-2.2.1.tar.gz
$ cd ./git-2.2.1
$ make prefix=/usr all
$ make prefix=/usr install
$ rm -rf /root/temp/*
```

### Git コマンドが使えない
いざ Git コマンドを使おうとすると以下のようになる事がある。

```shell
$ git --version
-bash: /usr/bin/git: そのようなファイルやディレクトリはありません
```

この場合、Git がインストールされている場所を探して、その場所をシンボリックリンクで繋げてあげると解決する。

```shell
$ which git
/usr/local/bin/git
$ ln -s /usr/local/bin/git /usr/bin/git
```

## ログ監視ツールのインストールと設定
### Logwatch をインストール

```shell
$ yum install logwatch
```

### 動作確認

```shell
$ /usr/sbin/logwatch --print
```

### 設定を変更

```shell
$ vi /usr/share/logwatch/default.conf/logwatch.conf
```
[ログ監視ツール Logwatch を使ってみる](http://blog.thingslabo.com/archives/000054.html)を参考に必要な設定を記述する。

> この章は[VPS 借りたら、せめてこれくらいはやっとけというセキュリティ設定](http://dogmap.jp/2011/05/12/vps-security/)より引用

## OS 全体をバックアップするツールのインストールと設定

### MondoRescue を導入

```shell
$ wget ftp://ftp.mondorescue.org/rhel/6/x86_64/mondorescue.repo
$ mv mondorescue.repo /etc/yum.repos.d/
$ yum -y install mondo
```

### 圧縮ソフト ( LZO ) をインストール

```shell
$ vi /etc/yum.repos.d/dag.repo
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
gpgkey=http://dag.wieers.com/packages/RPM-GPG-KEY.dag.txt
enabled=0
```

```shell
$ yum -y install lzop lzo --enablerepo=dag
```

### バックアップの実行

```shell
$ setenforce 0
$ mkdir /tmp/backup/
$ mondoarchive -Oi -L -N -s 4200m -d /tmp/backup -E /tmp/backup
$ setenforce 1
```

> この章は[さくらVPS上のOSを丸ごとバックアップする](http://goo.gl/h4Rrq4)より引用

## WordPress に関する設定
### Nginx の設定 (不要です)
[@wokamoto](https://twitter.com/wokamoto) さんよりフィードバックをいただきました。
以下の **ファイルへのアクセス制限** は不要です。
``/etc/nginx/conf.d/default.conf`` 内に ``include /etc/nginx/drop;`` という記述があります。
この ``include /etc/nginx/drop;`` の中に以下のように書かれています。

```
location ~ /\. { deny all; access_log /dev/null; log_not_found off; }
```
※一部抜粋
この記述が **ファイルへのアクセス制限** と被る為不要となります。
その他、``wp-config.php`` と ``wp-blog-header.php`` にアクセスがあった場合、404 を返すような記述もありました。
include されているファイルもしっかり確認しないとですね!!



#### ファイルへのアクセス制限 ( 不要です )
``/etc/nginx/conf.d/default.conf`` に以下を追加。

```
location ~ (\.ht|\.git|\.svn|\.conf) {
    deny  all;
}
```

Nginx をリスタートする。

```shell
$ service nginx restart
```

### ドメインの設定
ConoHa のコントロールパネルにある DNS 逆引き設定で 1 つは設定可能。
以下は、マルチドメイン、サブドメインを設定する場合のサンプル。
※ただし、正しい設定方法かは微妙

#### 追加するドメイン用の設定ファイルを作成

```shell
$ cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/example.conf
$ cp /etc/nginx/conf.d/default.backend.conf /etc/nginx/conf.d/example.backend.conf
```

#### 設定ファイルを編集
example.conf を開く。

```shell
$ vi /etc/nginx/conf.d/example.conf
```

該当部分を以下のように編集。

```
listen      80;
server_name example.com;
root        /var/www/vhosts/example/;
index       index.html index.htm index.php;
charset     utf-8;

access_log  /var/log/nginx/example.access.log main;
error_log   /var/log/nginx/example.error.log;
```

example.backend.conf を開く。

```shell
$ vi /etc/nginx/conf.d/example.backend.conf
```

該当部分を以下のように編集。

```
listen      unix:/var/run/nginx-backend.sock;
server_name example.com;
root        /var/www/vhosts/example/;
index       index.html index.htm index.php;

access_log  /var/log/nginx/example.backend.access.log backend;
```

Nginx をリスタートする。

```shell
$ service nginx restart
```

これで一応は大丈夫だと思われる。

### W3 Total Cache 関連の設定
#### Java のインストール

```shell
# インストール可能な最新バージョンを確認
$ yum search jdk
# インストール
$ yum install java-1.7.0-openjdk-devel.x86_64
# バージョンを確認
$ java -version
# Path を確認
$ which java
```

#### YUI Compressor のインストール

```shell
# インストール場所へ移動
$ cd /usr/share/
# ダウンロード
$ wget https://github.com/yui/yuicompressor/releases/download/v2.4.8/yuicompressor-2.4.8.jar
# 動作確認
$ java -jar /usr/share/yuicompressor-2.4.8.jar
```

#### Nginx の設定ファイルを作成
新規ファイルを作成する。

```shell
$ vi /etc/nginx/wp-w3tc
```

以下をペースト。

```
# BEGIN W3TC Minify cache
location ~ /wp-content/cache/minify.*\.js$ {
    types {}
    default_type application/x-javascript;
    add_header Vary "Accept-Encoding";
}
location ~ /wp-content/cache/minify.*\.css$ {
    types {}
    default_type text/css;
    add_header Vary "Accept-Encoding";
}
location ~ /wp-content/cache/minify.*js\.gzip$ {
    gzip off;
    types {}
    default_type application/x-javascript;
    add_header Vary "Accept-Encoding";
    add_header Content-Encoding gzip;
}
location ~ /wp-content/cache/minify.*css\.gzip$ {
    gzip off;
    types {}
    default_type text/css;
    add_header Vary "Accept-Encoding";
    add_header Content-Encoding gzip;
}
# END W3TC Minify cache
# BEGIN W3TC Page Cache cache
location ~ /wp-content/cache/page_enhanced.*html$ {
    add_header Vary "Accept-Encoding, Cookie";
}
location ~ /wp-content/cache/page_enhanced.*gzip$ {
    gzip off;
    types {}
    default_type text/html;
    add_header Vary "Accept-Encoding, Cookie";
    add_header Content-Encoding gzip;
}
# END W3TC Page Cache cache
# BEGIN W3TC Browser Cache
gzip on;
gzip_types text/css text/x-component application/x-javascript application/javascript text/javascript text/x-js text/richtext image/svg+xml text/plain text/xsd text/xsl text/xml image/x-icon;
# END W3TC Browser Cache
# BEGIN W3TC Minify core
rewrite ^/wp-content/cache/minify.*/w3tc_rewrite_test$ /wp-content/plugins/w3-total-cache/pub/minify.php?w3tc_rewrite_test=1 last;
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc .gzip;
}
if (-f $request_filename$w3tc_enc) {
    rewrite (.*) $1$w3tc_enc break;
}
rewrite ^/wp-content/cache/minify/(.+\.(css|js))$ /wp-content/plugins/w3-total-cache/pub/minify.php?file=$1 last;
# END W3TC Minify core
# BEGIN W3TC Page Cache core
set $w3tc_rewrite 1;
if ($request_method = POST) {
    set $w3tc_rewrite 0;
}
if ($query_string != "") {
    set $w3tc_rewrite 0;
}
if ($http_cookie ~* "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)") {
    set $w3tc_rewrite 0;
}
set $w3tc_enc "";
if ($http_accept_encoding ~ gzip) {
    set $w3tc_enc _gzip;
}
set $w3tc_ext "";
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index.html$w3tc_enc") {
    set $w3tc_ext .html;
}
if (-f "$document_root/wp-content/cache/page_enhanced/$http_host/$request_uri/_index.xml$w3tc_enc") {
    set $w3tc_ext .xml;
}
if ($w3tc_ext = "") {
  set $w3tc_rewrite 0;
}
if ($w3tc_rewrite = 1) {
    rewrite .* "/wp-content/cache/page_enhanced/$http_host/$request_uri/_index$w3tc_ext$w3tc_enc" last;
}
# END W3TC Page Cache core

```
この内容は、W3 Total Cache を利用している場合、ドキュメントルートに nginx.conf というファイルが自動で作られる。その中身を予め作成する作業になる。
> 参照: [(WordPress) W3 Total Cache + Nginx](http://smokycat.info/nginx/487)

``/etc/nginx/conf.d/default.conf`` に以下を追加。

```
include /etc/nginx/wp-w3tc;
```

Nginx をリスタートする。

```shell
$ service nginx restart
```

### WordPress のバックアップ設定
前章で MondoRescue を導入しているので不要!と思うかもしれないが、備えあれば憂いなし!
WordPess のバックアップファイルを単体で使う可能性 ( サーバーの引っ越しなど ) も考慮。

#### バックアップ方法その 1 - BackWPup を設定
以下サイトを参考に設定する。
 * [「WordPressテンプレート」とDropboxでかんたんブログバックアップ！](http://www.conoha.jp/blog/1450.html)
 * [WordPressを毎日自動バックアップ](http://designinglabo.com/352/wordpress_backwpup_dropbox.html)
#### バックアップ方法その 2 - VaultPress を設定
こちらは BackWPup とは異なり有料 ( 1ヶ月 500円程度 ) です。
VaultPress を設定後は BackWPup と同じく自動でバックアップを作成。
**バックアップからリストアする時は VaultPress の管理画面でボタンをワンクリックで終わり。** ( だったはず…記憶が曖昧です )
以下サイトを参考に設定。
*[ワンコイン程でWordPressを毎日自動バックアップ。VaultPressを導入してみた。](http://designinglabo.com/322/wordpress_backup_vaultpress.html)

### 管理画面に Basic 認証を設定
設定が面倒なのでプラグインにお願いしちゃいましょう ( 要動作テスト )。
* [WP BASIC Auth](http://wordpress.org/plugins/wp-basic-auth/)