使用OpenResty + Redis搭建动态反向代理

由于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配置

# ワーカプロセス数
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

确认动作

从请求头中提取了从Redis中获取的值,并访问了「http://test.<域名>」。

["x-test-header"]=> array(1) { [0]=> string(10) "test-value" } }
广告
将在 10 秒后关闭
bannerAds