Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

前提

  • 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のモジュールの再確認を!

masch
noranekoworks
業務システム、Webサービス、モバイルアプリを中心に開発するエンジニア集団です。
http://www.noraneko.works/
Why not register and get more from Qiita?
  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