【追記】
Amazon Linux AMIがバージョンアップして
もっと容易にできるようになりました
WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09
各々の設定方法は各所で解説されているけれど
環境やバージョンによってあれなので自分の環境用に。
詳しい解説はリンクしているページへ。
sudoは適宜。
AWS
アカウント作成
AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
EC2(VPC)
設定
$ passwd ec2-user
#ローカルタイム変更
$ cp -rp /etc/localtime /etc/localtime.org
$ cp -rp /usr/share/zoneinfo/Japan /etc/localtime
#yum updateなどでUTCにもどるのを防ぐ
-ZONE="UTC"
-UTC=true
+ZONE="Asia/Tokyo"
+UTC=false
-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
設定
+pasv_enable=YES
+pasv_addr_resolve=YES
+pasv_min_port=60001
+pasv_max_port=60100
#起動
$ service vsftpd start
$ chkconfig vsftpd on
PHP7
AWS EC2(Amazon Linux)で、PHP7+NginXを環境を、yumを使ってサクッと実装
インストール
$ 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)を入れる手順メモ
#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
他のライブラリを探す場合は
$ yum list | grep php70
などで。
設定
$ cp /etc/opt/remi/php70/php-fpm.d/www.conf /etc/opt/remi/php70/php-fpm.d/www.conf.org
-user = apache
+user = nginx
-group = apache
+group = nginx
+date.timezone = "Asia/Tokyo"
nginx
AWS EC2(Amazon Linux)で、PHP7+NginXを環境を、yumを使ってサクッと実装
nginxでHTTP/2ことはじめ
インストール
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
# 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
$ yum install -y nginx
$ nginx -v
nginx version: nginx/1.9.15
設定
$ mkdir -p /var/www/html
$ chown -R nginx:nginx /var/www/html
$ cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org
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
ってデフォルトの設定ファイルとサーバー名が被って怒られるので
$ mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default._conf
と消すか、読まれないようにする。
ブラウザで確認
<?php echo phpinfo();?>
BASIC認証かける場合
$ yum install -y httpd-tools
$ cd /etc/nginx
$ htpasswd -c .htpasswd [ユーザー名]
適宜設定
server {
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
Wordpress
インストール
$ 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/
//ログイン画面と管理画面を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';
}
設定
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
インストール
$ yum install -y mysql mysql-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.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
設定
/* 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;
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
SSL
光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。
nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定
Amazon Linux で certbot(letsencrypt) を使って SSL 証明書を取得する
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
#Git無い場合はインストール
$ yum install -y git
$ 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/[ドメイン]/ 以下
server {
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/[ドメイン]/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/[ドメイン]/privkey.pem;
}
有効期限は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にリダイレクトさせる場合
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name localhost;
return 301 https://$host$request_uri;
}
HSTS
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
server {
listen 443 ssl;
ssl_dhparam /etc/ssl/dhparam.pem;
}
HTTP/2
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
}
TLS/SSL
SSLv1.0,SSLv2.0,SSLv3.0は無効
server {
listen 443 ssl http2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
暗号スイート
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
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;
}
セキュリティ評価
良い感じみたいで何より。