设为首页 收藏本站
查看: 3077|回复: 0

[经验分享] NGINX 结合 lua 动态修改upstream

[复制链接]

尚未签到

发表于 2017-12-22 23:32:47 | 显示全部楼层 |阅读模式
  from http://blog.csdn.net/force_eagle/article/details/51966333
  具体思路是:
  1 > 利用lua中 "lua_shared_dict" 指令开辟一个共享内存空间;
  2> 通过API动态根据key值&参数修改 upstream  (这里使用 host 作为key);
  3> 利用 proxy_pass 可使用变量特性及lua指令 "set_by_lua" 动态修改当前 upstream 变量即可;
  以下是利用 qq.com 作为示例:
[plain] view plain copy  https://code.csdn.net/assets/CODE_ico.pnghttps://code.csdn.net/assets/ico_fork.svg

  • http {
  •     lua_shared_dict _ups_zone 64m; # 定义upstream共享内存空间
  •     ...
  •     upstream qq_backend{
  •         server 14.17.42.40;
  •         server 14.17.32.211;
  •         server 59.37.96.63;
  •     }

  •     server {
  •         listen       80;
  •         server_name  www.qq.com *.qq.com;
  •         access_log  off;

  •         # 更新 upstream API 接口
  •         location = /ups_update {
  •             content_by_lua '
  •                 local ups = ngx.req.get_uri_args()["ups"]
  •                 if ups == nil then
  •                     ngx.say("usage: /ups_update?ups=x.x.x.x")
  •                     return
  •                 end
  •                 local host = ngx.var.http_host
  •                 local ups_from = ngx.shared._ups_zone:get(host);
  •                 ngx.log(ngx.WARN, host, " update upstream from ", ups_from, " to ", ups)
  •                 ngx.shared._ups_zone:set(host, ups);
  •                 ngx.say(host, " update upstream from ", ups_from, " to ", ups)
  •             ';
  •         }
  •         location / {
  •             # 动态设置当前 upstream, 未设置则使用默认 upstream
  •             set_by_lua $cur_ups '
  •                 local ups = ngx.shared._ups_zone:get(ngx.var.http_host)
  •                 if ups ~= nil then
  •                     ngx.log(ngx.ERR, "get [", ups, "] from ngx.shared._ups_zone")
  •                     return ups
  •                 end
  •                 --ngx.log(ngx.INFO, "use default upstream");
  •                 return "qq_backend";
  •             '
  •             proxy_next_upstream off;
  •             proxy_set_header    Host $host;
  •             proxy_http_version  1.1;
  •             proxy_set_header    Connection  "";
  •             proxy_pass $scheme://$cur_ups;
  •         }
  •     }
  • }
[plain] view plain copy  https://code.csdn.net/assets/CODE_ico.pnghttps://code.csdn.net/assets/ico_fork.svg

  • cur -x 127.0.0.1:80 www.qq.com  # 使用默认upstream
  • # 修改为140.206.160.207 & 61.135.157.156
  • curl -x 127.0.0.1:80 www.qq.com/ups_update?ups=140.206.160.207
  • curl -x 127.0.0.1:80 www.qq.com/ups_update?ups=61.135.157.156
  这里只是一个简单的思路,并未考虑到 upstream 持久化,如需要可参考以下这篇文章, 使用 Redis 来实现:
  Dynamic nginx upstreams with Lua and Redis

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-427018-1-1.html 上篇帖子: roverliang 下篇帖子: Nginx教程(二) Nginx虚拟主机配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表