Attention : Amazon Linux 2 がリリースされており、この記事は古くなっています。
前回の記事でElasticsearchをインストールしたので、ドキュメントを登録していったりするかと思いきや、他の必要なミドルウェアをインストールします。
今回はnginx。
併せてFastCGIの設定も行います。
nginxとは
“エンジンエックス”と読むのですが、Webサーバーです。
つい数年前までWebサーバーと言えばApacheだったのですが、Webサイトへのアクセス増加や、Webサーバーの役割がWebページのホスティングだけでなくWebAPIを提供することなどに広がってきたことで、高パフォーマンスなWebサーバーが求められるようになりました。
そのような中で登場したのがnginxです。
インストール
nginx
Amazon Linux向けにはnginxのパッケージが用意されていますので、それをインストールします。
Amazon Linux...なんか避けていましたが、便利な様子です。
後述するPHPにちても、過去や最新バージョンのパッケージが揃っているなど一般的なアプリケーションは準備されています。
CentOSのようにremiリポジトリを追加して・・・とかいう心配はあまり要らないようです。
$ sudo yum list nginx Loaded plugins: priorities, update-motd, upgrade-helper Available Packages nginx.x86_64 1:1.12.1-1.33.amzn1 amzn-main $ sudo yum -y install nginx Loaded plugins: priorities, update-motd, upgrade-helper amzn-main | 2.1 kB 00:00:00 amzn-updates | 2.5 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package nginx.x86_64 1:1.12.1-1.33.amzn1 will be installed 中略 Installed: nginx.x86_64 1:1.12.1-1.33.amzn1 Dependency Installed: gperftools-libs.x86_64 0:2.0-11.5.amzn1 libunwind.x86_64 0:1.1-10.8.amzn1 Complete!
まだfasc-cgiの設定などもしないといけないので今起動ししても仕方ないけれど、動作確認のために起動します。
$ sudo service nginx start Starting nginx: [ OK ]
自動起動の設定
sudo chkconfig --add nginx
PHP
php7.0をインストールします。
もうすぐphp7.2も出ようかという昨今ですが、互換性重視でphp7.0を選択しました。
必要そうなパッケージを一気にインストールします。
$ sudo yum -y install php70 php70-gd php70-json php70-mbstring php70-mcrypt php70-mysqlnd php70-opcache php70-pdo php70-xml php70-xmlrpc php70-zip amzn-main | 2.1 kB 00:00:00 amzn-updates | 2.5 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package php70.x86_64 0:7.0.21-1.24.amzn1 will be installed 中略 Installed: php70.x86_64 0:7.0.21-1.24.amzn1 php70-gd.x86_64 0:7.0.21-1.24.amzn1 php70-json.x86_64 0:7.0.21-1.24.amzn1 php70-mbstring.x86_64 0:7.0.21-1.24.amzn1 php70-mcrypt.x86_64 0:7.0.21-1.24.amzn1 php70-mysqlnd.x86_64 0:7.0.21-1.24.amzn1 php70-opcache.x86_64 0:7.0.21-1.24.amzn1 php70-pdo.x86_64 0:7.0.21-1.24.amzn1 php70-xml.x86_64 0:7.0.21-1.24.amzn1 php70-xmlrpc.x86_64 0:7.0.21-1.24.amzn1 php70-zip.x86_64 0:7.0.21-1.24.amzn1 Dependency Installed: apr.x86_64 0:1.5.1-1.12.amzn1 apr-util.x86_64 0:1.4.1-4.17.amzn1 httpd24.x86_64 0:2.4.27-3.75.amzn1 httpd24-tools.x86_64 0:2.4.27-3.75.amzn1 libXpm.x86_64 0:3.5.10-2.9.amzn1 libmcrypt.x86_64 0:2.5.8-9.1.2.amzn1 libtool-ltdl.x86_64 0:2.4.2-20.4.8.5.32.amzn1 libwebp.x86_64 0:0.3.0-3.5.amzn1 php70-cli.x86_64 0:7.0.21-1.24.amzn1 php70-common.x86_64 0:7.0.21-1.24.amzn1 php70-process.x86_64 0:7.0.21-1.24.amzn1 Complete!
php-fpm
先程インストールしたphp7.0に合わせたphp-fpmをインストールします。
$ sudo yum -y install php70-fpm Loaded plugins: priorities, update-motd, upgrade-helper amzn-main | 2.1 kB 00:00:00 amzn-updates | 2.5 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package php70-fpm.x86_64 0:7.0.21-1.24.amzn1 will be installed 中略 Installed: php70-fpm.x86_64 0:7.0.21-1.24.amzn1 Complete!
起動しても・・・起動します。
$ sudo service php-fpm start Starting php-fpm-7.0: [ OK ]
・・・設定を変更しないといけないのを思い出しました。
www.confにあるユーザーの設定を変更しなくてはいけません。
デフォルトではapacheになっています。
$ cd /etc/php-fpm-7.0.d/ $ sudo cp -p www.conf www.conf.bk # バックアップを取得 $ sudo vi www.conf
user = apache
group = apache
という箇所があるので、それぞれapache
の箇所をnginx
に書き換えます。
ついでに、ユニックスドメインソケットを使うように変更します。
理由はその方が速いから、というだけです。
listen = 127.0.0.1:9000
という箇所を
listen = /var/run/php-fpm.70.sock
詳細はおいておいて、ここで指定したファイルを通じてphp-fpmと通信するわけです。
で、そのファイルがnginxから読み取れるように、ファイル作成ユーザーも設定します。
;listen.owner = nobody
;listen.group = nobody
をそれぞれ、
listen.owner = nginx
listen.group = nginx
に変更します。
コメント行を表す先頭のセミコロンも削除しているのでお忘れなく。
※listen.ownerとlisten.groupを変更せずにphp-fpmを起動してしまった場合、/var/run/php-fpm.70.sockがrootユーザーで作成されてしまいます。
そうすると、後から変更してもすでにrootユーザで作成されたファイルがあるので、php-fpmの起動に失敗するかもしれません。
一度、/var/run/php-fpm.70.sockを削除してから再度起動してみてください。
※サイトによっては/tmpにこのファイルを指定するように指示するサイトもあるようですが、うまく動かないケースがあるようです。
気を取り直して、再度起動。
$ sudo service php-fpm restart Stopping php-fpm-7.0: [ OK ] Starting php-fpm-7.0: [ OK ]
うまくいきました。
php-fpmについても自動起動の設定をします。
$ sudo chkconfig --add php-fpm
※しかし後で設定が不足していることが分かります。
nginxの設定
nginxの設定ファイルもバックアップを取ります。
$ cd /etc/nginx/ $ ls | grep nginx nginx.conf nginx.conf.default $ sudo cp -p nginx.conf.default nginx.conf.default.bk $ sudo vi nginx.conf
律儀にnginx.conf.defaultというファイルがありますが、無視してバックアップ。
httpディレクティブに以下のfastcgi設定を追加
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=APP_CACHE:4m inactive=1d max_size=50m; fastcgi_cache_key "$scheme$request_method$host$request_uri"; fastcgi_cache_use_stale error timeout invalid_header http_500;
index index.html index.htm index.php;
httpディレクティブにindexの設定もあるので、index.phpを追記しておきます。
後で以下のlocationディレクティブを、各バーチャルホストのserverディレクティブに追加します。
が、とりあえずnginx.confにあるデフォルトのserverディレクティブに記述してエラーがないか、php-fpmがちゃんと動作しているかを確認します。
location ~ [^/]\.php(/|$) { fastcgi_split_path_info ^(.+\.php)(/.+)$; if (!-f $document_root$fastcgi_script_name) { return 404; } fastcgi_pass unix:/var/run/php-fpm.70.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; }
そしてnginxを再起動。
sudo service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ] $ sudo service nginx status nginx (pid 25306) is running...
無事起動しました。
phpの動作についても確認します。
nginxのデフォルトのドキュメントルートは
/usr/share/nginx/html
に設定されていました。
そこにtest.phpという名前で以下の内容のファイルを作成します。
そして、http://ホスト名/test.phpへアクセス。・・・失敗です。 nginxか出力しているエラーなので、nginxのログを見てみます。
2017/10/25 02:33:54 [error] 2946#0: *15 connect() failed (111: Connection refused) while connecting to upstream, client: 111.89.114.65, server: localhost, request: "GET /test.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "52.196.20.255"
fastcgi://127.0.0.1:9000
って・・・ユニックスドメインソケットを使うように設定したはずなんですけれど。ところで、ちょっと見慣れないファイルがあります。
いや、別に元々ある設定ファイルなのですが、変更したことがないのでスルーしていました。$ ls -al /etc/nginx/conf.d drwxr-xr-x 2 root root 4096 Oct 24 09:24 . drwxr-xr-x 4 root root 4096 Oct 25 02:48 .. lrwxrwxrwx 1 root root 36 Oct 24 09:24 php-fpm.conf -> /etc/alternatives/nginx-php-fpm.conf -rw-r--r-- 1 root root 124 Sep 14 15:50 php-fpm.conf-7.0 -rw-r--r-- 1 root root 283 Sep 11 19:56 virtual.confnginx.confの
include /etc/nginx/conf.d/*.conf;
という設定によって、このディレクトリにある設定ファイルが読み込まれています。
*.conf
が読み込まれるので、使われているのはphp-fpm.confの方です。この、php-fpm.confの記述は以下のようになっています。
# PHP-FPM FastCGI server # network or unix domain socket configuration upstream php-fpm { server 127.0.0.1:9000; }ちょっと見るからに怪しいんですけど・・・
nginxに出力されていたエラーupstream: "fastcgi://127.0.0.1:9000"
とも合致します。
CentOSにremiリポジトリからインストールした際にはphp-fpm.confにこのディレクティブはなかったので、完全に見落としていました。
server 127.0.0.1:9000;
を
server unix:/var/run/php-fpm.70.sock;
に書き換えてphp-fpmを再起動します。$ sudo service php-fpm restart Stopping php-fpm-7.0: [ OK ] Starting php-fpm-7.0: [ OK ] $ sudo service nginx restart Stopping nginx: [ OK ] Starting nginx: [ OK ]さて、ここで問題なくphp-fpmを使ったFastCGIで動いているかどうか確認してみます。
php-fpmのログは/var/log/php-fpm/7.0/error.log
に出力されています。[25-Oct-2017 02:04:33] NOTICE: fpm is running, pid 3017 [25-Oct-2017 02:04:33] NOTICE: ready to handle connections・・・アクセスしてどうかなど、何も出ていません。
アクセスログが出力されるように設定します。以下のページを参考にしました。
ドキュメント読めば設定方法が分かるかと思いましたが、この設定の書き方はちょっと分かりにくい。www.conf<に設定を追加します。
;prefix = /path/to/pools/$pool
という行がありますので、これを変更してログの出力先ディレクトリを指定します。
prefix = /var/log/php-fpm/7.0/$pool.access.log
に変更します。
設定ファイルの上の方で[www]
という記載がありますが、これが$poolに入りますので、/var/log/php-fpm/7.0/www.access.log
というディレクトリに出力されます。
事前にディレクトリを作成しておきます。$ sudo mkdir -p /var/log/php-fpm/7.0/www.access.logそして再起動
$ sudo service php-fpm restart Stopping php-fpm-7.0: [ OK ] Starting php-fpm-7.0: [ OK ]無事表示されました。
これで、/var/log/php-fpm/7.0/www.access.logにもアクセスログが・・・出ていません。
出ていませんよ。
php-fpm関連のエラーを修正してphpが実行されるようになったので、FascCGI経由で実行されていることは間違いないようですが、アクセスログが出ていません。
これはちょっとまたいずれ解決するということで・・・まだMariaDB入れないといけなかったのを忘れていました。