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

AmazonLinux2へのnginx + php-fpm + php7.2セットアップメモ

More than 1 year has passed since last update.

目的

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/

Why do not you register as a user and use Qiita more conveniently?
  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
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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