LoginSignup
22
21

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-22

前提

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

22
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21