Nginxで構築するキャッシュプロキシサーバ
Nginxを使えば簡単にプロキシサーバを構築することができます。手元で動かせるサンプルコードをGithubで公開しています。git cloneしてご利用ください。PCにDockerがインストールされていれば簡単に動作環境を構築することができます。
https://github.com/shoyan/nginx-proxy-cache
キャッシュを有効にする
Nginxのキャッシュ機能はデフォルトでは有効ではないので、設定する必要があります。
/etc/nginx/nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| user nginx; worker_processes 1;
error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;
events { worker_connections 1024; }
http { proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=my-key:10m; proxy_temp_path /var/cache/nginx/tmp;
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;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf; }
|
次にlocationディレクティブでキャッシュを有効にします。
/etc/nginx/conf.d/default.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| server { listen 80; server_name localhost;
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;
location / { proxy_pass http://app:8081/; proxy_ignore_headers Cache-Control; proxy_cache my-key; proxy_cache_valid any 1m; add_header X-Nginx-Cache $upstream_cache_status; } }
|
以上の設定を行えばキャッシュが有効になります。
キャッシュの詳細な設定についてはNginxのドキュメントを参照ください。
ngx_http_proxy_module
アプリサーバはNode.jsで構築しています。1秒でHello Worldを返す単純なアプリサーバです。こちらもDockerで動作するのでNode.jsをPCにインストールする必要はありません。
プロキシサーバとアプリサーバの起動は次のコマンドで行います。
1 2 3 4 5 6 7
| $ docker-compose up Starting proxycachesample_app_1 ... Starting proxycachesample_app_1 ... done Starting proxycachesample_proxy_1 ... Starting proxycachesample_proxy_1 ... done Attaching to proxycachesample_app_1, proxycachesample_proxy_1 app_1 | Server running at http:
|
1回目のアクセスはリクエストがアプリサーバまで行くのでレスポンスタイムは1秒程度かかります。
1 2 3
| $ curl http: Hello World 1.009103
|
2回目からのアクセスはプロキシサーバがキャッシュしているため、レスポンスタイムが速くなります。
1 2 3
| $ curl http: Hello World 0.003797
|
確認が終わったらサーバを停止しておきましょう。サーバの停止はCtrl+Cか次のコマンドで行えます。