[Nginx] 使用轉址做負載平衡

Ref:



有個需求是這樣的

現在前端使用某一個 url,
假設是 http://example.com/test
然後希望前端載入這個網址的時候,
可以讓這個 url 隨機導向N個不同的網域,
假設是 a.example.com, b.example.com, c.example.com
但是後面路徑要是一樣的
也就是
http://example.com/test?t=1 -> http://c.example.com/test?t=1

這樣該怎麼做呢?
先假設 nginx 路徑是安裝在 /usr/local/nginx

先建立一個 /usr/local/nginx_module的目錄

安裝這個 module 要先下載另一個 ngx_devel_kit
先到 https://github.com/simplresty/ngx_devel_kit/tags 找個版本下載
cd ~ && wget https://github.com/simplresty/ngx_devel_kit/archive/v0.3.1rc1.tar.gz
tar zxfv v0.3.1rc1.tar.gz
#把解壓縮出來的目錄去掉版本號
mv ngx_devel_kit-0.3.1rc1 ngx_devel_kit && mv ngx_devel_kit /usr/local/nginx_module/



然後接著下載 set-misc 這個 module
先到 https://github.com/openresty/set-misc-nginx-module/tags 找個版本下載
cd ~ && wget https://github.com/openresty/set-misc-nginx-module/archive/v0.32.tar.gz
tar zxfv v0.32.tar.gz
#把解壓縮出來的目錄去掉版本號
mv set-misc-nginx-module-0.32 set-misc-nginx-module && mv set-misc-nginx-module /usr/local/nginx_module/

然後重新編譯原本安裝的 nginx, 但記得先備份
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.backup

#cd ~/當初下載nginx的目錄
cd ~/nginx-1.10.1

./configure --prefix=/usr/local/nginx --with-http_ssl_module \
--add-module=/usr/local/nginx_module/ngx_devel_kit \ 
--add-module=/usr/local/nginx_module/set-misc-nginx-module

make -j2
make install

# kill原本在跑的 nginx pid
# 用 ps aux 找出 pid 複製之後使用 kill
ps aux | grep nginx
kill pid

# 啟動 nginx
/usr/local/nginx/sbin/ngin

之後就可以在 nginx conf 檔內新增
server {
    ...
    location / {
        # 隨機亂數 1 ~ 4
        set_random $loc_rnd 1 4;
        if ($loc_rnd = 1) {
            return 302 $scheme://a.example.com$request_uri;
        }
        if ($loc_rnd = 2) {
            return 302 $scheme://b.example.com$request_uri;
        }
        if ($loc_rnd = 3) {
            return 302 $scheme://c.example.com$request_uri;
        }
    }
}

不過我相信應該沒有很多人有這種特殊的需求XD

留言

  1. 這是什麼樣的情境會有的需求 XD

    回覆刪除
  2. 感谢博主提供了一个这样的方法,一直在寻找用重定向来做负载均衡的方式。
    咱提供一个使用场景吧
    因为咱用cloudflare的workers和GSuit团队盘搭建Goindex这种免费分享文件下载的网页,但是cf的免费额度只有10万次请求,很快就会被耗光,长期以此还容易被cf封号。
    咱就是准备注册50个cloudflare账户,做一个负载均衡池。

    回覆刪除

張貼留言

這個網誌中的熱門文章

[MySQL] schema 與資料類型優化

[翻譯] 介紹現代網路負載平衡與代理伺服器