カテゴリー
WordPress

【nginx】【超高速】 WordPress のウェブサーバーを nginx にして、プロキシキャッシュを使ってパフォーマンスをとても向上させるまでの試行錯誤です!【Apache からの卒業】

はじめに。本投稿を読むと役に立つであろう方

  • VPS で WordPress サイトを運営している
  • ウェブサーバは Apache だが、nginx が速いと聞いて乗り換えたいと思っている
  • サーバーは新しく立てず、今の使用しているサーバを継続したい
  • nginx は初めてで設定の意味も多少知りたい

本ブログを運用しております WordPress のウェブサーバーは現在 Apache を使用しています。ですが nginx と PHP-FPM とキャッシュで WordPress を動かすようにして、「爆速」にしたいですの!

でも難しいですわ><。だってわたくし、nginx ってなに?という状態ですもの。でもやってみますわ!

なお、現在のウェブサーバ、Apache の設定は今まで次のようにいじりましたわ。

また、現在の WordPress を動かしているサーバの状態をまとめます。この中の、Apache が使われなくなる予定ですの。

  • CentOS 5.10
  • Apache 2.2.3
  • MySQL 5.5.38
  • PHP 5.4.29

では、はじめましょう。次の順番で作業しましたの。WordPress が動いている状態で作業を進め、Apache から nginx へ切替(このとき数秒 WordPress が停止)、そしてプロキシキャッシュを導入、結果として超高速にできましたの!

まずは、目次をお見せしますわね。

  1. nginx のインストール
    1.  nginx 公式リポジトリの導入
    2. nginx のインストール
    3. 静的 HTML で nginx の動作確認
  2. PHP-FPM のインストール
    1. PHP-FPM のインストール
    2. PHP-FPM の設定ファイル編集
    3. PHP-FPM の起動設定と起動
  3. nginx のプロキシキャッシュ無しの最低限設定
    1. 最低限のnginx 設定ファイル編集をする
    2. Apache から nginx に切り替える
    3. nginx と Apache の起動設定を変更する
  4. nginx にプロキシキャッシュ設定を施し、爆速のレスポンスを手に入れる
    1. nginx 設定にプロキシキャッシュの設定を追加、ウェブサーバ設定も編集
    2. nginx を再起動、効果を確認する
  5. おわりに
  6. ★追記★

1.nginx のインストール

スクリーンショット 2014-06-15 19.47.42.png

1−1.nginx 公式リポジトリの導入

現在の状態で「yum install nginx」としても「No package nginx available. Nothing to do」とエラーになります。リポジトリを別途追加する必要があるんですの。

ではどのリポジトリを?ですけれども、nginx 本家の物がありますので安心してこれを使用いたします。

特に OS やバージョンによって次の引用のように記述を変更する部分がございますので注意してくださいまし。

Replace “OS” with “rhel” or “centos”, depending on the distribution used, and “OSRELEASE” with “5” or “6”, for 5.x or 6.x versions, respectively.

したがって、注意した点は次となりました。

  • リポジトリをダウンロードするのではなく、リポジトリファイルをエディタで作る
  • “OS” → “rhel”  または “centos”。今回は “centos
  • “OSRELEASE” → “5” または “6”。今回は “5
  • リポジトリを普段は無効にするなら enabled=1 → 0 へ修正。「0」と変更した

では実際の作業ですの。まずはファイルを作成し、編集を始めます。

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

そして、次のように記入して、保存いたしました。

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

以前導入した EPEL、Remi、RPMforge のリポジトリファイルの中身と異なり、ずいぶんとスッキリしておりますわね♪

以上で完了です。簡単ですわね♪

1−2.nginx のインストール

次のコマンドで nginx をインストールしますの。nginx リポジトリはデフォルトで無効に設定しましたので、–enablerepo オプションで有効にするように指定しております。

yum --enablerepo=nginx install nginx

簡単ですわ♪ちなみに、nginx バージョン 1.6.0-1.el5.ngx がインストールされました。また、サイズが 346 k と軽いですのね。

