Help us understand the problem. What is going on with this article?

WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09

More than 1 year has passed since last update.

[速報]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+。

ki6ool
絶対ワードプレス使うマン
https://6oolab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away