EC2ですばやくNginx+php7-fpmでPHPを動かす(ちょっとLaravelも)

php PHP
nginx nginx
aws AWS
aws-ec2 EC2
laravel laravel

前提

  • AWS 管理コンソールでAmazon LinuxEC2インスタンスを作成済
  • 作業するユーザーを作成済

今回使用したバージョン

Nginx 1.8.1
PHP 7.0.8

Nginx、 PHP関連のインストール

PHP7を取得するために、scl-utilsとremiインストールし、Nginx、PHP、PHPの各種モジュールをインストール。
PHPのモジュールはアプリに必要なモジュールを適宜いれる

$ sudo rpm -Uvh ftp://ftp.scientificlinux.org/linux/scientific/6.4/x86_64/updates/fastbugs/scl-utils-20120927-8.el6.x86_64.rpm
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
$ sudo yum install -y nginx php70 php70-fpm php70-gd php70-mbstring php70-mysql

php7−fpmの設定

php7-fpmの設定ファイルを変更する
今回はUNIXドメインソケットで設定
以下、編集箇所の抜粋

/etc/php-fpm-7.0.d/www.conf
user = nginx
group = nginx
listen = /var/run/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0666
catch_workers_output = yes

※user、groupはnginxとしているが環境に合わせて設定する
※一番最後のcatch_workers_outputはエラーログを出力するため

Nginxの設定

以下は、nginx.confのserver設定のみを抜粋
(インストールした時に入ったもののserver設定のみ変更して、他は変更していません)

/etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  example.com;
        root         /usr/share/nginx/html;
        index        index.php index.html index.htm;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {

        }

        location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   unix:/var/run/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;
        }

        # redirect server error pages to the static page /40x.html
        #
        error_page 404 /404.html;
            location = /40x.html {
        }

        # redirect server error pages to the static page /50x.html
        #
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
/etc/nginx/conf.d/php-fpm.conf
upstream php-fpm {
    server unix:/var/run/php-fpm.sock;
}

サービスの起動

$ sudo service php-fpm start
$ sudo service nginx start

実行確認

/usr/share/nginx/htmlphpinfo()を記述したphpファイルを作成
今回はinfo.phpという名前にしておく

ブラウザからhttp://サーバIP/info.php にアクセスし、phpinfoが表示されることを確認
41f4493b-8bc8-c058-d1b1-40b0bd7efe9d.png

最後にLaravel 5.2のプロジェクトを起動について

ドキュメントルートも変更し、/var/www/ 配下にlaravelのプロジェクトを格納(今回は laravelpj という名前のプロジェクト)

プロジェクト配下の所有者、グループをnginxに変更する

$ sudo chmod -R nginx:nginx /var/www/laravelpj

先程のnginx.conf を少し変更

/etc/nginx/etc/nginx/nginx.conf
    server {
        listen       80 default_server;
        server_name  example.com;
        root         /var/www/laravelpj/public;
        index        index.php index.html index.htm;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
            if (!-f $document_root$fastcgi_script_name) {
                return 404;
            }

            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass   unix:/var/run/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;
        }
    }

サービスの再起動

$ sudo service nginx restart

注意書き

lalavelのプロジェクトにアクセスしたら、以下のエラーが発生した。

PHP Fatal error:  Uncaught ReflectionException: Class log does not exist in /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php:734
Stack trace:
#0 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(734): ReflectionClass->__construct('log')
#1 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(629): Illuminate\Container\Container->build('log', Array)
#2 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Foundation/Application.php(697): Illuminate\Container\Container->make('log', Array)
#3 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(849): Illuminate\Foundation\Application->make('log')
#4 /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php(804): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter)) in /var/www/laravelpj/vendor/laravel/framework/src/Illuminate/Container/Container.php on line 734

ネットで検索してみると、laravelプロジェクトの .envファイルのvalueにブランクが含まれる、もしくは2バイト文字を使用しているというのと、logファイルのパーミッションの問題が多く引っ掛かったが、今回の場合は単純に必要なモジュールがなかったからだったようだ。
PHPを再インストールしたので原因の特定ができなかったが、恐らくpdo、mysqlのモジュールが足りていなかったためだと思う。
同じエラーが発生している人は、.envファイルと、logファイルのパーミッションと、PHPのモジュールの再確認を!