はじめに。本投稿を読むと役に立つであろう方
- VPS で WordPress サイトを運営している
- ウェブサーバは Apache だが、nginx が速いと聞いて乗り換えたいと思っている
- サーバーは新しく立てず、今の使用しているサーバを継続したい
- nginx は初めてで設定の意味も多少知りたい
本ブログを運用しております WordPress のウェブサーバーは現在 Apache を使用しています。ですが nginx と PHP-FPM とキャッシュで WordPress を動かすようにして、「爆速」にしたいですの!
でも難しいですわ><。だってわたくし、nginx ってなに?という状態ですもの。でもやってみますわ!
なお、現在のウェブサーバ、Apache の設定は今まで次のようにいじりましたわ。
- Apache のベンチマークのために設定 MaxClients を弄りましたら何の効果もありませんでした。。。 | oki2a24
- Apache 設定ファイル 8 つの変更ポイント | oki2a24
- mod_deflate を設定してウェブページのパフォーマンスを上げますの!【Apache】★gzip★ | oki2a24
- 【WordPress】mod_expires 設定でパフォーマンス改善♪ | oki2a24
また、現在の WordPress を動かしているサーバの状態をまとめます。この中の、Apache が使われなくなる予定ですの。
- CentOS 5.10
- Apache 2.2.3
- MySQL 5.5.38
- PHP 5.4.29
では、はじめましょう。次の順番で作業しましたの。WordPress が動いている状態で作業を進め、Apache から nginx へ切替(このとき数秒 WordPress が停止)、そしてプロキシキャッシュを導入、結果として超高速にできましたの!
まずは、目次をお見せしますわね。
- nginx のインストール
- PHP-FPM のインストール
- nginx のプロキシキャッシュ無しの最低限設定
- nginx にプロキシキャッシュ設定を施し、爆速のレスポンスを手に入れる
- おわりに
- ★追記★
1.nginx のインストール
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/」にウェブブラウザから接続します。。。大丈夫ですわね♪アクセスできました。
念のため、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 のインストール
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 のプロキシキャッシュ無しの最低限設定
最終的にはプロキシキャッシュを使用して 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
各パラメータの意味についてはこちらのページが参考になりました。ありがとう存じます。
- nginx連載3回目: nginxの設定、その1 – インフラエンジニアway – Powered by HEARTBEATS
- nginx でKeepAliveを設定してみる | レンタルサーバー・自宅サーバー設定・構築のヒント
- お名前.com VPS にNginxでWordPressを構築。設定の意味もまとめた
- Nginx でgzipを使うには | レンタルサーバー・自宅サーバー設定・構築のヒント
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 にプロキシキャッシュ設定を施し、爆速のレスポンスを手に入れる
まったくの初心者状態から、試行錯誤しながら勉強しながら進めていくのは、本当に苦労いたしました><。そのときに参考にさせていただいたページを最初に紹介いたします。
- Nginx « WordPress Codex
- nginxベースの高速なWordPress環境をお名前.comのVPSで構築 5ページ | SourceForge.JP Magazine
- さくらのVPSで運用中のWordPressをApacheからnginxに移行する(その1 概要) | fujitaka.net
- WordPressを、Nginxで超高速運用するための設定(お名前.comのVPS使用) | 驚異の趣味人
- nginxでWordPressの設定する時に出てくるディレクティブのメモ | Shinichi Nishikawa’s
- さくらVPS512で、Yahoo!砲食らっても WordPress を平常運転させるための設定 | dogmap.jp
- nginxでプロキシ&キャッシュサーバー « chibiegg日誌
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 でのパフォーマンスです。
- 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 にした状態です。プロキシキャッシュは未使用状態ですわ。
- 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 とプロキシキャッシュを使用した場合ですわ♪楽しみですわね♪
- 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 など修正したものを載せいています。本投稿の設定は、古くなっておりますのでご注意くださいませ。
- 【nginx】プロキシキャシュディレクトリを変更して再起動すると前のディレクトリはどうなる? | oki2a24
- Nginx Cache Controller を使うためにヘッダーについて勉強!設定編集いたしました♪ | oki2a24
- 【WordPress プラグイン】Nginx Cache Controller を入れてキャッシュの削除を確認しました♪ | oki2a24
- 【nginx】WordPress 用のパーマリンク設定を修正しました♪ | oki2a24
- 【nginx】【WordPress】wp-cron.php アクセス時はログに残さないようにしました♪ | oki2a24
→ WordPress の cron が動かくなります><。 - 【nginx】WordPress でキャッシュしてはいけないページ(ファイル、ディレクトリ)設定!!! | oki2a24









「【nginx】【超高速】 WordPress のウェブサーバーを nginx にして、プロキシキャッシュを使ってパフォーマンスをとても向上させるまでの試行錯誤です!【Apache からの卒業】」への1件の返信
[…] このサイトを利用して種々設定しているがなかなか正常に稼働しない。 […]