また、yum でのインストールによって、/var/cache/nginx ディレクトリがホームの nginx ユーザ(ログイン不可)、グループが CentOS に作られましたの。

なお、リポジトリファイル /etc/yum.repos.d/nginx.repo のたとえば URL 部分が間違っておりますと、次のようなエラーとなりますので注意ですの!

http://nginx.org/packages/icentos/5/i386/repodata/repomd.xml: [Errno 14] HTTP Error 404: Not Found
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: nginx. Please verify its path and try again

てへっ♪

1−3.静的 HTML で nginx の動作確認

80 番のポートはすでに WordPress を動かすのに Apache が使用済みですの。ですから nginx の設定ファイルを修正して 8080 番ポートにアクセスした時に nginx へとつながるようにいたします。

そこで nginx 設定ファイルを編集しますが、その前にバックアップです。

cp -a /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.org

次のように編集しました。

listen       80;

listen       8080;

nginx の準備は整いました。起動いたします。

/etc/init.d/nginx start

ですがこのままでは不十分です。nginx 設定ファイルを編集して 8080 番ポートで受け入れると変更したものの、8080 番ポートが開いている保証はございませんの。といいますか、8080 番ポートは現在閉じられていますの><。ですから、iptables 設定を修正して開けますわ♪

まずはやっぱりバックアップですの。

cp -a /etc/sysconfig/iptables /etc/sysconfig/iptables.org

今回はすぐに戻すこともあり、 iptables コマンドではなく、設定ファイルを直接いじりますわ。

vim /etc/sysconfig/iptables

一部分の抜粋ですけれども、次のように COMMIT の前に1行追加いたしました。

# Generated by iptables-save v1.3.5 on Mon Jan  7 22:50:19 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1010:823511]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3843 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Jan  7 22:50:19 2013

# Generated by iptables-save v1.3.5 on Mon Jan  7 22:50:19 2013
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1010:823511]
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 3843 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Mon Jan  7 22:50:19 2013

iptables を再起動して、設定を反映させます。

/etc/init.d/iptables restart

これでわたくしたちのサーバにはウェブからのアクセスを受け入れる2つのウェブサーバが立った事になります。

  • デフォルトの 80 番ポートでアクセスを受け入れる Apache。WordPress でコンテンツを提供!
  • 8080 番ポートでアクセスを受け入れる nginx。コンテンツは一切なし。nginx が正常に動くかどうかだけを見ます。

では、実際にアクセスしてみます。「https://oki2a24.com:8080/」にウェブブラウザから接続します。。。大丈夫ですわね♪アクセスできました。

スクリーンショット 2014-06-13 19.21.38.png

念のため、80 番ポートのこのサイト(WordPress)にもアクセスできることを確認いたしました♪バッチリ!

確認完了です。今までの操作と逆のことを行い、確認のために行った修正を元に戻します。

  • /etc/sysconfig/iptables ファイルに追加した 8080 番ポートの設定を削除
  • 「/etc/init.d/iptables restart」 で iptables 再起動
  • 「/etc/init.d/nginx stop」で nginx 停止
  • /etc/nginx/conf.d/default.conf ファイルのポートを 80 番に戻す

以上で、インストールした nginx がウェブサーバとして問題なく動くことが確認できました♪

2.PHP-FPM のインストール

スクリーンショット 2014-06-15 19.51.27.png

nginx が正常に動くことが確認できましたけれども、まだ WordPress は動きません。なぜなら、今の nginx では HTML ファイルは返すことができても、PHP と連携しておらず、PHP プログラムが実行できません

Apache の時は、httpd と php を yum install すれば自然に連携してくれましたけれども、nginx ではそうは行かないようですわね♪

ですので、nginx と PHP を連携させるために、PHP-FPM というパッケージをインストール、設定いたしますの♪

2−1.PHP-FPM のインストール

以前インストールした Remi リポジトリがあれば簡単にインストールできますの。

yum --enablerepo=remi install php-fpm

簡単ですわね♪ちなみに、バージョン「5.4.29-3.el5.remi」で、サイズは 1.5 M とnginx よりも大きいですのね。

2−2.PHP-FPM の設定ファイル編集

