LoginSignup
9
8

More than 3 years have passed since last update.

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

Last updated at Posted at 2016-05-11

【追記】
Amazon Linux AMIがバージョンアップして
もっと容易にできるようになりました
WordPress(PHP7+nginx) for Amazon Linux AMI 2016.09

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

AWS

アカウント作成

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

EC2(VPC)

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

設定
$ 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

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
/etc/opt/remi/php70/php-fpm.d/www.conf
-user = apache
+user = nginx
-group = apache
+group = nginx
/etc/opt/remi/php70/php.ini
+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
/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
$ 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
/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

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

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

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

ブラウザで確認

/var/www/html/phpinfo.php
<?php echo phpinfo();?>

BASIC認証かける場合

nginxで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;
    }
}

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/

私的便利プラグイン集
管理画面でのSSL通信

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

設定

/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

インストール

$ 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

設定

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

SSL

光の速さのWEBサーバー(nginx)をlet's encryptでSSL化及びHTTP/2化。ついでにセキュリティ評価をA+にする。
nginx連載6回目: nginxの設定、その4 - TLS/SSLの設定
Amazon Linux で certbot(letsencrypt) を使って SSL 証明書を取得する

/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

#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/[ドメイン]/ 以下

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

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

}

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

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

/etc/nginx/nginx.conf
server {
    listen       80 default_server;
    listen       [::]:80 default_server;
    server_name  localhost;
    return 301 https://$host$request_uri;
}

HSTS

/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
/etc/nginx/nginx.conf
server {
        listen 443 ssl;

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

}

セキュリティ評価

Qualys SSL Report
スクリーンショット 2016-05-11 15.15.01.png

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

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8