目的
EC2インスタンス(Amazon Linux 2)に
- nginx (1.12)
- php (7.2 OPcache有効)
- php-fpm
をインストールする。
ベース環境
OS : Amazon Linux 2
(AMI ID : amzn2-ami-hvm-2.0.20181114-x86_64-gp2 (ami-0a2de1c3b415889d2))
OS初期設定
# パッケージ更新
$ sudo yum update -y
# タイムゾーン設定・確認
$ timedatectl status
Local time: Fri 2018-11-23 05:56:04 UTC
Universal time: Fri 2018-11-23 05:56:04 UTC
RTC time: Fri 2018-11-23 05:56:04
Time zone: n/a (UTC, +0000)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
Local time: Fri 2018-11-23 14:56:43 JST
Universal time: Fri 2018-11-23 05:56:43 UTC
RTC time: Fri 2018-11-23 05:56:43
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
# ロケール、キーボードレイアウト設定・確認
$ localectl status
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: n/a
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106
$ localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp106
X11 Layout: jp
X11 Model: jp106
X11 Options: terminate:ctrl_alt_bksp
各種インストール
nginx / php-fpm / phpをインストール
Extras Libraryで利用可能なtopicを確認
$ amazon-linux-extras list
(nginx1.12とphp7.2が利用可能であることを確認する)
nginxをインストール
$ amazon-linux-extras info nginx1.12
nginx1.12 recommends nginx # yum install nginx
$ sudo amazon-linux-extras install -y nginx1.12
$ nginx -v
nginx version: nginx/1.12.2
php/php-fpmをインストール
$ amazon-linux-extras info php7.2
php7.2 recommends php-cli # yum install php-cli
php7.2 recommends php-pdo # yum install php-pdo
php7.2 recommends php-fpm # yum install php-fpm
php7.2 recommends php-json # yum install php-json
php7.2 recommends php-mysqlnd # yum install php-mysqlnd
$ sudo amazon-linux-extras install -y php7.2
# 他に必要なライブラリがあれば個別にインストール
$ sudo yum install -y php-mbstring php-opcache
$ php -v
PHP 7.2.11 (cli) (built: Oct 24 2018 17:51:11) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies
$ php-fpm -v
PHP 7.2.11 (fpm-fcgi) (built: Oct 24 2018 17:55:29)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies
補足)CentOS7の場合
# 外部リポジトリの追加
sudo yum install -y epel-release
sudo yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# nginxをインストール
sudo yum install -y nginx
# php本体と必要モジュールをインストール
sudo yum install -y --enablerepo=remi-php72 php php-cli php-pdo php-fpm php-json php-mysqlnd php-mbstring php-opcache
設定変更
php-fpm設定
/etc/php-fpm.d/www.conf
nginxユーザ、nginxグループで実行されるように修正
;user = apache
user = nginx
;group = apache
group = nginx
UNIXドメインソケットで通信するように修正(Amazon Linux 2では変更の必要なし)
;listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock
UNIXドメインソケットがnginxユーザ、nginxグループで作成されるように修正
;listen.owner = nobody
listen.owner = nginx
;listen.group = nobody
listen.group = nginx
php設定
/etc/php.ini
; HTTPレスポンス内のPHPバージョン情報を非表示にする
;expose_php = On
expose_php = Off
; EC2インスタンスのスペックにあわせて利用メモリ上限を設定
;memory_limit = 128M
memory_limit = 1024M
; POSTサイズ上限、ファイルアップロードサイズ上限は必要に応じて変更
post_max_size = 8M
upload_max_filesize = 2M
; タイムゾーンを日本標準時間に変更
date.timezone = Asia/Tokyo
; mbstringのデフォルト言語を日本語に変更
mbstring.language = Japanese
; HTTP入力文字のエンコーディングを内部文字のエンコーディングに自動変換しない
mbstring.encoding_translation = Off
; 文字コードを自動検出する際の優先順位を設定
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
OPcache実行時設定追加(Amazon Linux 2では不要)
http://php.net/manual/ja/opcache.configuration.php
zend_extension=/[それぞれのPHPのextensionのパス]/php_opcache.dll
[opcache]
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1 # PHP 7.2.0で削除
nginx設定
/etc/nginx/nginx.conf
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
if (!-f $document_root$fastcgi_script_name) {
return 404;
}
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
}
(AmazonLinux2では不要)
拡張子が「.php」をアクセス対象に追加(serverディレクティブに追加)
UNIXドメインソケットを利用するため、ソケットファイルのパスを設定
/etc/nginx/conf.d/php.conf
(AmazonLinux2では変更不要)
/etc/nginx/conf.d/default.conf (新規ファイル)
httpブロックにセキュリティ関連の設定を追加
server_tokens off;
/etc/nginx/default.d/security.conf (新規ファイル)
serverブロックにセキュリティ関連の設定を追加
etag off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
#add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self'; style-src 'self'; child-src 'none' object-src 'none'";
(Content-Security-Policyは各サイトに合わせた設定を追加すること)
nginx設定構文チェック
sudo nginx -t
各サービスの起動、自動起動設定、起動確認
sudo systemctl start php-fpm
sudo systemctl start nginx
sudo systemctl enable php-fpm
sudo systemctl enable nginx
systemctl status php-fpm
systemctl status nginx
nginxとphp-fpmのUNIXドメインソケット接続確認
$ netstat -al --protocol=unix |egrep "Proto|fpm"
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 61433 /run/php-fpm/www.sock
ブラウザ表示確認
echo '<?php phpinfo(); ?>' | sudo tee /usr/share/nginx/html/phpinfo.php
ブラウザから「http://[domain name]/phpinfo.php」にアクセスし、
PHPの設定内容が表示されることを確認する。
※ OPcacheが有効であることを確認
Opcode Caching : Up and Running
Optimization : Enabled
参考サイト
https://ninolog.com/set-amazonlinux2-aws-ec2/
https://ninolog.com/set-amazonlinux2-nginx-phpfpm-aws-ec2/