さて、PHP-FPM の設定ですわ。次のページを参考にいたしました。ありがとう存じます♪

まずはバックアップですの。

cp -a /etc/php-fpm.d/www.conf /etc/php-fpm.d/www.conf.org

編集していきます。

vim /etc/php-fpm.d/www.conf

ポイントは次になります。

  • 「listen」はPHP-FPMが待ち受けを行うポートの設定
    標準では「listen = 127.0.0.1:9000」、つまりローカルホストの9000番ポートになっている。IPアドレスやポートだけでなくUNIXドメインソケットも指定可能で、こちらの方が高速な処理が可能
    → /var/run/php-fpm/php-fpm.sock
  • 「listen.owner」「listen.group」「listen.mode」は unix ソケットを使う場合のパーミッションを設定。
    nginx nginx 0660
  • 「user」および「group」はPHP-FPMの動作ユーザーおよびグループ
    → nginx
  • 「pm.max_children」は 同時に処理できるリクエストの最大数。
    pm が static の場合は作成される子プロセスの数、 pm が dynamic の場合は作成される子プロセスの最大数。
    15
  • 「 pm.start_servers」は 起動時に作成される子プロセスの数。
    pm が dynamic の場合にのみ使われる。
    5
  • 「 pm.min_spare_servers」はアイドル状態のサーバープロセス数の最小値。
    pm が dynamic の場合にのみ使われる。
    2
  • 「 pm.max_spare_servers」はアイドル状態のサーバープロセス数の最大値。
    pm が dynamic の場合にのみ使われる。
    5

編集後のコメント以外の部分は、修正前と修正後で次のようになりました♪

listen = 127.0.0.1:9000
;listen.owner = nobody
;listen.group = nobody
;listen.mode = 0660user = apache
user = apache
group = apache
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
pm.max_children = 15
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 5

設定は以上ですわ。次へ進みましょう♪

おまけ。設定 NG 集(一つだけですけれども)

なお、/var/log/nginx/error.log に次のようなエラーが出たことがございましたが、「listen.owner」「listen.group」「listen.mode」の設定を行っていなかったためでした><。

connect() to unix:/var/run/php-fpm/php-fpm.sock failed (13: Permission denied) while connecting to upstream

2−3.PHP-FPM の起動設定と起動

PHP-FPM は起動しないと nginx と連携していただけません。 Apache では Apache のみを起動すれば PHP が利用できましたけれども、異なりますのね。

サーバを起動した時に Apache や MySQL が自動的に起動されるように設定いたしましたけれども、この PHP-FPM も自動的に起動するようにいたします。nginx もそのようにいたしますが、それは nginx の設定が終わってからにいたしますね。

ここでは忘れてしまいそうな PHP-FPM をサーバ起動時に自動的に起動するようにいたします。

chkconfig php-fpm on

これだけですの簡単ですわ♪念のため確認いたします。

chkconfig --list | grep php-fpm

こちらも、簡単ですわね♪

3.nginx のプロキシキャッシュ無しの最低限設定

スクリーンショット 2014-06-15 20.49.21.png

最終的にはプロキシキャッシュを使用して PHP を動かす負荷を下げると同時にキャッシュを利用してパフォーマンス向上を目指しております。

ですけれども、混乱してしまいましたの><。設定ファイルの意味がわかりません><。ですので、少しずつ理解しながら進めますの。

まずは nginx のウェブサーバのみを使い、プロキシキャッシュは使用しない状態で、わたくしたちのこの WordPressサイトを動かしますの!

3−1.最低限のnginx 設定ファイル編集をする

編集する nginx 設定ファイルは2種類ですの。次のように捉えておりますわ。

  • /etc/nginx/nginx.conf
    → nginx ウェブサーバ全体の設定

  • /etc/nginx/conf.d/default.conf
    → nginx 内で動く WordPress などのアプリケーションごとに作成する設定

今回、default.conf を WordPress の設定用ファイルとして使用いたします。

