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、HTTPS、SMTP、POP3、IMAPのリバースプロキシの機能などを持っている。
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) の略でPHPのFastCGI実装のひとつです。 CGI(Common Gateway Interface)というWeb上でPHPを動作させるための仕組みです。 FastCGIはCGIの問題を解決しプログラム動作速度の向上や、サーバの負荷の低減が可能です。
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がある場所に設定するだけなんですけど、私の場合すぐに表示されなくて色々手間がかかったので、これからやるやり方はおすすめできません。 できるなら、もう一度初めからインストールするほうが楽だと思いました。
私が行った方法はエラーが出るたびにログファイルを確認してトライ&エラーで一つずつ修正していったので、詳細な説明は難しいです。(すいません...)
まず、ApacheでSSLの設定を行っていたので、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
その後、何度もエラーメッセージが表示されたので、ログを確認しながら一つずつ修正しました。
流れとしては
- ログファイルを確認
- 必要なフォルダの権限を変更する
というのを繰り返してどうにかEC-CUBEのトップページが表示できるのを確認できました。
後記
ほとんど手をつけていないEC-CUBEのサーバでもこれだけ手がかかったので、色々プラグインや商品を登録していた場合は色々不具合が出ていたかもしれません。
サーバを構築するときは、今後必要になりそうな機能を決めておいて、それに見合うWebサーバを選定しておいたほうがいいと思いました。
このブログのWebサーバをnginxにするのはしばらく考えたいと思います。 Webサーバを入れ替えるのではなく、サーバ構築時にnginxにするのが楽かなと思います。
おまけ
ついでにphpのバージョンアップで行ったApache Benchで処理性能を測ってみました。 Requests per secondの値で比較するとapacheに比べnginxが約1.1倍性能が上がっているみたいです。
(クリックで開きます)
# 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)