Nginxはリバースプロキシとしてかなり優秀なサーバーアプリケーションで、自分も愛用しているのですが、あくまでリバースプロキシとしてしか使っていませんでした。
しかし、Nginxの本来の役割はWebサーバーですので当然Nginx自身がアプリの動作環境になることも可能です。
今回機会があってAWS EC2上のNginxで直接アプリケーションを動かす必要が出てきたので、実際にセットアップしてみました。
NginxにはApacheのようにモジュールを組み込んでPHPを動作させるような仕組みがない為、CGIを利用して動作できるようにします。
ただ、通常のCGI版PHPだと重いので、Fast CGI版のPHPが利用できるphp-fpmを利用します。
今回はPHP7.1の環境をインストールします。
まずは必要なパッケージをインストールします。
#epelリポジトリをインストール
sudo yum -y install epel-release
#remi リポジトリをインストール
sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
#nginxをインストール
sudo yum -y install nginx
#php-fpm(php7.1)をインストール
sudo yum -y install --enablerepo=remi,remi-php71 --disablerepo=amzn2-core php-fpm
#※--disablerepo=amzn2-coreしておかないと古いphp-fpmがインストールされます。
インストールが完了したら設定していきます。
sudo vi /etc/php-fpm.d/www.conf
次の項目を編集します。
;localから参照するのでUNIX SOCKETを設定。
- ;listen = 127.0.0.1:9000;
+ listen = /var/run/php-fpm.sock
;UNIX SOCKETファイルのユーザーとグループの指定(指定しないとrootとなるが、nginxからアクセスできなくなる。)
- ;listen.owner = nobody
- ;listen.group = nobody
+ listen.owner = nginx
+ listen.group = nginx
Nginx側も設定を変更します。
Nginxでは各バーチャルホストごとの設定を定義するserverセクションに記述します。
server {
listen 80;
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/ssl/fullchain.pem;
ssl_certificate_key /path/to/ssl/privkey.pem;
client_max_body_size 1g;
location / {
root /path/to/docroot;
index index.php index.html index.htm;
allow all;
}
location ~ \.php$ {
root /path/to/docroot;
fastcgi_pass unix:/var/run/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
allow all;
}
}
基本的には上記のような設定でOKです。
設定が完了したらphp-fpmとnginxを再起動します。
sudo systemctl start php-fpm nginx
sudo systemctl enable php-fpm nginx
あとはおなじみのphpinfo();をドキュメントルートに置いて、phpが実行されているか確認します。
vi /path/to/docroot/phpinfo.php
<?php
phpinfo();
?>
あとは
http://example.com/phpinfo.php
のようにして、phpの環境情報が表示されれば成功です。