OpenResty + Redisで動的リバースプロキシの動作検証を行ったので、設定内容をメモ。
サブドメインをキーにRedisから値を取得し、HTTPリクエストヘッダに追加する。
##OpenRestyをインストール
下記を参考に実施
https://qiita.com/nobuh/items/40ef50dd70fdf8a580e4
##Redisインストール
下記を参考に実施
https://qiita.com/KurosawaTsuyoshi/items/f8719bf7c3a10d22a921
##テスト用のデータをRedisに登録
# redis-cli -p 6379
127.0.0.1:6379> set test "test-value"
OK
127.0.0.1:6379> get test
"test-value"
127.0.0.1:6379>
##Nginx設定
nginx.conf
# ワーカプロセス数
worker_processes 1;
# エラーログ出力先
error_log /var/log/nginx/error.log;
# PIDファイルの配置先
pid /var/run/nginx.pid;
# 1ワーカプロセスが同時オープン可能なファイルディスクリプタ数最大値
worker_rlimit_nofile 1024;
events {
# 1ワーカプロセスが同時オープン可能なコネクション数最大値
worker_connections 512;
}
http {
# アクセスログ出力先
access_log /var/log/nginx/access.log;
# nginxに常時接続しているクライアントに対するタイムアウト時間
keepalive_timeout 10s;
server {
listen 80;
server_name ~^(?<subdomain>[^\.]+).example.com;
location / {
# 全てのアドレスを許可
allow all;
# Luaスクリプト
rewrite_by_lua '
-- モジュールをロード
local redis = require "resty.redis"
-- Redisオブジェクトを生成
local redisObj = redis:new()
-- タイムアウト値を設定( 単位 は ミリ 秒)
redisObj:set_timeout(3000)
-- Redisに接続
local ok,err = redisObj:connect("127.0.0.1",6379)
if not ok then
ngx.say("接続失敗:",err)
return
end
-- サブドメインを取得
local res,err = redisObj:get(ngx.var.subdomain)
if not res then
ngx.say("取得失敗:",err)
return
end
-- リクエストヘッダに追加
ngx.req.set_header("X-TEST-Header",res)
';
proxy_pass http://10.10.10.1:80;
}
}
}
##Nginxリロード
# nginx -p $(pwd) -s reload
##動作確認
「http://test.<ドメイン名>」へhttpアクセスしリクエストヘッダーより抜粋。
Redisから取得した値がヘッダに入っている。
["x-test-header"]=> array(1) { [0]=> string(10) "test-value" } }