当前位置:首页 > 技术文章 > 正文内容

nginx动态proxy_pass(NGINX动态代理)

arlanguage4个月前 (12-30)技术文章78

有时我们想根据用户请求的参数转发到不同的upstream,像做多机房用户路由的时候是非常有用的,实现有多种方式,一是设置不同的loction,然后让lua动态执行不同的子请求;还有就是将upstream设置成变量,让lua动态计算出返回哪个upstream;

下面演示第二种方式,假设我们的域名为aa.com,nginx配置如下:

upstream order0{
        server 127.0.0.1:12580;
}

upstream order1{
        server 127.0.0.1:11580;
}

server {
  listen 443 ssl;
  server_name aa.com;
 

  location / { 
    set_by_lua_file $ups /data/lua/upsteam.lua;
    
    add_header X-CLOSED 0;
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Accept-Encoding ""; 
    proxy_set_header X-Scheme $scheme;
    client_max_body_size 200m;
    proxy_pass http://$ups;
  }
}

上面的配置设置了2个upsteam,通过set_by_lua_file指令设置变量ups,然后请求到ups变量指向的upstream中,lua代码如下:


--ip to hash函数
function iptolong(ip)
    local first_index = 1
    local last_index = 1
    local cur_index=1
    local arr = {}
    local res
    local split_str
	
    split_str = "%."
    while true do
       first_index,_  = string.find(ip, split_str, last_index)
       if nil == first_index then
        arr[cur_index] = string.sub(ip, last_index, string.len(ip))
        break
       end
       arr[cur_index] = string.sub(ip, last_index, first_index - 1)
       last_index = first_index + 1
       cur_index = cur_index + 1
    end
	
    res = tonumber(arr[1])*256*256*256;
    res = res + tonumber(arr[2])*65536;
    res =res + tonumber(arr[3])*256;
    res = res + tonumber(arr[4]);
    return res
end

local ip = ngx.var.remote_addr;
local ip_hash

ip_hash = iptolong(ip) % 2;

if ip_hash == 1 then
	return "order1"
else
  return "order0"
end

上面我们根据用户的IP做Hash计算,结果为0的返回order0,反之返回order1,即不同的IP返回不同的Upstream;然后可以在浏览器访问 aa.com的一个地址,可以让每个服务器返回不同的东西就可以看到效果了。

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/560.html

分享给朋友:

“nginx动态proxy_pass(NGINX动态代理)” 的相关文章

性能优化大揭秘:从代码到架构,全方位提升系统性能的实战技巧

在现代软件开发中,系统性能优化是一个永恒的话题。无论是移动应用、Web应用还是分布式系统,性能始终是用户体验、系统稳定性以及业务可扩展性的关键因素。性能瓶颈的存在不仅可能导致用户流失,还可能增加系统维护成本,甚至影响到业务的正常运行。因此,从代码层面到架构层面,全面的性能优化是每个技术人员必须掌握的...

宝塔面板——永久免费的服务器运维面板

宝塔面板是什么?宝塔面板,简单好用的服务器运维面板。官称永久免费。Linux版请确保纯净系统安装(支持CentOS、Ubuntu、Debian、Fedora、deepin),Web端管理,一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP多版本共存及切换;自带LNMP与LAM...

配置nginx代理grafana实现域名访问

目的:通过Nginx服务器对grafana进行代理,实现通过https://域名/grafana在公网进行访问实践过程:1、修改Nginx配置(nginx.conf)文件,添加访问grafana的配置,配置时注意proxy_pass后面一定要有符号 /(目的是去掉/grafana/以匹配本身)vi...

你敢相信,将手机打造成你的私人服务器

近年来,科技的飞速发展让我们的手机性能越来越强,我们日常都用手机干什么,通讯支付,互联网浏览,社交媒体,拍摄和视频录制,玩游戏等等。除了这些,你敢相信,手机可以充当服务器,很多人可能不信,毕竟,手机和服务器,这两者看似毫无关系,怎么可能,实际上,手机是可以充当服务器使用的。我记得大概在10年前,我就...

只需要90分钟,醍醐灌顶,读透Nginx源码

前言总结有福利如何快速的把Nginx读明白,更加深入的了解Nginx,有很多朋友就想我能用Nginx就可以了,搞那么明白干嘛,学Nginx我们到底是先用,还是了解源码,在这里我觉的当然还是先用起来,在去阅读源码,这是成正常的一种想法,1、我肯定是先把Nginx跑起来明先会用,在深入。《用到什么是才算...

为现有nginx增加https模块

1.查询下nginx的版本/usr/local/nginx/sbin/nginx -V查询结果如下nginx version: nginx/1.9.9 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) built with OpenSSL 1...