WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09 

[[速報]Amazon Linux AMI 2016.09 がリリースされました！](http://dev.classmethod.jp/cloud/amazon-linux-ami-2016-09/)

PHP7.0が入ってNginx 1.10になった。
よって以前書いた[エントリ](http://qiita.com/ki6ool/items/a9798792590fa2a5c9c8)は使い物にならないので改めて書き直す。
その分いろいろ手間が省けて楽になったでいいけど。


sudo略。

# AWS

#### アカウント作成

[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](http://qiita.com/tmknom/items/303db2d1d928db720888)

#### EC2(VPC)
[0から始めるAWS入門①：VPC編](http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b)

#### RDS
タイムゾーンがUSTなので変える
[[新機能]Amazon Auroraで日本時間が使用可能になりました！](http://dev.classmethod.jp/cloud/aws/amazon-aurora-local-timezone/#toc-)

##### 設定

```console
$ passwd ec2-user

#ローカルタイム変更
$ cp -rp /etc/localtime /etc/localtime.org
$ cp -rp /usr/share/zoneinfo/Japan /etc/localtime
```

```diff:/etc/sysconfig/clock
#yum updateなどでUTCにもどるのを防ぐ
-ZONE="UTC"
-UTC=true
+ZONE="Asia/Tokyo"
+UTC=false
```

```diff:/etc/sysconfig/i18n
-LANG=en_US.UTF-8
+LANG=ja_JP.UTF-8
```

# FTP

#### インストール
```console
$ yum install -y vsftpd
$ cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org
```

#### 設定
```diff:/etc/vsftpd/vsftpd.conf
+pasv_enable=YES
+pasv_addr_resolve=YES
+pasv_min_port=60001
+pasv_max_port=60100
```

```console
#起動
$ service vsftpd start
$ chkconfig vsftpd on
```

# PHP7.0

```console
$ yum install -y php70 php70-fpm php70-gd php70-mbstring php70-mcrypt php70-mysqlnd php70-zip php70-opcache php70-pecl-apcu php70-pecl-apcu-devel php70-pecl-imagick php70-pecl-imagick-devel
$ php -v
# PHP 7.0.11 
$ cp /etc/php-fpm-7.0.d/www.conf /etc/php-fpm-7.0.d/www.conf.org
```

```diff:/etc/php-fpm-7.0.d/www.conf
-user = apache
+user = nginx
-group = apache
+group = nginx
```

```diff:/etc/php-7.0.ini
+date.timezone = "Asia/Tokyo"
```

# nginx

```console
$ yum install -y nginx
$ nginx -v
# nginx version: nginx/1.10.1
$ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
```

```nginx:/etc/nginx/nginx.conf

    charset UTF-8;
    server_tokens off;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  localhost;
        root         /var/www/html;
        index       index.php;

        include /etc/nginx/default.d/*.conf;

        location ~ \.php$ {
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_script_name;
            include fastcgi_params;
        }

        location ~* ^.+.(jpg|jpeg|gif|png|css|js|flv|swf|ico|xml|txt|eot|svg|ttf|woff|woff2)$ {
                access_log  off;
                log_not_found off;
                expires 30d;
        }

        location ~ /(\.ht|\.user.ini|\.git|\.hg|\.bzr|\.svn) {
            deny  all;
        }

    }
```

```
$ chown -R nginx:nginx /var/lib/php/7.0/session
$ chown -R nginx:nginx /var/www/html
```

```
$ service nginx start
$ service php-fpm-7.0 start

$ chkconfig nginx on
$ chkconfig php-fpm-7.0 on
```

#### ブラウザで確認
```php:/var/www/html/phpinfo.php
<?php echo phpinfo();?>
```

#### アップロードファイル上限
多分デフォルトで1Mなので増やす


```nginx:/etc/nginx/nginx.conf
    server {
        client_max_body_size 4M;
    }
```

# GitHub

#### Gitインストール
取り急ぎガバガバなのでセキュリティ注意ね

```console
$ yum install -y git

$ git config --global user.email "[GitHubメールアドレス]"
$ git config --global user.name "[GitHubユーザー名]"

# GitHub クローン
$ cd /var/www/
$ mv /var/www/html /var/www/_html
$ git clone https://github.com/[path_to_git].git html
#ユーザー名とパス入力

# 以降はプルで
$ cd /var/www/html
$ git pull origin master
# ユーザー名とパス入力
# rootの場合は/var/wwww/html所有者を都度nginxにするのが良いと思われ


```

だからFTPはいらないね。

# MySQL

#### インストール
```console
$ yum install -y mysql56 mysql56-server
$ service mysqld start
$ chkconfig mysqld on

$ mysql -u root
```

```mysql
> SET PASSWORD FOR root@localhost=PASSWORD('root');
```

```console
$ service mysqld restart
```

# phpMyAdmin
[最新版](https://www.phpmyadmin.net/downloads/)

#### インストール
```console
$ cd /var/www/
$ wget https://files.phpmyadmin.net/phpMyAdmin/4.8.0/phpMyAdmin-4.8.0-all-languages.tar.gz
$ tar zxvf phpMyAdmin-4.8.0-all-languages.tar.gz
$ rm phpMyAdmin-4.8.0-all-languages.tar.gz
$ mv phpMyAdmin-4.8.0-all-languages phpmyadmin
$ cd /var/www/phpmyadmin/
$ cp config.sample.inc.php config.inc.php
```

#### 設定

```php:/var/www/phpmyadmin/config.inc.php 
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';//BASIC認証

/* Server parameters */
$cfg['Servers'][$i]['host'] = 'localhost';
```

```nginx:/etc/nginx/nginx.conf
server {
        #For phpMyAdmin
        location ^~ /phpmyadmin {
                allow 0.0.0.0;#IP制限
                deny all;

                alias /var/www/phpmyadmin;
                index index.php;

                location ~ \.php$  {
                        fastcgi_pass    127.0.0.1:9000;
                        fastcgi_index   index.php;
                        fastcgi_split_path_info ^/phpmyadmin(.+\.php)(.*)$;
                        fastcgi_param   SCRIPT_FILENAME /var/www/phpmyadmin$fastcgi_script_name;
                        include         /etc/nginx/fastcgi_params;
                }
        }
}
```

```console
$ service nginx reload
```

#### BASIC認証

```console
$ yum install -y httpd-tools
$ cd /etc/nginx
$ htpasswd -c .htpasswd [ユーザー名]
```

```nginx:/etc/nginx/nginx.conf
server {
    location / {
        auth_basic "Restricted";
        auth_basic_user_file /etc/nginx/.htpasswd;
    }
}
```

# SSL

```nginx:/etc/nginx/nginx.conf
server {
        listen       443 ssl;
        listen       [::]:443 ssl;
        server_name  localhost;
        root         /var/www/html;
        index        index.php;

        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:60m;

        include /etc/nginx/default.d/*.conf;
}
```

#### Let's Encrypt

色々あがいたけど
Amazon LinuxでLet's Encryptはあきらめろ、という
Amazon様の意思を感じたので従うことにした。

しゃーないので手動更新めんどくさいけど <a href="https://px.a8.net/svt/ejp?a8mat=1TQFPV+1L5PXU+1WTI+TVQUQ" target="_blank">SSLボックス</a><img border="0" width="1" height="1" src="https://www12.a8.net/0.gif?a8mat=1TQFPV+1L5PXU+1WTI+TVQUQ"> でLet's Encrypt発行する。

証明書: server.pem
中間証明書: chain.pem
秘密鍵: key.pem
とするならば

```console
$ cat server.pem chain.pem > cert.pem
```

ってやって中間証明書結合する。
中間証明書いれないとChromeとFirefoxがうるさいからね。


```nginx:/etc/nginx/nginx.conf
server {
    listen       443 ssl;

    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;

}
```

#### http→httpsにリダイレクトさせる場合
```nginx:/etc/nginx/nginx.conf
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    return 301 https://$host$request_uri;
}
```

#### WordPress

ホームURL、WordPressURLを変更

```sql:sql
$ UPDATE `wp_options` SET `option_value` = 'https://host' WHERE `wp_options`.`option_name` = 'siteurl' OR `wp_options`.`option_name` = 'home';
```

```php:/var/www/html/wp-config.php
//ログイン画面と管理画面をhttpsにリダイレクト
define('FORCE_SSL_ADMIN', true);

if ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https" ) {
    $_SERVER['HTTPS'] = 'on';
}
```

#### HSTS
```nginx:/etc/nginx/nginx.conf
server {
        listen 443 ssl;

        #HTTPSのみで運用する場合のみ
        add_header Strict-Transport-Security max-age=15768000;

}
```

#### Perfect Forward Security (PFS)

```
$ cd /etc/nginx/ssl
$ openssl dhparam 2048 -out dhparam.pem
```

```nginx:/etc/nginx/nginx.conf
server {
        listen 443 ssl;

        ssl_dhparam /etc/nginx/ssl/dhparam.pem;

}
```

#### HTTP/2
```nginx:/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
}
```

#### TLS/SSL

SSLv1.0,SSLv2.0,SSLv3.0は無効

```nginx:/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}
```

#### 暗号スイート

```nginx:/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;

    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';

}
```

#### OCSP Stapling

```nginx:/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;

    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/nginx/ssl/cert.pem;
    resolver 8.8.8.8;

}
```

#### セキュリティ評価
[Qualys SSL Report](https://www.ssllabs.com/ssltest/)
<img width="981" alt="スクリーンショット 2016-10-18 1.46.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/97451/10c0ae72-60e1-6d36-00d4-3af04c48c11c.png">

まあやってることは変わらないので今回もさすがにA+。