WordPress
nginx
AmazonLinux
PHP7

WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09

[速報]Amazon Linux AMI 2016.09 がリリースされました!

PHP7.0が入ってNginx 1.10になった。

よって以前書いたエントリは使い物にならないので改めて書き直す。

その分いろいろ手間が省けて楽になったでいいけど。

sudo略。


AWS


アカウント作成

AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ


EC2(VPC)

0から始めるAWS入門①:VPC編


RDS

タイムゾーンがUSTなので変える

[新機能]Amazon Auroraで日本時間が使用可能になりました!


設定

$ passwd ec2-user


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


/etc/sysconfig/clock

#yum updateなどでUTCにもどるのを防ぐ

-ZONE="UTC"
-UTC=true
+ZONE="Asia/Tokyo"
+UTC=false


/etc/sysconfig/i18n

-LANG=en_US.UTF-8

+LANG=ja_JP.UTF-8


FTP


インストール

$ yum install -y vsftpd

$ cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org


設定


/etc/vsftpd/vsftpd.conf

+pasv_enable=YES

+pasv_addr_resolve=YES
+pasv_min_port=60001
+pasv_max_port=60100

#起動

$ service vsftpd start
$ chkconfig vsftpd on


PHP7.0

$ 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


/etc/php-fpm-7.0.d/www.conf

-user = apache

+user = nginx
-group = apache
+group = nginx


/etc/php-7.0.ini

+date.timezone = "Asia/Tokyo"



nginx

$ yum install -y nginx

$ nginx -v
# nginx version: nginx/1.10.1
$ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org


/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


ブラウザで確認


/var/www/html/phpinfo.php

<?php echo phpinfo();?>



アップロードファイル上限

多分デフォルトで1Mなので増やす


/etc/nginx/nginx.conf

    server {

client_max_body_size 4M;
}


GitHub


Gitインストール

取り急ぎガバガバなのでセキュリティ注意ね

$ 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


インストール

$ yum install -y mysql56 mysql56-server

$ service mysqld start
$ chkconfig mysqld on

$ mysql -u root

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

$ service mysqld restart


phpMyAdmin

最新版


インストール

$ 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


設定


/var/www/phpmyadmin/config.inc.php

/* Authentication type */

$cfg['Servers'][$i]['auth_type'] = 'http';//BASIC認証

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



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


$ service nginx reload


BASIC認証

$ yum install -y httpd-tools

$ cd /etc/nginx
$ htpasswd -c .htpasswd [ユーザー名]


/etc/nginx/nginx.conf

server {

location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}


SSL


/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様の意思を感じたので従うことにした。

しゃーないので手動更新めんどくさいけど SSLボックス でLet's Encrypt発行する。

証明書: server.pem

中間証明書: chain.pem

秘密鍵: key.pem

とするならば

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

ってやって中間証明書結合する。

中間証明書いれないとChromeとFirefoxがうるさいからね。


/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にリダイレクトさせる場合


/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

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



/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


/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


/etc/nginx/nginx.conf

server {

listen 443 ssl;

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

}



HTTP/2


/etc/nginx/nginx.conf

server {

listen 443 ssl http2;
listen [::]:443 ssl http2;
}


TLS/SSL

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


/etc/nginx/nginx.conf

server {

listen 443 ssl http2;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

}



暗号スイート


/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


/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

スクリーンショット 2016-10-18 1.46.09.png

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