レンタルサーバー・自宅サーバー設定・構築のヒント
レンタルサーバー・自宅サーバー設定・構築のヒント - レンタルサーバー・自宅サーバーの設定・構築情報を公開しています。

Nginx をリバースプロキシ(キャッシュ) として使ってみた

2011年6月29日 2015年5月16日
nginx reverse proxy cache

前回「Nginx + php-fpm をさくらのVPSで使ってみた」では、 nginxをウェブサーバーとして使ってみました。実際にさくらのVPSでの設定を行って、動作させてみました。 nginxのウェブサーバーとしてのパフォーマンスは、十分に感じられたと思います。

今回は、nginxの真骨頂であるリバースプロキシを使ってみます。
よくあるパターンは、nginx (リバースプロキシ) + apache (ウェブサーバー本体) の組み合わせです。
ここでは、nginx (リバースプロキシ) + nginx (ウェブサーバー本体) の1サービスで実施することで、リソースの消費を最小限におさえてみました。

リバースプロキシ(Reverse Proxy) または逆プロキシ とは、
特定のサーバへの要求を必ず経由するように設置されたプロキシサーバのことで、一般的なプロキシとは、文字通りの意味あいを持ち、不特定多数のサーバを対象としません。
リバースプロキシは、不特定多数のクライアントから寄せられる要求に対して、応答を肩代わりすることにより特定のサーバの負担を軽減したり、 アクセスを制限することにより特定のサーバのセキュリティを高めたりする目的に用いられます。

リバースプロキシ
リバースプロキシサーバーの例
プロキシ
プロキシサーバーの例

上の図は、リバースプロキシサーバーと一般的なプロキシサーバーの違いです。
いずれのプロキシサーバーもインターネットに接続されています。

違いは、インターネットと逆向きの接続先が
  • リバースプロキシサーバー :
    ウェブサーバーなどのサーバー(インターネットサーバー)
  • プロキシサーバー :
    個人のパソコン(インターネットユーザ)
となっていることです。

リバースプロキシサーバーをおくこともメリットは、もちろんキャッシュサーバーとしてのメリットもありますが、 ロードバランサーの機能を使っての以下の図のような負荷分散のイントラネットを構築できることです。
リバースプロキシ2
リバースプロキシー(reverse proxy server)としてnginxを利用する場合のキャッシュ削除モジュール nginx cache purge を組み込みたい場合は、
を参照してください。
また、以下の記事も参考になるかと思います。
nginx でリバースプロキシ、FastCGIキャッシュのキャッシュを削除する方法をまとめて解説してみた
Nginxのキャッシュ機能だけを利用したい方は、さらに効率的、高速化が図れる Nginx のFastCGIキャッシュ(fastcgi cache )を使ってみた が参考になるかと思います。


関連記事 :

