[Linuxメモ]nginxでリバースプロキシしてみた

P1050086
利用しているサーバーがしょぼいのもありますが、ブログの表示に結構時間がかかるので、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をインストールすることができます。

# yum install 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: http://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を開いて編集します。

# cd /etc/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のところです。
多分通常の場合

Listen 80

になっていると思うので、これをバーチャルホスト分作成します。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 httpd restart
# 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モジュールの導入は終了。

# service httpd restart

上記コマンドでapacheを再起動。

サイトにアクセスして正しく表示されること、/var/log/httpd配下のapacheのログにipアドレスが正しく記録されるようになった事を確認できたら作業完了です。

おつかれさまでした。

mod_rpaf for Apache


キャッシュ対策

サイトの表示が早くなって「ヤッター」とか思っていると色々問題が出てくるんですよねやっぱり。

まあ、自前で色々CGIを動かしていたりする場合なんですけど、外部の別ドメインで動かしていたり、レンタルCGIやブログパーツだと問題ないかもしれません。

まず、色々キャッシュされてしまうわけです。nginxがキャッシュしてほしくないものまでキャッシュしてくれるようになります。なのでそれらの対策が必要になります。

うちのブログに付いているカウンターは自前で作っているカウンターです。

A:03839365 T:1745 Y:2098

ブログの右上にこんなふうについています。

軽くするためにテキストカウンターなんですけど、タグ的には下のようになっています。

<div class="widget-content">
<img src="http://blog.kumacchi.com/tools/cnt/c.cgi" width="1" height="1" alt="cnt" />&nbsp;
<script type="text/javascript" src="http://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="http://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&amp;eid=2097&amp;’+(new Date().getDate())+’" alt="yays" border="0" />’);
document.write(‘<script type="text/javascript" src="http://blog.kumacchi.com/tools/ya/jss/2097.js?’+(new Date().getDate())+’"></script>’);
–>
</script>

あと、サイドバーに記事に関連した、ヤフオク、アマゾン、楽天の商品を表示するようにしているのですが、これもキャッシュされると思われますが、nginxのキャッシュの設定が7日になっているので、これはちょっと長すぎます。なのでキャッシュされないようにjavascriptで今現在の日付を引数として渡すようして対処しています。

参考:

※そもそも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で切り分けたほうが良さそう。

参考:

# 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

登録するにはで行けたと思う。

WS2013-07-24_21_54_50

# ntsysv

または、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 キャッシュ対策 追記。

タグ : ,