AWS(Amazon Linux)にnginxをインストール

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.conf

nginx.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入れないといけなかったのを忘れていました。

関連記事AWSにElasticsearch 5.6をインストール