EC2(VPC)+nginx/1.9+PHP7+@ 環境構築メモ

【追記】
Amazon Linux AMIがバージョンアップして
もっと容易にできるようになりました
[WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09](http://qiita.com/ki6ool/items/8e929a460da3bb7a878a)


各々の設定方法は各所で解説されているけれど
環境やバージョンによってあれなので自分の環境用に。
詳しい解説はリンクしているページへ。
sudoは適宜。

# AWS

#### アカウント作成

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

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

##### 設定

```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
[AWS EC2(Amazon Linux)で、PHP7+NginXを環境を、yumを使ってサクッと実装](http://qiita.com/KeijiYONEDA/items/639e2ca0d080bc7decf3#インストール)

#### インストール
```console
$ rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ yum install -y php70 php70-php-fpm php70-php-mbstring php70-php-mysqlnd php70-php-mcrypt
```

[Amazon Linux に PHP7(remi)を入れる手順メモ](http://qiita.com/Ikumi/items/8f76d074134b7080d102)

```console
#epelからlibwebp を入れる
$ yum -y install libwebp --disablerepo=amzn-main --enablerepo=epel
#amzn-mainから必要なライブラリ郡を入れる
$ yum -y install libmcrypt libtool-ltdl libtidy libXpm libtiff gd-last autoconf automake
$ yum install -y php70-php-gd
```

他のライブラリを探す場合は

```console
$ yum list | grep php70
```

などで。

#### 設定
```console
$ cp /etc/opt/remi/php70/php-fpm.d/www.conf /etc/opt/remi/php70/php-fpm.d/www.conf.org
```

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

```diff:/etc/opt/remi/php70/php.ini
+date.timezone = "Asia/Tokyo"
```

# nginx
[AWS EC2(Amazon Linux)で、PHP7+NginXを環境を、yumを使ってサクッと実装](http://qiita.com/KeijiYONEDA/items/639e2ca0d080bc7decf3#インストール)
[nginxでHTTP/2ことはじめ](https://saku.io/introduce-http2-with-nginx/)

#### インストール

HTTP/2対応のためv1.9.5以降をインストール

```
$ yum remove nginx
$ rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
```

```diff:/etc/yum.repos.d/nginx.repo
# nginx.repo
 
[nginx]
name=nginx repo
-baseurl=http://nginx.org/packages/centos/6/$basearch/
+baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
gpgcheck=0
enabled=1
+priority=1
```

```consle
$ yum install -y nginx
$ nginx -v
nginx version: nginx/1.9.15
```

#### 設定

```console
$ mkdir -p /var/www/html
$ chown -R nginx:nginx /var/www/html
$ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
```

```nginx:/etc/nginx/nginx.conf
error_log  /var/log/nginx/error.log warn;
access_log  /var/log/nginx/access.log  main;

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

        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)$ {
                access_log  off;
                log_not_found off;
                expires 30d;
        }

}
```

```
#セッションディレクトリ
$ chown -R nginx:nginx /var/opt/remi/php70/lib/php/session/

$ service nginx start
$ service php70-php-fpm start

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

nginxを起動したとき
>nginx: [warn] conflicting server name "localhost" on 0.0.0.0:80, ignored

ってデフォルトの設定ファイルとサーバー名が被って怒られるので

```console
$ mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default._conf
```

と消すか、読まれないようにする。

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

#### BASIC認証かける場合

[nginxでBasic認証をする](http://qiita.com/hayak/items/97c99dfbc82daed0ad45)

```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;
    }
}
```

# Wordpress

#### インストール
```console
$ cd /var/www/html/
$ wget https://ja.wordpress.org/latest-ja.tar.gz

#zsh
# curl https://ja.wordpress.org/latest-ja.tar.gz -O

$ tar zxvf latest-ja.tar.gz 
$ rm latest-ja.tar.gz
$ cp -rpf wordpress/* ./
$ rm -rf wordpress
$ cp wp-config-sample.php wp-config.php
#wp-config.php設定
$ chown -R nginx:nginx /var/www/html/
```

[私的便利プラグイン集](http://qiita.com/ki6ool/items/1e8bcab7e3bcb7f2a6ea)
[管理画面でのSSL通信](https://wpdocs.osdn.jp/管理画面での_SSL_通信)

```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';
}

//さくらのレンタルサーバーの場合
if ( isset($_SERVER['HTTP_X_SAKURA_FORWARDED_FOR']) ) {
    $_SERVER['HTTPS'] = 'on';
}
```

#### 設定
```nginx:/etc/nginx/nginx.conf
server {
        #For Wordpress
        location / { 
                if (-f $request_filename) {
                        expires 30d;
                        break;
                }
                if (!-e $request_filename) {
                        rewrite ^.+?(/wp-.*) $1 last;
                        rewrite ^.+?(/.*\.php)$ $1 last;
                        rewrite ^ /index.php last;
                }
        }
}
```

# MySQL

#### インストール
```console
$ yum install -y mysql mysql-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.6.0/phpMyAdmin-4.6.0-all-languages.tar.gz
$ tar zxvf phpMyAdmin-4.6.0-all-languages.tar.gz
$ rm phpMyAdmin-4.6.0-all-languages.tar.gz
$ mv phpMyAdmin-4.6.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';
$cfg['Servers'][$i]['connect_type'] = 'tcp';
$cfg['Servers'][$i]['compress'] = false;

/* Select mysql if your server does not have mysqli */
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
```

```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
```

# SSL

[光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA＋にする。](http://qiita.com/sak_2/items/ff835b669c0a7e110b09)
[nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定](http://heartbeats.jp/hbblog/2012/06/nginx06.html)
[Amazon Linux で certbot(letsencrypt) を使って SSL 証明書を取得する](http://tkuchiki.hatenablog.com/entry/2016/05/16/195420)

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

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

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

#### Let's Encrypt

```console
#Git無い場合はインストール
$ yum install -y git
```

```console
$ cd /etc/
$ git clone https://github.com/letsencrypt/letsencrypt
#git clone https://github.com/certbot/certbot
$ cd letsencrypt
$ ./letsencrypt-auto --debug
$ ./letsencrypt-auto certonly --webroot --agree-tos -w /var/www/html -d [ドメイン] -m [メールアドレス]
```

*2016/08現在、certbotに名称が変わったりpipとかvirtualenvとか色々が色々で色々試したけどインストールできない*


証明書・秘密鍵は /etc/letsencrypt/live/[ドメイン]/ 以下

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

    ssl_certificate /etc/letsencrypt/live/[ドメイン]/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/[ドメイン]/privkey.pem;

}
```

有効期限は3ヶ月なのでクーロンで更新

```diff:crontab(毎月3日午前3時)
+0 3 3 * * /etc/letsencrypt/letsencrypt-auto certonly --webroot --agree-tos -w /var/www/html -d [ドメイン] -d [ドメイン] --renew-by-default && service nginx reload
```

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

#### 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/ssl
$ openssl dhparam 2048 -out dhparam.pem
```

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

        ssl_dhparam /etc/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/letsencrypt/live/[ドメイン]/fullchain.pem;
    resolver 8.8.8.8;

}
```

#### セキュリティ評価
[Qualys SSL Report](https://www.ssllabs.com/ssltest/)
<img width="1001" alt="スクリーンショット 2016-05-11 15.15.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/97451/75797e5f-cec9-ab44-2fd0-27fb515a88f8.png">

良い感じみたいで何より。