[Linuxメモ]nginxでリバースプロキシしてみた
利用しているサーバーがしょぼいのもありますが、ブログの表示に結構時間がかかるので、nginx(エンジンエックス)を使ってリバースプロキシしてみました。バックではapacheがそのまま動いています。画像ファイルやjavascriptやスタイルシートなどの静的ファイルのみをnginxにキャッシュしてもらうことにより、効率よく処理されページの表示が高速になるはずです。といいますか、体感できるほど表示が早くなっていると思います。奇特にもこのブログによく来る人ならきっと分かるはずですw
まず、私が利用しているサーバーの環境
# cat /etc/redhat-release
CentOS release 6.3 (Final)
#
SaaSesのOsukiniサーバーLTというやっすいVPSなのでメモリーは512MBしかありません。今ならDTIのServersMan@VPSの方がメモリーも1GBになって良いようです。
apacheのバージョンは
Version : 2.2.15
正直512MBというメモリーでapacheとmysqlとnginxを動かすのは結構厳しいと思いますが、とりあえずやってみた感じです。ダメなら直ぐ元に戻せますし。
[Linuxメモ]Osukini Server LTのメモリ節約 – KUMA TYPE
一応上の記事の様な感じで、apacheのモジュールはカツカツに削ってメモリーの節約は行なっています。
SaaSes|クラウド、オンラインストレージ、VPS、専用サーバー、データセンターのパイオニア
VPSならDTI|月額490円 メモリ1GB|ServersMan@VPS
いろいろなサイトを参考にさせて頂きました。rootになって作業しています。セキュリティー重視の方はsudoを使って作業して下さい。
nginxのインストール
まずは、nginxのインストール。
yumでインストールしました。しかし、CentOS 6.3のyumのリポジトリにはnginxがありません。
なので、
# vi /etc/yum.repos.d/nginx.repo
として、
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
リポジトリを作成しました。これで、yumでnginxをインストールすることができます。
で、nginxがインストールされます。
# yum info nginx
Loaded plugins: downloadonly, fastestmirror
Loading mirror speeds from cached hostfile
* base: www.ftp.ne.jp
* extras: www.ftp.ne.jp
* updates: www.ftp.ne.jp
Installed Packages
Name : nginx
Arch : i386
Version : 1.4.2
Release : 1.el6.ngx
Size : 734 k
Repo : installed
From repo : nginx
Summary : nginx is a high performance web server
URL : http://nginx.org/
License : 2-clause BSD-like license
Description : nginx [engine x] is an HTTP and reverse proxy server, as well as
: a mail proxy server
#
nginxはバージョン1.4.2がインストールされました。
参考1:
CentOS-6へ最新版のnginxを3分でインストールする方法 – Y-Ken Studio – 日々クリエイション
次は、nginxとapacheの設定です。
nginxの設定
まず、全体的な設定については下記を参考にさせて頂きました。
参考2:
» Apacheを動かしながらnginxをリバースプロキシに設定するメモ
/etc/nginx/nginx.conf
#user nginx;
user kumacchi kumacchi;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
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 on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# Reverse proxy settings
proxy_headers_hash_max_size 1024;
proxy_headers_hash_bucket_size 256;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_read_timeout 600s;
proxy_connect_timeout 10s;
#proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=cache1:15m inactive=7d max_size=1000m;
#proxy_temp_path /usr/local/nginx/proxy_temp;
#proxy_cache_path /usr/local/nginx/proxy_cache levels=1:2 keys_zone=cache1:4m inactive=7d max_size=120m;
#proxy_temp_path /usr/local/nginx;
#proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache1:4m inactive=7d max_size=120m;
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=cache1:15m inactive=7d max_size=1000m;
proxy_temp_path /var/tmp/nginx;
include /etc/nginx/conf.d/*.conf;
}
nginx.confの最初の方の「user kumacchi kumacchi」はnginxのプロセスが動作する時のuserとgroupになります。これはsuexecを利用している場合suexecで利用しているuserとgroupに一致させておかないとcgiが動作しないので合わせる必要があります。
[Wed Jul 24 02:44:31 2013] [error] [client 127.0.0.1] suexec policy violation: see suexec log for more details, referer: https://blog.kumacchi.com/tools/cnt2/c.cgi
そうしないと上の様なエラーがhttpdのerror_logに残り、エラーになります。
他にもcgiが動作しない場合は、/var/log/httpd/suexec.log等もチェックしてsuexecに問題がないかチェックします。
proxy_cache_pathなどにはキャッシュやテンポラリの作成場所のパスを指定しますが、権限の関係でエラーになる場合などがあるので、予めフォルダーを作っておくか、作成できる場所を指定しておきます。
バーチャルホストの設定については、下記の記事を参考にさせて頂きました。
参考3:
nginx+apacheでちょっぴり快適なWebサーバーを目指してみる(CentOS さくらのVPS) ::ハブろぐ
/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
client_max_body_size 5m;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#
#location ~ /\.ht {
# deny all;
#}
}
# Reverse proxy settings
server {
listen 80;
server_name blog.kumacchi.com;
client_max_body_size 5m;
#location ~ .*\.(htm|html|jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
root /home/hogehoge/www/blog;
index index.html;
break;
}
location / {
proxy_pass http://127.0.0.1:8080;
#proxy_redirect off;
proxy_cache cache1;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_valid 200 1d;
}
}
# Reverse proxy settings
server {
listen 80;
server_name gpslog.kumacchi.com;
client_max_body_size 5m;
location ~ .*\.(htm|html|jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
#location ~ .*\.(jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
root /home/hogehoge/www/gpslog;
index index.html;
break;
}
location / {
proxy_pass http://127.0.0.1:8081;
#proxy_redirect off;
proxy_cache cache1;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_valid 200 1d;
}
}
(略)
default.confにバーチャルホストの設定を追加します。
最初のserver{}の区切りはデフォルトの設定です。特にイジる必要はないと思います。
それ以降のserver{}のエリアは各バーチャルホスト毎に定義します。上の例では、blog.kumacchi.comはMovable Typeで構築しているサイトですが、ダイナミックパブリッシングを使用しているので、htmとhtmlはキャッシュしないように省いています。
本当はダイナミックパブリッシングで生成されたページをキャッシュしてくれるようにすればいいのだと思いますが、できるのかもやり方もわからないのでとりあえずはこのままです。
ポイントとしては、
server_nameにドメイン名。
location ~.*\.(省略)でnginxに処理を任せたい静的ファイルの拡張子。
rootはドキュメントのルートディレクトリ。
indexにはindex.htmlにあたるもの。
proxy_passにはローカルアドレスとそのドメイン専用のポート番号
client_max_body_sizeは参考にしたサイトにあったのをそのままコピペですが、無くてもいいとは思います。(調べてみたらpostできるサイズの指定らしいです。デフォルトは1Mらしいので、大きはファイルをポストする場合は1Mより大きな値を指定しておいたほうがいいでしょう。)
と言った感じ。
ポート番号は8080一個で共用して出来そうな気がするんですけど、やっぱり出来なかったのでサイトごとにポートを分けています。できないのかなー?
とりあえずこれで、nginx側の設定は終わりです。
apacheの設定
次にapacheの設定です。
場所は大抵の場合/etc/httpd/conf/httpd.confだと思います。
とりあえず、どの設定ファイルでもそうですが、弄る前にコピーしてバックアップを取りましょう。それから、viなどでhttpd.confを開いて編集します。
# cp -p httpd.conf httpd.conf.20130724
# vi httpd.conf
#
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
Listen 8080
Listen 8081
Listen 8082
Listen 8083
Listen 8084
httpd.confのListenのところです。
多分通常の場合
になっていると思うので、これをバーチャルホスト分作成します。80は8080に変更。ポートの値は任意です。もちろんnginx側の設定と合わせる必要があります。
#
# Use name-based virtual hosting.
#
#NameVirtualHost *:80
NameVirtualHost 127.0.0.1:8080
NameVirtualHostの値を上にように変更します。
#<VirtualHost *:80>
<VirtualHost 127.0.0.1:8080>
ServerAdmin hogehoge@kumacchi.com
DocumentRoot /home/hogehoge/www/blog
ServerName blog.kumacchi.com
ErrorLog logs/blog.kumacchi.com-error_log
CustomLog logs/blog.kumacchi.com-access_log common
SuexecUserGroup kumacchi kumacchi
<Directory /home/hogehoge/www/blog>
AllowOverride All
Options MultiViews -Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
</Directory>
</VirtualHost>
#<VirtualHost *:80>
<VirtualHost 127.0.0.1:8081>
ServerAdmin hogehoge@kumacchi.com
DocumentRoot /home/hogehoge/www/gpslog
ServerName gpslog.kumacchi.com
ErrorLog logs/gpslog.kumacchi.com-error_log
CustomLog logs/gpslog.kumacchi.com-access_log common
SuexecUserGroup kumacchi kumacchi
<Directory /home/hogehoge/www/gpslog>
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
</Directory>
</VirtualHost>
(略)
元々のバーチャルホストの設定をちょっといじるだけで大丈夫です。基本的にはアドレスとポートをいじるくらいです。
# service nginx restart
ここまで来たら、とりあえず上記コマンドでapacheとnginxを再起動してみます。
これで、バーチャルドメインの各サイトにアクセスして、細かいところは置いといてとりあえず表示出来たらひとまずOKです。
apacheにmod_rpafモジュールの導入
次にmod_rpafをapacheに組み込みます。このモジュールの役目ですが、nginxのリバースプロキシを導入するとnginx経由でapacheが呼び出されることになるわけですが、そうするとapache側に正しくIPアドレスがわたらなくなります。apacheのログを見ると分かりますが、リモートホストが、127.0.0.1やnginxで設定しているlocalhostなどが記録されるようになります。これだとIPアドレスで色々制限をかけたりしている場合に色々問題が出ることが考えられます。
逆に、ログに残るIPアドレスはなんでもよくて、IPアドレスで何も制限を指定なければ導入する必要はありません。導入しておいた方がいいとは思いますけど。
検索してみると、mod_rpafだと.htaccessでアクセス制限が出来ないという話を見かける。
代わりにmod_extract_forwardedを使えばいいらしい。現在もそうかはわからないのでとりあえず様子を見て今後考える。参考サイト(参考2)に現在最新版の0.6だと大丈夫らしいという事が書いてあるので大丈夫かもしれない。様子見。
参考:
Nginxでリバースプロキシを設定し、Apacheと共存させる | abeerforyou.com
# apxs
Usage: apxs -g [-S <var>=<val>] -n <modname>
apxs -q [-S <var>=<val>] <query> …
apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
[-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
[-Wl,<flags>] [-p] <files> …
apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> …
apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> …
#
とりあえず、mod_rpafをコンパイルするのにapxsが必要です。コマンドラインでapxsと叩いて何か反応があれば入ってます。CentOSの場合は入っていませんでした。
# yum install httpd-devel
(中略)
Dependencies Resolved
==============================================================================================================================
Package Arch Version Repository Size
==============================================================================================================================
Installing:
httpd-devel i686 2.2.15-28.el6.centos updates 150 k
Installing for dependencies:
apr-devel i686 1.3.9-5.el6_2 base 176 k
apr-util-devel i686 1.3.9-3.el6_0.1 base 69 k
cyrus-sasl-devel i686 2.1.23-13.el6_3.1 base 303 k
db4-cxx i686 4.7.25-17.el6 base 605 k
db4-devel i686 4.7.25-17.el6 base 6.6 M
openldap-devel i686 2.4.23-32.el6_4.1 updates 1.1 M
Updating for dependencies:
httpd i686 2.2.15-28.el6.centos updates 828 k
httpd-tools i686 2.2.15-28.el6.centos updates 73 k
openldap i686 2.4.23-32.el6_4.1 updates 267 k
Transaction Summary
==============================================================================================================================
Install 7 Package(s)
Upgrade 3 Package(s)
(中略)
Complete!
#
yumでhttpd-develをインストールすればapxsも入ります。
ハマりポイント
[Linuxメモ]SaaSesのVPS OsukiniサーバーでSuexecを使うには? – KUMA TYPE
ちょっとハマったのでメモ。私は/home配下でsuexecを使うために上の方法でやっています。なので、httpdのアップデートなどが行われるとその度にsuexecを書き換えないと動かなくなるということが発生します。(勝手にパッチをあてる仕組みを作っておけばいいのですけど)
で、今回yumでhttpd-develをインストールしたわけですが、どうやらhttpd自体も置き換わるようで、suexecも元に戻ってしまっていました。なのでCGIが動かなくなってしまったわけですが、それに気づかずにnginxとapacheの設定の関係だろうとその辺りを調べまくってしばらくはまっていました。注意です。
[2013-07-24 02:45:22]: command not in docroot (/home/hogehoge/www/blog/tools/vote/vote.cgi)
その場合、/var/log/httpd/suexec.logには上のようなログが残ります。
apxsが入ったら。
# wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
# tar zxvf mod_rpaf-0.6.tar.gz
# cd mod_rpaf-0.6
# apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
としてコンパイル。モジュールを作成する。なんかワーニングっぽいものが出ていましたけど気にしない。
# vi /etc/httpd/conf/httpd.conf
再度apacheの設定ファイルを編集。
LoadModule rpaf_module modules/mod_rpaf-2.0.so
LoadModuleの定義が並んでいる所に上の一行を追加。
<IfModule mod_rpaf.c>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1
</IfModule>
上記を適当な所(他のIfModule定義があるところなど)に追加。
#<VirtualHost *:80>
<VirtualHost 127.0.0.1:8080>
ServerAdmin hogehoge@kumacchi.com
DocumentRoot /home/hogehoge/www/blog
ServerName blog.kumacchi.com
ErrorLog logs/blog.kumacchi.com-error_log
CustomLog logs/blog.kumacchi.com-access_log common
SuexecUserGroup kumacchi kumacchi
<Directory /home/hogehoge/www/blog>
AllowOverride All
Options MultiViews -Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
</Directory>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1
RPAFheader X-Forwarded-For
</VirtualHost>
#<VirtualHost *:80>
<VirtualHost 127.0.0.1:8081>
ServerAdmin hogehoge@kumacchi.com
DocumentRoot /home/hogehoge/www/gpslog
ServerName gpslog.kumacchi.com
ErrorLog logs/gpslog.kumacchi.com-error_log
CustomLog logs/gpslog.kumacchi.com-access_log common
SuexecUserGroup kumacchi kumacchi
<Directory /home/hogehoge/www/gpslog>
AllowOverride All
Options MultiViews Indexes SymLinksIfOwnerMatch ExecCGI IncludesNoExec
</Directory>
RPAFenable On
RPAFsethostname On
RPAFproxy_ips 127.0.0.1 10.0.0.1
RPAFheader X-Forwarded-For
</VirtualHost>
(略)
バーチャルホストの各定義にmod_rpafの設定を追加。
これででmod_rpafモジュールの導入は終了。
上記コマンドでapacheを再起動。
サイトにアクセスして正しく表示されること、/var/log/httpd配下のapacheのログにipアドレスが正しく記録されるようになった事を確認できたら作業完了です。
おつかれさまでした。
キャッシュ対策
サイトの表示が早くなって「ヤッター」とか思っていると色々問題が出てくるんですよねやっぱり。
まあ、自前で色々CGIを動かしていたりする場合なんですけど、外部の別ドメインで動かしていたり、レンタルCGIやブログパーツだと問題ないかもしれません。
まず、色々キャッシュされてしまうわけです。nginxがキャッシュしてほしくないものまでキャッシュしてくれるようになります。なのでそれらの対策が必要になります。
うちのブログに付いているカウンターは自前で作っているカウンターです。
A:03839365 T:1745 Y:2098
ブログの右上にこんなふうについています。
軽くするためにテキストカウンターなんですけど、タグ的には下のようになっています。
<div class="widget-content">
<img src="https://blog.kumacchi.com/tools/cnt/c.cgi" width="1" height="1" alt="cnt" />
<script type="text/javascript" src="https://blog.kumacchi.com/tools/cnt/v.cgi"></script>
</div>
イメージタグでc.cgiを呼び出してカウントを行い。scriptタグでjavascriptとして呼び出しているv.cgiでjavascriptを出力してカウンターを表示しています。
###今考えたら、イメージタグのc.cgiいらなくね?全部v.cgiの中で処理すればよくね?なんで分けたんだろ?後で一緒にしてみよう。ああ、そうだ、javascript動かない環境でもカウントするために分けてるんだった。でも、そこまでする必要無いような気がしてきた。
print "Cache-Control: no-cache\n";
print "Content-type: image/gif\n";
print "Cache-Control: no-cache\n";
print "Content-Type: application/x-javascript\n\n";
最初は、nginx側でキャシュしたくないurlを除外設定出来ないものかと思って調べてみたけど、わからなかった。
結果的にはcgi側でキャッシュコントロールのヘッダを出力してキャッシュされないようにしました。
print "Cache-Control: no-cache\n";
の部分です。
<script type="text/javascript">
<!–
document.write(‘<img src="https://blog.kumacchi.com/tools/ya/ya3.cgi?q=%E5%8D%8A%E7%94%B0%E3%81%94%E3%81%A6%2C%E3%82%AD%E3%83%BC%E3%83%AC%E3%82%B9%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC%2C%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%82%AD%E3%83%BC%2C%E5%8D%8A%E7%94%B0%E3%81%94%E3%81%A6%2C%E3%83%8F%E3%83%B3%E3%83%80%2C%E3%83%80%E3%82%A4%E3%82%BD%E3%83%BC&eid=2097&’+(new Date().getDate())+’" alt="yays" border="0" />’);
document.write(‘<script type="text/javascript" src="https://blog.kumacchi.com/tools/ya/jss/2097.js?’+(new Date().getDate())+’"></script>’);
–>
</script>
あと、サイドバーに記事に関連した、ヤフオク、アマゾン、楽天の商品を表示するようにしているのですが、これもキャッシュされると思われますが、nginxのキャッシュの設定が7日になっているので、これはちょっと長すぎます。なのでキャッシュされないようにjavascriptで今現在の日付を引数として渡すようして対処しています。
参考:
- nginxのproxy_cacheが効かないと思ったら response headers に Expires とかはいってると駄目なのね – shohu33’s diary
- Cache-Controll: no-cache
※そもそも7日のキャッシュが長すぎる気がする。今後の調整が必要かも?
追記:2013.07.25
proxy_cache_pathで指定しているのは基本の設定。
proxy_cache_validはhttpサーバのステータスコード毎にキャッシュ時間を制御できる。
ちゃんと調べてばいろいろ細かく制御出来そう。少なくともファイル名でキャッシュ時間の制御やキャッシュをしないようにすることが可能なようなのでやってみる。
参考:
追記:2013.07.26
一応、以下のように修正してみた。
- rootとindexは外に出してみたが大丈夫なようだ。
- 拡張子は正規表現で大文字小文字を無視するようにして、小文字で指定するようにしてみた。
- lcaationが/tools/ya/jssのは以下は20分だけキャッシュするようにしてみた。
- locationが/tools/yaのは以下は1時間だけキャッシュするようにしてみた。
一応、うまく動いているようだ。
if文なども使えるようだが、elseもないようだし、proxy_cache_validをif文の中に書くとエラーになるし、if文で切り分けて変数に設定した値をproxy_cache_validに設定してもエラーになるので、その方法は断念。if文の利用はかなり限定的っぽい。
素直にlocationで切り分けたほうが良さそう。
参考:
- nginx連載5回目: nginxの設定、その3 – locationディレクティブ – インフラエンジニアway – Powered by HEARTBEATS
- [nginx] リバースプロキシ(+キャッシュサーバ)とWEBサーバを1台で実現する | (っ´∀`)っ ゃー | nullpopopo
- nginxでプロキシ&キャッシュサーバー « chibiegg日誌
- Nginx をリバースプロキシとして使ってみた | レンタルサーバー・自宅サーバー設定・構築のヒント
- nginxのconfigでifの並記を実現する – だるろぐ
# Reverse proxy settings
# blog.kumacchi.com
server {
listen 80;
server_name blog.kumacchi.com;
root /home/hogehoge/www/blog;
index index.html;
client_max_body_size 5m;
location /tools/ya/jss {
proxy_cache_valid 200 20m;
break;
}
#location ~ .*\.(htm|html|jpg|JPG|gif|GIF|png|PNG|swf|SWF|css|CSS|js|JS|inc|INC|ico|ICO) {
location ~* .*\.(htm|jpg|gif|png|swf|css|js|inc|ico)$ {
break;
}
location /tools/ya/ {
set $do_not_cache 0;
proxy_pass http://127.0.0.1:8080;
#proxy_redirect off;
proxy_no_cache $do_not_cache;
proxy_cache_bypass $do_not_cache;
proxy_cache cache1;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_valid 200 1h;
break;
}
location / {
set $do_not_cache 0;
proxy_pass http://127.0.0.1:8080;
#proxy_redirect off;
proxy_no_cache $do_not_cache;
proxy_cache_bypass $do_not_cache;
proxy_cache cache1;
proxy_cache_key $scheme$proxy_host$uri$is_args$args;
proxy_cache_valid 200 1d;
break;
}
}
うちはコメントが少ないからいいけど、コメントが多いサイトはキャッシュ時間を短めにする必要がある。wordpressならコメント投稿と同時にキャッシュをクリアするプラグインが有るらしい。mtにはないのかな?作るしかないの?
追記:2013.07.26
rmtree(‘/var/cache/nginx/0’);
rmtree(‘/var/cache/nginx/1’);
rmtree(‘/var/cache/nginx/2’);
rmtree(‘/var/cache/nginx/3’);
rmtree(‘/var/cache/nginx/4’);
rmtree(‘/var/cache/nginx/5’);
rmtree(‘/var/cache/nginx/6’);
rmtree(‘/var/cache/nginx/7’);
rmtree(‘/var/cache/nginx/8’);
rmtree(‘/var/cache/nginx/9’);
rmtree(‘/var/cache/nginx/a’);
rmtree(‘/var/cache/nginx/b’);
rmtree(‘/var/cache/nginx/c’);
rmtree(‘/var/cache/nginx/d’);
rmtree(‘/var/cache/nginx/e’);
rmtree(‘/var/cache/nginx/f’);
うちのブログはMovable TypeなわけでNginx Proxy Cache Purgeは無いのです。しかし、やっぱりコメントが投稿されたら即座に反映してして欲しいので、コメントが投稿された時と、記事が更新された時はnginxのキャッシュをオールクリアするようにした。本格的にやるならちゃんとプラグインを作成して対象の記事のみキャッシュをクリアするように作りたいところだけど、よゆうがないので、暫定的対応。普通にrmtreeでキャッシュフォルダを全部削除しているだけw。これをコメントが投稿された時に動くプラグインや、記事が編集や投稿された時に動くプラグインの適当な場所に追加してみた。どうやらうまく行っているみたい。
ログのローテート
yumでインストールしたならログはローテートされるようになっているはずです。
# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
#
上記のように/etc/logrotate.dにnginxができていればOKです。ソースからコンパイルした場合などでない場合は上を参考にファイルを作成すればいいと思います。
nginxを自動で起動するようにする
yumでインストールしたなら自動で起動されるようになっているはずです。
# chkconfig –list nginx
nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
#
登録されているか確認するには上のようにする。表示されれば登録されている。
# chkconfig nginx on
登録するにはで行けたと思う。
または、ntsysvとコマンドラインで入力してGUIでチェックを入れれば自動起動になります。
nginxのキャッシュの削除
設定ファイルで設定した場所にキャッシュディレクトリが作成されその中にキャッシュが格納されます。
この記事でのnginxのキャッシュの設定場所は/var/cache/nginxになっています。
なので、これをrm -rf /var/cache/nginxなどで削除すれば、キャッシュが削除されます。
# rm -rf /var/cache/nginx
削除してしまうと新たにディレクトリが作成されないみたいなので、nginxを一旦再起動したほうが無難です。/var/cache/nginxディレクトリの中身だけ消すのも手です。この場合は中にキャッシュが新たにさくせされるのは確認しましたが、色々他にもファイルが作成されるみたいなので、やっぱり一旦再起動したほうが無難な気がします。
root権限でのrmコマンドの使用は慎重に行なって下さい。
改訂履歴
- 2013.07.27 mod_rpafを組み込む前から、apacheの設定にmod_rpafの定義を記載していたのを修正。mod_rpafの導入のところに改めて記載した。
- 2013.07.26 キャッシュ対策 追記。
- 2013.07.25 キャッシュ対策 追記。