PHP
nginx
AWS
EC2
Laravel

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

More than 1 year has 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のモジュールの再確認を!