Memorandum

普段の生活の覚え書き。主に技術録

apacheからnginxへの移行検討

現在このブログではApacheを使っていますが、もう一つ有名なwebサーバとしてNginxというのがあります。

Nginxのサーバがどのようなものか気になったので、今回はwebサーバについての解説と、apacheからNginxへサーバ変更してみたのでご紹介します。

Webサーバとは

WebサーバはHTTPに則り、ウェブブラウザを使用して接続する(リクエスト)に対して、HTMLや画像などを提供する(レスポンス)機能やプログラムのことである。

代表的な例としてApacheやNginx、IISなどがある。 シェア率としてはApacheが優勢だが、近年Nginxが伸びてきており拮抗している。

Apacheとは

Apache(アパッチ)とは1995年から開発が続けられており、現在世界中で最も多く使われているソフトウェアである。 モジュールによって機能追加を実現している。

macOSの標準のWebサーバとなっており、私のMacBook Proでも以下のコマンドで起動できた。

$ php -v
$ httpd -v
$ sudo apachectl start
# 起動後、localhost:80にブラウザからアクセスできる。

Nginxとは

Nginx(エンジンエックス)は2004年に開発がスタートし、高い処理性能・並行性に焦点を当てて開発されている。 初期からHTTP、HTTPSSMTPPOP3IMAPのリバースプロキシの機能などを持っている。

Apache vs Nginx

Apacheはマルチプロセスのプロセス駆動アーキテクチャになっている。 そのため大量のリクエストが来た場合、プロセスが同時に起動するためメモリ消費量などの負荷が大きくなりやすい。

Nginxはシングルスレッドモデルのイベント駆動アーキテクチャとなっており、リクエストが大量に来ても、少量のプロセスだけでループ処理するため負荷がかかりにくい。

逆にApacheのメリットとしては開発年数が長く実績が多いので、バグが出にくかったり技術情報が手に入れやすいことが挙げられます。またWebサーバに特化しているので、Webサーバに必要な機能を豊富です。

Nginxのデメリットとしては、NginxだけではPHPなどのスクリプト言語を処理する機能がついていません。またCPUリソースを多く消費する処理ではApacheに比べ分が悪いかもしれません。

ApacheからNginxへ

今回は前回EC-CUBEをインストールしたMac上のvagrantを使って、ApacheからNginxにしてみようと思います。

実行環境

apacheの停止

$ systemctl stop httpd.service
# 完全に不要な方は以下を実行
$ yum remove -y httpd

nginxの環境を作る

最新の安定版ngninxをインストールするためにリポジトリを追加します。 以下のコマンドでファイルを作成し、リポジトリ情報を書きます。

$ vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

リポジトリを追加したら以下のコマンドでインストール・起動します。

$ yum -y --enablerepo=nginx install nginx
$ systemctl start nginx.service

これでブラウザから接続するとnginxの初期ページが表示されると思います。

php環境の設定

そのままだとphpを実行することが出来ないので、php-fpmをインストールします。 php-fpmとはFPM (FastCGI Process Manager) の略でPHPFastCGI実装のひとつです。 CGI(Common Gateway Interface)というWeb上でPHPを動作させるための仕組みです。 FastCGICGIの問題を解決しプログラム動作速度の向上や、サーバの負荷の低減が可能です。

php-fpmは使用するphpのバージョンに合わせてインストールする必要があるため、私はphp7.2に合わせてインストールしました。

$ yum install php72-php-fpm

インストール後php-fpmの設定ファイルを編集します。 デフォルトではapache向けの設定になっているので、nginx向けの設定に変更します。

$ vim /etc/opt/remi/php72/php-fpm.d/www.conf

# user = nginx
# group = nginx
# listen.owner = nginx
# listen.group = nginx
# listen.mode = 0666

次にnginx側の設定を編集します。下記の部分がコメントアウトされていますので、コメントを外して編集します。

$ /etc/nginx/conf.d/default.conf