また、そもそもこのウェブサーバはわたくしたちのこのブログを乗せているためだけに使用しており、複数のアプリケーションでの運用はしておりません。ですから nginx.conf の設定も default.conf の設定も分けて考えなくとも、、、と言えなくもないのでしょうが、分離するところは分離して、考えやすくなりますので nginx の分け方に則りますの♪

では、まずは /etc/nginx/nginx.conf を編集していきます。

vim /etc/nginx/nginx.conf

各パラメータの意味についてはこちらのページが参考になりました。ありがとう存じます。

user  nginx;
# nginxのworkerプロセスの数(通常はCPUのコア数以下に設定)
worker_processes  2;

error_log  /var/log/nginx/error.log warn;
# masterプロセスのプロセスIDを保存するファイル
pid        /var/run/nginx.pid;


events {
    # 1つのworkerプロセスが同時に処理できる最大コネクション数
    worker_connections  1024;
}


http {
    # インクルードファイルでtypesディレクティブはMIMEタイプと拡張子のマッピングを設定
    include       /etc/nginx/mime.types;
    # レスポンスのデフォルトのMIMEタイプを設定
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    # コンテンツのファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使用
    sendfile        on;
    #tcp_nopush     on;

    # 同じクライアントからの再要求をサーバが待つ時間(秒)
    keepalive_timeout  5;

    # 静的な gzip ファイルがある場合はそれを参照
    gzip_static on;
    # gzip を使用
    gzip on;
    # gzip を使用する HTTP バージョンは 1.0
    gzip_http_version 1.0;
    # http レスポンスに Vary: Accept-Encoding ヘッダを追加
    gzip_vary on;
    # gzipの圧縮レベルを 1 (低圧縮)
    gzip_comp_level 1;
    # gzip 対象とするファイル形式(mine タイプで指定)
    gzip_types text/plain
               text/css
               text/xml
               text/javascript
               application/json
               application/javascript
               application/x-javascript
               application/xml
               application/xml+rss;
    # gzip 非対象。IE 1 から 6、Netscape 4
    gzip_disable "MSIE [1-6]\.";
    gzip_disable "Mozilla/4";
    # Proxy 経由での要求でも gzip 対象とする
    gzip_proxied any;
    # gzip で使用するバッファサイズ(16 8k ならば 16 x 8k = 128k を常時使用)
    gzip_buffers 16 8k;

    include /etc/nginx/conf.d/*.conf;
}

続いて、/etc/nginx/conf.d/default.conf です。キャッシュの設定は行いませんので、今サーバで担っているウェブサーバとしての Apache の役割を、nginx で行うための設定となります。

vim /etc/nginx/conf.d/default.conf

次のように修正しました。

server {
    # ポートを指定
    listen       80;
    # ドキュメントルート
    root   /var/www/html/oki2a24.com;
    # インデックスファイル指定
    index  index.php index.html index.htm;
    # 実ファイルがない場合のアクセスファイル
    try_files $uri $uri/ /index.php;

    location / {
        # WordPress パーマリンク設定を利用可能にする
        if (!-e $request_filename) {
            rewrite ^.+?(/wp-.*) $1 last;
            rewrite ^.+?(/.*\.php)$ $1 last;
            # ドキュメントルートから WordPress までの相対パス
            # (ドキュメントルートにインストールしたため相対パスは記入なし)
            rewrite ^ /index.php last;
        }
    }

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
  •  ドキュメントルート「root」が2箇所にあったため、ブロックの外側に出して1箇所にまとめた
  • インデックスファイル指定「index」もブロックの外側に出して、location の内側だけではなく、server ディレクティブ全体でも有効とした
  • URL に実ファイルが指定されていない場合は index.php を探すように try_files を追加
  • 「.php」ファイルへのアクセスは PHP-FPM に接続するが、それを fastcgi_pass で設定する。これを「unix:/var/run/php-fpm/php-fpm.sock」にしたが、意味はよくわかっていない。。。
  • fastcgi_param の「/scripts」のままだと絶対パスでの指定となるようでエラーとなった。参考ページの「$document_root」にして、エラーが解消された。

パーマリンク設定(rewrite)のところは、理解しきっておりませんの><。

今後の課題ですけれども、このようにしなければ「年月日+文字列」の日付と投稿名の形をした URL にできず、投稿が見つからない、 404 エラーとなってしまいましたの><。

おまけ。設定 NG 集(やっぱり一つだけですけれども)

nginx を再起動しようといたしましたら、次のようなエラーが!あまりにも単純な失敗で、一体何が起きたのか最初はわかりませんでしたわね。

[root@localhost ~]# /etc/init.d/nginx restart
nginx: [emerg] unknown directive "if(!-e" in /etc/nginx/conf.d/default.conf:13
nginx: configuration file /etc/nginx/nginx.conf test failed
[root@localhost ~]#

“if(!-e” → “if (!-e” で解決いたしました。nginx 設定は「if」と「(」の間にスペースが必要ですのね!

3−2.Apache から nginx に切り替える

ブラウザからアクセスすると、今まで Apache が処理していたのが、これからは nginx が処理するようにいたします。

Apache を停止し、ディレクトリとファイルの所有者を apache から nginx へ変更し、nginx と PHP-FPM を起動する操作です。

/etc/init.d/httpd stop
chown -R nginx:nginx /var/www/html/oki2a24.com/
/etc/init.d/nginx start
/etc/init.d/php-fpm start

これでウェブブラウザからアクセスしてみて、今まで通り接続できることを確認いたします。

ログは「tail -f /var/log/nginx/access.log」や「tail -f /var/log/nginx/error.log」で確認すると良いですわね♪

もしエラーなどで元に戻したいときは逆のことを行うコマンドを実行すれば問題ありません♪

/etc/init.d/php-fpm stop
/etc/init.d/nginx stop
chown -R apache:apache /var/www/html/oki2a24.com/
/etc/init.d/httpd start

といいますか、いざ Apache から nginx への切替は一発では成功いたしませんでしたの><。

そのような失敗前提でよろしいと存じます。

その都度 Apache へ一旦戻して、nginxエラーログを見て、対処いたしましょうね♪

3−3.nginx と Apache の起動設定を変更する

今後、Apache を使用しないで nginx と PHP-FPM を使用していくこととなります。

ですので、Linux を再起動した時に Apache は自動的に起動しないように、一方、nginx と PHP-FPM は自動で起動するように設定を変更いたします。

chkconfig httpd off
chkconfig nginx on
chkconfig php-fpm on

念のため、確認いたしました。

chkconfig --list

これで、Apache は意識的に起ち上げない限りは使用されない状態となりました。

ちなみに、PHP-FPM の自動起動は「2−2.PHP-FPM の起動設定と起動」で行っておりましたわね。忘れておりました><。てへっ♪

4.nginx にプロキシキャッシュ設定を施し、爆速のレスポンスを手に入れる

スクリーンショット 2014-06-15 20.49.39.png

まったくの初心者状態から、試行錯誤しながら勉強しながら進めていくのは、本当に苦労いたしました><。そのときに参考にさせていただいたページを最初に紹介いたします。

4−1.nginx 設定にプロキシキャッシュの設定を追加、ウェブサーバ設定も編集

ブラウザからアクセスすると、今まで nginx ウェブサーバが処理していたのが、これからは nginx プロキシキャッシュサーバを経由して、nginx ウェブサーバが処理するようになります。

ここで、プロキシキャッシュに WordPress の投稿がキャッシュされていれば静的コンテンツを返し、そのためウェブサーバへはリクエストが行かず、PHPも動かないためパフォーマンスが向上する、と理解しています。

まずは失敗してもいつでも nginx ウェブサーバのみの状態に戻せるように現在の状態のコピーを作っておきます。

cp -a /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.onlyweb

編集を開始しますわ。

vim /etc/nginx/conf.d/default.conf

次のようにいたしました。

# ドキュメントルート
root   /var/www/html/oki2a24.com;
# インデックスファイル指定
index  index.php index.html index.htm;

# キャッシュしたファイルが保管されるパスと、キャッシュゾーンの名前、容量を指定
#「cache1」のプロキシキャッシュ保管場所として「/var/cache/nginx/cache1」を指定
#「keys_zone=cache1:128m」でその容量は128MB
#「levels=1」でキャッシュをファイルで格納する際にキーを1階層のディレクトリごとに分けて格納
proxy_cache_path  /var/cache/nginx/cache1 levels=1 keys_zone=cache1:128m;
# 利用するキャッシュゾーンの名前を指定
proxy_cache cache1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# ステータスコードが通常応答の「200」と、ファイルが存在しない「404」の場合30分間キャッシュを保持
proxy_cache_valid 200 404 30m;

# プロキシサーバ設定
server {
    listen 80 default_server;

    # ドットファイルへのアクセスを禁止、ログへの記録オフ
    location ~ /\. {deny all; access_log off; log_not_found off; }
    # robots.txt へのアクセスはログへの記録オフ
    location = /robots.txt  { access_log off; log_not_found off; }
    # favicon へのアクセスはログへの記録オフ
    location = /favicon.ico { access_log off; log_not_found off; }
    # JavaScript CSS 画像へのアクセスはログへの記録オフ、直ちにプロキシに通しキャッシュ。
    # この期の設定でアクセス元の状態で複数キャッシュを行うが画像ファイルなどは複数キャッシュさせない
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        log_not_found off;
        proxy_pass http://unix:/var/run/nginx.sock;
    }

    # プロキシキャッシュ設定
    # 初期値はキャッシュするにセット
    set $do_not_cache 0;
    # .php ファイルへ直接アクセスがあるのは基本的に管理ページのみのためキャッシュしない
    if ($uri ~* "\.php$") {
        set $do_not_cache 1;
    }

    # POST 時はキャッシュしない
    if ($request_method = POST) {
        set $do_not_cache 1;
    }

    # $proxy_cache_key に任意の文字を加えることで別のキーでページをキャッシュ可能にする
    set $proxy_cache_key "$scheme://$host$request_uri";

    # ログイン状態またはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける
    if ($http_cookie ~ "(wordpress_logged_in_|comment_author_)(.*)") {
        set $proxy_cache_key "$2::$proxy_cache_key";
    }

    # 今まで組み立てたプロキシ設定でキャッシュを実行
    location / {
        proxy_no_cache $do_not_cache;
        proxy_cache_bypass $do_not_cache;
        proxy_cache_key $proxy_cache_key;
        proxy_pass http://unix:/var/run/nginx.sock;
    }
 
}

# ウェブサーバ設定
server {
    # ポートを指定
    #listen       80;
    listen unix:/var/run/nginx.sock; 
    # 実ファイルがない場合のアクセスファイル
    try_files $uri $uri/ /index.php;

    location / {
        # WordPress パーマリンク設定を利用可能にする
        if (!-e $request_filename) {
            rewrite ^.+?(/wp-.*) $1 last;
            rewrite ^.+?(/.*\.php)$ $1 last;
            # ドキュメントルートから WordPress までの相対パス
            # (ドキュメントルートにインストールしたため相対パスは記入なし)
            rewrite ^ /index.php last;
        }
    }

    # PHP-FPM 設定
    location ~ \.php$ {
        fastcgi_pass   unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
  • ウェブサーバ設定内に設定していたポート番号「80」をプロキシサーバのポート番号へ移し、ウェブサーバのポート番号は「unix:/var/run/nginx.sock」へ変更した。

これで、本投稿の目的を達成するための変更作業が終わりました!あとは、本当に改善されたかを確かめましょう♪

4−2.nginx を再起動、効果を確認する

さて、nginx 設定ファイルの編集が終わりましたので反映いたしましょう。

/etc/init.d/nginx restart

ではいよいよ成果を確認いたしましょう♪

GTmetrix というウェブサービス、そして Apache Bench を使用しまして確かめてみたいと存じます。

まずは、変更前の Aapche でのパフォーマンスです。

スクリーンショット 2014-06-14 15.15.43.png

  • Page Speed Grade: C
  • YSlow Grade: D

高くないですわね。ページを読み込む時間も 11.90 s と大変長いです><。

つづづいて、Apache Bench ですの。

[root@oki2a24 ~]# ab -n 100 -c 10 https://oki2a24.com/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking oki2a24.com (be patient).....done


Server Software:        Apache
Server Hostname:        oki2a24.com
Server Port:            80

Document Path:          /
Document Length:        141749 bytes

Concurrency Level:      10
Time taken for tests:   376.325061 seconds
Complete requests:      100
Failed requests:        52
   (Connect: 0, Length: 52, Exceptions: 0)
Write errors:           0
Total transferred:      14192016 bytes
HTML transferred:       14159716 bytes
Requests per second:    0.27 [#/sec] (mean)
Time per request:       37632.507 [ms] (mean)
Time per request:       3763.251 [ms] (mean, across all concurrent requests)
Transfer rate:          36.83 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    7  27.2      0     115
Processing: 17303 35210 7225.8  35903   51123
Waiting:    10582 26542 6685.3  27677   41602
Total:      17409 35218 7215.9  35903   51123

Percentage of the requests served within a certain time (ms)
  50%  35903
  66%  37592
  75%  38994
  80%  41389
  90%  44212
  95%  45590
  98%  49790
  99%  51123
 100%  51123 (longest request)
[root@oki2a24 ~]#

酷いですの><。。。Requests per second:    0.27 [#/sec] (mean) と低いことはもちろん、Failed requests:        52 と100 回のリクエストで半分以上レスポンスに失敗しております><。

さて、続いてウェブサーバを nginx にした状態です。プロキシキャッシュは未使用状態ですわ。

スクリーンショット 2014-06-14 18.50.02.png

  • Page Speed Grade: B
  • YSlow Grade: D

Page Speed Grade が C から B と少し向上いたしました。しかしながらページ読み込み時間は 11.57 s とほとんど変わっておりません><。

では Apache Bench です。

[root@oki2a24 ~]# ab -n 100 -c 10 https://oki2a24.com/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking oki2a24.com (be patient).....done


Server Software:        nginx/1.6.0
Server Hostname:        oki2a24.com
Server Port:            80

Document Path:          /
Document Length:        141537 bytes

Concurrency Level:      10
Time taken for tests:   311.859782 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      14178200 bytes
HTML transferred:       14153700 bytes
Requests per second:    0.32 [#/sec] (mean)
Time per request:       31185.977 [ms] (mean)
Time per request:       3118.598 [ms] (mean, across all concurrent requests)
Transfer rate:          44.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    4  13.5      0      52
Processing: 25101 30908 3432.2  30598   42233
Waiting:    16002 19188 2383.2  18806   27920
Total:      25101 30912 3440.4  30598   42285

Percentage of the requests served within a certain time (ms)
  50%  30598
  66%  30995
  75%  31628
  80%  32566
  90%  36103
  95%  37963
  98%  42168
  99%  42285
 100%  42285 (longest request)
[root@oki2a24 ~]#

Requests per second:    0.32 [#/sec] (mean) と少しパフォーマンスが向上いたしましたけれども、誤差の範囲内ですわね><。

しかしながら、Failed requests:        0 でございます。これは、大きいですの♪ただ、もしかして Apache の設定を適切にすれば同じ数値は出せたのではないかしら。。。今にして思うとそんこともよぎります。

ですけれども、簡単に設定を書いただけで改善いたしましたから、Apache から nginx に変えたことでパフォーマンスが向上したと結論付けることにいたしますの。

さて、最後に nginx とプロキシキャッシュを使用した場合ですわ♪楽しみですわね♪

スクリーンショット 2014-06-15 17.12.48.png

  • Page Speed Grade: B
  • YSlow Grade: D

Summary に変化はございませんでした><。しかし、ページ読み込み時間が 7.96 s と先ほどの 11.57 s から 3 秒ほど向上いたしましたの♪

これは、Apache Bench も期待できますわ♪

[root@oki2a24 ~]# ab -n 100 -c 10 https://oki2a24.com/
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking oki2a24.com (be patient).....done


Server Software:        nginx/1.6.0
Server Hostname:        oki2a24.com
Server Port:            80

Document Path:          /
Document Length:        141474 bytes

Concurrency Level:      10
Time taken for tests:   0.204541 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      14741704 bytes
HTML transferred:       14713296 bytes
Requests per second:    488.90 [#/sec] (mean)
Time per request:       20.454 [ms] (mean)
Time per request:       2.045 [ms] (mean, across all concurrent requests)
Transfer rate:          70381.98 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    7  17.0      2      61
Processing:     4    5   8.3      4      63
Waiting:        0    1   6.1      1      61
Total:          6   12  18.8      6      66

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      6
  75%      6
  80%      6
  90%     65
  95%     66
  98%     66
  99%     66
 100%     66 (longest request)
[root@oki2a24 ~]#

。。。Requests per second:    488.90 [#/sec] (mean) ですか。。。事前にアクセスし、キャッシュされている状態から計測いたしましたけれども、この差は一体なにかしら?

0.32 [#/sec] と比べますと、1528 倍のパフォーマンス向上ですわね。。。かえって嘘くさいくらいですけれども、嬉しいですわ♪

さて、数値の上では向上いたしましたけれども、実際にウェブブラウザからアクセスするとどうかしら?

  • ページ読み込みは早くなったように感じた。
  • ただしブログコンテンツ読み込み後に SNS ボタンの読み込みに時間がかかっていた
  • 検索はやっぱり遅い。
  • 投稿の下書きとして保存などの操作はやっぱり遅い

こんなところかしら。まだまだ課題があると感じますけれども、Apache から nginx への切替第一歩は成功ですの!

5.おわりに

  • WordPress を動いているサーバで、Apache から nginx に切り替える方法
  • やっぱり Apache に戻す方法

本投稿で、できるようになった、覚えておきたいことはこの 2 点かしらね。WordPress 用のサーバとしての役目を終え、別のウェブアプリを動かすときに、やっぱり Apache だと融通が効くと存じますので、元に戻す方法は押さえておきたいですの。

今回の試みで、一番苦労しましたのは、nginx の設定ファイルでしたの><。

設定が全体的に分かりません><。どこがウェブサーバ部分で、どこがプロキシキャッシュ部分かわかりません><。そもそもキャッシュとプロキシ、ここらへんの意味もよくわかっておりません><。いろんなサンプルがあって、どれがベターか決められません><。

でもなんとかパフォーマンスを改善できました。あきらめないで良かったですの♪

また、課題として nginx の設定で次を感じております。

  • さらにパフォーマンスを向上させる。deflate が気になります。
  • パスワード保護された投稿はキャッシュしない設定が気になります。
  • 「ログイン状態もしくはコメントを記入したことがあれば、その情報ごとにキャッシュを分ける」ようにしていますが、投稿のプレビューなどもキャッシュされてGoogle 検索に引っかかってしまう可能性が生まれるのでは?気になります。

以上です。

6.★追記★

さらに次の設定変更、WordPress プラグイン導入などを行いましたの。/etc/nginx/conf.d/default.conf など修正したものを載せいています。本投稿の設定は、古くなっておりますのでご注意くださいませ。

  1. 【nginx】プロキシキャシュディレクトリを変更して再起動すると前のディレクトリはどうなる? | oki2a24
  2. Nginx Cache Controller を使うためにヘッダーについて勉強!設定編集いたしました♪ | oki2a24
  3. 【WordPress プラグイン】Nginx Cache Controller を入れてキャッシュの削除を確認しました♪ | oki2a24
  4. 【nginx】WordPress 用のパーマリンク設定を修正しました♪ | oki2a24
  5. 【nginx】【WordPress】wp-cron.php アクセス時はログに残さないようにしました♪ | oki2a24
    → WordPress の cron が動かくなります><。
  6. 【nginx】WordPress でキャッシュしてはいけないページ(ファイル、ディレクトリ)設定!!! | oki2a24

「【nginx】【超高速】 WordPress のウェブサーバーを nginx にして、プロキシキャッシュを使ってパフォーマンスをとても向上させるまでの試行錯誤です!【Apache からの卒業】」への1件の返信

コメントを残す