15 件 コメントがあります。 コメントを投稿する
  1. […] […]

  2. […] […]

  3. […] […]

  4. […] […]

  5. tetuya0703
    2014年2月27日, 2:01 PM

    管理人様

    こんにちは
    HPを拝見させて頂きまして、勉強をさせて頂いています
    私は今回、
    Nginx→apache(wordpress)をそれぞれ、別サーバーで構築をしています
    Nginx,apahce(wordpress)は同一セグメントで通信が出来る状態です

    通信の流れとしては
    Internet→(80)Nginx→(80)apahce(wordpress)
    という、流れでNginxがreverse proxy且つcache サーバーとして動作させapache(wordoress)の負荷をさげてアクセスの高速化をしたいと考えています

    色々と識者の皆様が公開されている情報を参考にしながら、Nginxがreverse proxyとして動作する事は確認できたのですが、Nginxのcacheのデレクトリィーには何も情報が保存されていませんでした
    これは、Nginxがcahceサーバーとしては動作していなからだと思うのですが、認識に間違いなどがありましたらご指導をいただけませんでしょうか

    また、Nginxをcacheサーバーとして動作させるには、どの様に設定をすればよろしいでしょうか

    不躾な質問ですが、ご教授いただけますと幸いです

    よろしくお願い申し上げます。

    【/etc/nginx/nginx.conf】

    user  nginx;
    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" "$gzip_ratio"';
    
        access_log  /var/log/nginx/access.log  main;
    
        sendfile        on;
        tcp_nopush      off;
    
        keepalive_timeout  65;
    
        gzip  on;
        gzip_http_version 1.0;
        gzip_types        text/plain 
                          text/xml 
                          text/css 
                          application/xml 
                          application/xhtml+xml 
                          application/rss+xml 
                          application/atom_xml 
                          application/javascript 
                          application/x-javascript 
                          application/x-httpd-php;
        gzip_disable      "MSIE [1-6]\.";
        gzip_disable      "Mozilla/4";
        gzip_comp_level   2;
        gzip_vary         on;
        gzip_proxied      any;
        gzip_buffers      4 8k;
    
        server_names_hash_bucket_size 128;    #    32/64/128
    
        include /etc/nginx/conf.d/*.conf;
    }
    

    【/etc/nginx/conf.d/proxy.conf】

    # ヘッダの設定 
    proxy_redirect                          off;
    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;
    add_header X-Cache $upstream_cache_status;
     
    # タイムアウトの設定                           
    proxy_connect_timeout 60;
    proxy_read_timeout    90;
    proxy_send_timeout    60;
     
    # バッファサイズの設定                          
    proxy_buffering  on;
    proxy_buffer_size       8k;
    proxy_buffers           100 8k;
     
    # キャッシュの設定                              
    proxy_cache_path      /var/cache/nginx/night-walker.asia levels=1:2 keys_zone=cache_night-walker.asia:15m inactive=7d max_size=512m;
    proxy_temp_path       /var/cache/nginx/temp;
     
    proxy_cache_valid     200 2h;
    proxy_cache_valid     302 2h;
    proxy_cache_valid     301 4h;
    proxy_cache_valid     any 1m;
    
    【/etc/nginx/conf.d/virtual.conf】
    upstream backend {
           ip_hash;
           server 172.16.1.5:80;
    }
     
    server {
           listen 80;
           server_name wp01.night-walker.asia;
           proxy_set_header        Host            $host;
           proxy_set_header        X-Real-IP       $remote_addr;
           proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
           access_log  /var/log/nginx/wp01.night-walker.asia/access_log  main;
           error_log  /var/log/nginx/wp01.night-walker.asia/error_log;
    
           if ($http_host = night-walker.asia) {
                rewrite  (.*)  http://wp01.night-walker.asia;
            }
    
           try_files $uri $uri/ /index.php?q=$uri&$args;
    
           location / {
                    set $do_not_cache 0;
    
                    #  -- POST or HEAD ?
                    if ($request_method != "GET") {
                        set $do_not_cache 1;
                    }
    
                    #  -- Login or Comment or Post Editting ?
                    if ($http_cookie ~ ^.*(comment_author_|wordpress_logged_in|wp-postpass_).*$) {
                        set $do_not_cache 1;
                    }
    
                    #  -- mobile ?
                    if ($http_x_wap_profile ~ ^[a-z0-9\"]+) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Mobile ?
                    if ($http_profile ~ ^[a-z0-9\"]+) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                    if ($http_user_agent ~ ^.*(2.0\ MMP|240x320|400X240|AvantGo|BlackBerry|Blazer|Cellphone|Danger|DoCoMo|Elaine/3.0|EudoraWeb|Googlebot-Mobile|hiptop|IEMobile|KYOCERA/WX310K|LG/U990|MIDP-2.|MMEF20|MOT-V|NetFront|Newt|Nintendo\ Wii|Nitro|Nokia|Opera\ Mini|Palm|PlayStation\ Portable|portalmmm|Proxinet|ProxiNet|SHARP-TQ-GX10|SHG-i900|Small|SonyEricsson|Symbian\ OS|SymbianOS|TS21i-10|UP.Browser|UP.Link|webOS|Windows\ CE|WinWAP|YahooSeeker/M1A1-R2D2|iPhone|iPod|Android|BlackBerry9530|LG-TU915\ Obigo|LGE\ VX|webOS|Nokia5800).*) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Mobile ?
                    if ($http_user_agent ~ ^(w3c\ |w3c-|acs-|alav|alca|amoi|audi|avan|benq|bird|blac|blaz|brew|cell|cldc|cmd-|dang|doco|eric|hipt|htc_|inno|ipaq|ipod|jigs|kddi|keji|leno|lg-c|lg-d|lg-g|lge-|lg/u|maui|maxo|midp|mits|mmef|mobi|mot-|moto|mwbp|nec-|newt|noki|palm|pana|pant|phil|play|port|prox|qwap|sage|sams|sany|sch-|sec-|send|seri|sgh-|shar|sie-|siem|smal|smar|sony|sph-|symb|t-mo|teli|tim-|tosh|tsm-|upg1|upsi|vk-v|voda|wap-|wapa|wapi|wapp|wapr|webc|winw|winw|xda\ |xda-).*) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                    if ($http_user_agent ~ ^(DoCoMo/|J-PHONE/|J-EMULATOR/|Vodafone/|MOT(EMULATOR)?-|SoftBank/|[VS]emulator/|KDDI-|UP\.Browser/|emobile/|Huawei/|IAC/|Nokia|mixi-mobile-converter/)) {
                        set $do_not_cache 1;
                    }
    
                    #  -- Kei-tai ?
                   if ($http_user_agent ~ (DDIPOCKET\;|WILLCOM\;|Opera\ Mini|Opera\ Mobi|PalmOS|Windows\ CE\;|PDA\;\ SL-|PlayStation\ Portable\;|SONY/COM|Nitro|Nintendo)) {
                       set $do_not_cache 1;
                    }
     
                    proxy_no_cache	$do_not_cache;
                    proxy_cache_bypass	$do_not_cache;
    		resolver 127.0.0.1; 
                    proxy_pass http://$host;
                    proxy_cache_key $scheme://$host$request_uri;
           }
    }
    
  6. 管理人
    2014年2月28日, 4:03 AM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    細かく見てませんが、もっと簡単なテストから始められてはいかがでしょうか。

    せっかく2台のサーバーで分散させたいのですから、単純にキャッシュサーバーとしてnginxを使えば良いはず?なのではないかと思います。
    $do_not_cache などでキャッシュの有無など後で良いものは、全部とっぱらって、キャッシュの有無だけを確認されてはいかがでしょうか。

    で、ログにキャッシュの有無を出力させるようにしたら良いか・・・と、それである程度デバックできるんじゃないかと・・・思います。

    ログフォーマットは、こんな感じ。

    log_format rt_cache '$remote_addr - $upstream_cache_status [$time_local]  '
                        '"$request" $status $body_bytes_sent '
                        '"$http_referer" "$http_user_agent"';
    

    $upstream_cache_status : HITが出ればキャッシュから読み込んだ証拠・・・だったと思います。
    詳しくは、マニュアル読むと良いでしょう。

    こんな感じでしょうでしょう。答えになっていなかったらごめんなさい。

  7. tetuya0703
    2014年3月1日, 12:07 AM

    管理人様

    こんばんは
    tetuya0703です

    ご指導、ありがとうございました
    いただいたアドバイスを元に切りわけを行いました

    最初は単純なcacheサーバーとしての動作をさせる為の設定の設定のみにして
    動作させた所、cacheのデレクトリィーにはcache情報が保存されました

    その後、順番に設定を追加していてわかったのですが、管理人様のサイトで
    wordpress用の設定で

    if ($request_method != "GET") {
                    set $do_not_cache 1;
    }
    

    という記載があるのですが
    良く、サイト情報を確認すると、説明の部分では上記の部分が

    if ($request_method = "POST") {
                    set $do_not_cache 1;
    }
    

    となっていました
    両方ともGET以外の指定だとは思うのですが、!=GETでは

    do_not_cache 1
    

    に設定されてしまい
    X-Cacheがbypassされてしまうようです

    時間があればご確認頂ければと思います

    ご教授ありがとうございました

  8. 管理人
    2014年3月1日, 4:00 AM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    if ($request_method != "GET") {
        set $do_not_cache 1;
    }
    

    if ($request_method = "POST") {
        set $do_not_cache 1;
    }
    

    も基本的に同じです。上の判定の違いについて動作確認しましたけど、いずれも 通常のファイル参照であれば、$do_not_cache に 1 がセットされることはありませんでした。

    これが違う結果が出る?ということなんですよね?

    んーーーーっ、詳しく設定を確認しないとわかりませんが、
    $request_method , $do_not_cache をログに出力してみられたらどうでしょう。

  9. tetuya0703
    2014年3月1日, 8:46 PM

    管理人様

    アドバイスありがとうございます
    logに$request_method , $do_not_cacheを出力して確認したのですが
    私の勘違いで、被疑箇所は

    #  -- Login or Comment or Post Editting ?
    if ($http_cookie ~ ^.*(çwordpress_logged_in|wp-postpass_).*$) {
        set $do_not_cache 1;
    }
    

    で$do_not_cacheに1が設定されるようです

    $http_cookieをlogに出力したところ、wp01.domain.comのwordpressをreloadするとlogには

    wp-settings-time-1=1393349537; wp-settings-1=libraryContent%3Dbrowse; comment_author_4116c94503ab7348f3be47beac224a89=test; comment_author_email_4116c94503ab7348f3be47beac224a89=mail_address
    

    となります。
    条件式としてcomment_author_から始まる場合は、cacheをbypassするようにしていますが、ホーム画面でreloadするとcomment_author_がcookieに記載されるようですが、これはwordpressのバージョンの問題なのでしょうか

    条件式からcomment_author_を外すと、$do_not_cacheは1に競ってされず、条件はスルーされます

    これはどの様に考えればよろしいでしょうか

    ご教授頂けますと助かります

    よろしくお願い申し上げます。

  10. tetuya0703
    2014年3月1日, 8:58 PM

    管理人様

    追加で確認してみました
    現状はworddpressの条件のなかで、comment_author_を削除しています
    それで、logの中では$do_not_cacheは0と記録されているのですが

    私のローカル環境から
    curl http://wp01.domain.com –head
    を実行すると

    HTTP/1.1 200 OK
    Server: nginx/1.4.5
    Date: Sat, 01 Mar 2014 11:48:42 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: keep-alive
    Vary: Accept-Encoding
    X-Powered-By: PHP/5.3.3
    X-Cached: Sat, 01 Mar 2014 11:48:42 GMT
    X-Pingback: http://wp01.domain.com/xmlrpc.php
    Last-Modified: Sat, 01 Mar 2014 11:48:42 GMT
    X-Cache: BYPASS
    

    となり、”X-Cache: BYPASS”されてしまいます

    # — POST or HEAD ?
    の条件式を
    $request_method != “GET”
    から
    $request_method = “POST”
    に変更すると
    X-Cache: HIT
    になります
    $do_not_cacheは1以外であれば
    X-Cache: BYPASSされず、HITになるとおもうのですが
    これは、何か他の問題が内在しているのでしょうか

    それとも私のlogの見方が間違っているのでしょうか
    ご教授頂けますと幸いです

  11. 管理人
    2014年3月1日, 10:32 PM

    tetuya0703 さん
    管理人です。コメントありがとうございます。

    ちょっと、厳しいですね。

    WordPressの問題は、ちょっとバージョンから何からいろんな問題がありますから、まずは、最新バージョンでログインせずに、キャッシュを削除、クッキーを削除して確認されてはいかがでしょうか。

    テストをする環境がきれいにできていないと、何が問題か整理できなくなりますから、まずは、そのあたりから、一つ一つされてはいかがでしょうか。

    もう少し、ご自身で問題点を整理されてから、質問されるといろんなサイトでも皆さん回答しやすいかもです。

  12. tetuya0703
    2014年3月2日, 5:30 PM

    管理人様

    こんにちは
    ご指導ありがとうございます

    現状の自身の環境を整理してみます
    また、不明点が出たときはご指導をお願い申し上げます

  13. 管理人
    2014年3月4日, 1:49 PM

    tetuya0703 さん
    管理人です。
    コメントありがとうございます。
    またコメントください。
    お仕事なら、いつでもお引き受けしますよ。

  14. Tetuya0703
    2014年3月6日, 8:14 PM

    管理人様

    こんにちは
    tetuya0703です
    お仕事としての依頼では無くて恐縮です

    あれから、私なりに色々と環境 お調査を進めました
    まず、cookieのdo_not_cacheの件なのですがブラウザにより振る舞いが異なる事がわかりました
    firefoxのばあいはhttp request headerにcookieの情報が内包されていました
    具体的にはcomment_authoer等です
    手元にある他のブラウザー(Safari.ie)でhttp request headerを確認した所、firefoxのようなcookieのrequestは内包されていませんでした

    これは、どのブラウザーの振る舞いが正しいのでしょうか
    こじんてきにはSafari、IEの振舞いの方が正しいとおもうのですが…

    それと、nginxのcacheの有効期限なのですが、proxy_cache_valid 200 2hを1mに変更しても1mでcacheが削除されず古い情報がブラウザーに帰ってしまいます

    これは設定の問題なのでしょうか
    それともこの振る舞いがせいじょうなのでしょうか

    ご教授よろしくお願いします。

  15. 管理人
    2014年3月7日, 12:18 AM

    tetuya0703 さん
    管理人です。
    コメントありがとうございます。

    ブラウザの動作が正しいか?ですか?
    それは、ここじゃなくってブラウザのところで確認された方が間違いないと思いますよ。

    削除されずに古い情報がブラウザーに帰ってくる?ですか?
    本当にそうなら、設定でしょうね。

    ごめんなさい、質問の意図?が・・・・わかっていないようです。
    思ったとおりにキャッシュが削除されないんですよね、それは、設定が間違っているようにおもいますけど・・・。

    すみません、そのまんまのような気がして・・。


コメントを投稿 :

お名前 *

メールアドレス *
( メールアドレスが公開されることはありません。)

サイトアドレス

コメント *

* 印の項目は、入力が必要な項目です。




最近投稿の記事

ウェブサーバ(Debian/Ubuntu)の管理をしていて 恥ずかしながら nginx を最新へ自動アップグレードできていなかったので、 その ...

今回は、Deabin 8 から Deabin 9 へアップグレードしてみたいと思います。 Deabin 8 と Deabin 9 のウ ...

SSL/TLS(https://)に対応してみてわかったこと、事前に考えておくべき事のまとめ でも一部記載したように、 Let’ ...

今回は、Debian で nginx とともに HTTP/2 を使ってみたいと思います。 まず、HTTP/2 は、TLS接続を前提にしてお ...

ようやく、このサイトも SSL/TLS への対応がほぼできました。 Let’s Encrypt による いわゆる無料 SSL( ...


さくらのVPS 全プラン リニューアルです。(石狩(北海道)も選択可)


root権限ありで ¥685 / 月 ~ と非常にリーズナブルな CPU 1(core)の 512 プランから、 最高 CPU 10(core), メモリ 32(GB), SSD容量 800(GB) までとプランが充実。
ディスクは、SSDとHDDの選択が可能になった他、データセンターは人気の東京、石狩(北海道)となりました。

また、どのプランでも好きなOSが選べます
( CentOS, Fedora, Scientific Linux, FreeBSD, Ubutu, Debian )

管理人もおすすめのVPSです。
試用期間がありますから、一度、お試しを!!

詳しくは、http://vps.sakura.ad.jp/さくらのVPSのサイトへ へどうぞ!!

カテゴリ


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。


Serverman@VPS 完全1ヶ月無料 キャンペーン実施中です。
最近、スワップにも対応した Serverman@VPS は、かなりリーズナブルかもです。

  • メモリ1GB~2GBのEntryプラン :月額:490円
  • メモリ2MB~4GBのStandardプラン :月額:980円
  • メモリ4GB~8GBのProプラン :月額:1,980円

新規申し込みで1ヶ月間完全無料となるキャンペーンを実施中です。
Serverman@VPSの特徴は、安さとIPv6対応です。また、初期設定費0円もポイントです。

IPv6でちょっと遊んでみたい方には、おすすめかもしれませんね。最低利用期間もありませんから、気に入らないときは即解約もできます。

Serverman@VPSの詳細については、 http://dream.jp/vps/ Serverman@VPSのサイトへへどうぞ。



KVM採用 ConoHa VPSは、時間単位で借りれる便利なVPSです。


ConoHa VPS は、初期設定費0円最低利用期間無し時間単位で清算可能、 さらに、Web APIを使って自動化を図ることもできる便利なVPSです。

海外サーバー設置も可能で、ローカル接続にも対応と、かなり、機能豊富なサーバーです。

新規ユーザ登録で、クーポンもらえますから、まずは、お試しですね。

ConoHa VPSの詳細については、
http://www.conoha.jp/ へどうぞ。

KVM採用 お名前.com VPS(KVM) 2G プラン 初期設定費無料 キャンペーン 実施です。


メモリ2GBプラン CPU:3core、Disk:200GB
月額:1,153円から (初期設定:1,680円0円)

さくらのVPSがリニューアルされてもなんのその。
1GBメモリ / 2Core を ¥834 – の格安価格で提供中です!
間違いなくスペックからすると割安感ありです。
年間割引時の途中解約で返金がないのは、 ちょっと残念ですが、それでもこの割安感は魅力です。

まずは、お試しですね。

お名前.com VPS(KVM)の詳細については、
http://www.onamae-server.com/vps/ へどうぞ。(お試し期間が15日あります。)



  • はてなブックマークへ追加する
  • Facebookでシェアする
  • twitter でつぶやく
  • Google Plusでシェアする
  • Pocketでシェアする
ページトップへ
Time : 0.2572 [s]