location ~ \.php$ {
    #root html;
    root /usr/share/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

設定できたらルートディレクトリにphpファイルを置いてphpが実行できるか確認します。

$ vim index.php
# index.phpの中身
<? php
    phpinfo();
>

EC-CUBEの設定

ここまで出来たら後はルートディレクトリをEC-CUBEがある場所に設定するだけなんですけど、私の場合すぐに表示されなくて色々手間がかかったので、これからやるやり方はおすすめできません。 できるなら、もう一度初めからインストールするほうが楽だと思いました。

私が行った方法はエラーが出るたびにログファイルを確認してトライ&エラーで一つずつ修正していったので、詳細な説明は難しいです。(すいません...)

まず、ApacheSSLの設定を行っていたので、nginxでも設定しました。 nginxの設定ファイル(default.conf)に下記の記述を追加しました。

ssl          on;
ssl_certificate /etc/pki/CA/...; #サーバ証明書ファイル
ssl_certificate_key /etc/pki/CA/...; #サーバ秘密鍵ファイル

SSL接続できることを確認したところ、データベース接続エラーが表示されました。 apacheでは接続できていたのですが、nginxだと出来ませんでした。

そのため別途PHPライブラリを導入しました。

$ yum install php72-php-pdo
$ yum install php72-php-mysqlnd

その後、何度もエラーメッセージが表示されたので、ログを確認しながら一つずつ修正しました。

流れとしては

  1. ログファイルを確認
    • nginxのログ(access.log error.log)
    • ec-cubeのログ(app/log)
    • phpのログ(php.iniのdisplay_errors をon)
  2. 必要なフォルダの権限を変更する

というのを繰り返してどうにかEC-CUBEのトップページが表示できるのを確認できました。

後記

ほとんど手をつけていないEC-CUBEのサーバでもこれだけ手がかかったので、色々プラグインや商品を登録していた場合は色々不具合が出ていたかもしれません。

サーバを構築するときは、今後必要になりそうな機能を決めておいて、それに見合うWebサーバを選定しておいたほうがいいと思いました。

このブログのWebサーバをnginxにするのはしばらく考えたいと思います。 Webサーバを入れ替えるのではなく、サーバ構築時にnginxにするのが楽かなと思います。

おまけ

ついでにphpのバージョンアップで行ったApache Benchで処理性能を測ってみました。 Requests per secondの値で比較するとapacheに比べnginxが約1.1倍性能が上がっているみたいです。

(クリックで開きます)

apache

# ab -n 10 -c 10 https://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.4.6
Server Hostname:        localhost
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        18165 bytes

Concurrency Level:      10
Time taken for tests:   2.149 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      185110 bytes
HTML transferred:       181650 bytes
Requests per second:    4.65 [#/sec] (mean)
Time per request:       2149.263 [ms] (mean)
Time per request:       214.926 [ms] (mean, across all concurrent requests)
Transfer rate:          84.11 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:        4  443 571.2     57    1239
Processing:   260  941 325.1   1125    1230
Waiting:      205  920 328.5   1119    1208
Total:        264 1385 516.2   1241    1940

Percentage of the requests served within a certain time (ms)
 50%   1241
 66%   1683
 75%   1933
 80%   1935
 90%   1940
 95%   1940
 98%   1940
 99%   1940
100%   1940 (longest request)

nginx

# ab -n 10 -c 10 https://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        nginx/1.14.0
Server Hostname:        localhost
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        18165 bytes

Concurrency Level:      10
Time taken for tests:   1.940 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      184730 bytes
HTML transferred:       181650 bytes
Requests per second:    5.16 [#/sec] (mean)
Time per request:       1939.769 [ms] (mean)
Time per request:       193.977 [ms] (mean, across all concurrent requests)
Transfer rate:          93.00 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:        3   21   6.2     23      23
Processing:   199 1271 421.3   1270    1716
Waiting:      197 1271 421.8   1270    1716
Total:        202 1292 426.7   1293    1738

Percentage of the requests served within a certain time (ms)
 50%   1293
 66%   1309
 75%   1524
 80%   1734
 90%   1738
 95%   1738
 98%   1738
 99%   1738
100%   1738 (longest request)