nginx 实现负载均衡
nginx 实现负载均衡&&一台server发生故障自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
可增加健康检查地址,判定服务是否正常
nginx 的 upstream目前支持 4 种方式的分配
- 轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
- weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
- ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
- fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- url_hash(第三方)
先介绍一些默认参数
#weigth 参数表示权值,权值越高被分配到的几率越大 #max_fails 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 #fail_timeout max_fails 次失败后,暂停的时间。 #down 表示单前的server暂时不参与负载 #backup 其它所有的非backup机器down或者忙的时候,请求backup机器,这台机器压力会最轻。 server 120.10.192.72:5050 max_fails=3 fail_timeout=3s weigth=10; server 120.10.157.102:5050 max_fails=3 fail_timeout=3s weigth=5;
1.开放一个nginx端口做负载均衡请求的入口例如:80端口
upstream backend_web{ #ip_hash; #weigth 参数表示权值,权值越高被分配到的几率越大 #max_fails 允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误 #fail_timeout max_fails 次失败后,暂停的时间。 #down 表示单前的server暂时不参与负载 #backup 其它所有的非backup机器down或者忙的时候,请求backup机器,这台机器压力会最轻。 server xxxxx:5050; #gametest1服务 server xxxxx:5050; #gametest2服务 } server { listen 80; server_name xx.xx.xx.xx; #如果没有域名这里请输入ip地址 access_log /opt/nginx_logs/load_gameserver/access.log main; error_log /opt/nginx_logs/load_gameserver/access.log; index index.html index.htm index.php; location /{ proxy_pass http://backend_web; proxy_connect_timeout 1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP proxy_set_header X-Forwarded-For $remote_addr; #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header; } }
gametest1和gametest2 ngin配置一样
server { listen 5050; server_name xxxxxx; client_max_body_size 20m; access_log /opt/nginx_logs/gameserver/access.log main; error_log /opt/nginx_logs/gameserver/error.log; location = /platform/get_main_h5 { secure_link $arg_sign,$arg_et; secure_link_md5 "$uri $arg_version_name $arg_channel_name $arg_device_id $arg_et $arg_nonce_str gohell"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } if ($arg_sign = "") { return 504; } add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods POST,GET,OPTIONS; add_header Access-Control-Allow-Headers x-requseted-with,content-type; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $remote_addr; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; include uwsgi_params; uwsgi_pass 127.0.0.1:7072; } location / { add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods POST,GET,OPTIONS; add_header Access-Control-Allow-Headers x-requseted-with,content-type; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-For $remote_addr; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For; include uwsgi_params; uwsgi_pass 127.0.0.1:7072; } }
实现多台服务器之间session的共享
- nginx中的
ip_hash
技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash
是在upstream配置中定义的
upstream backend { server 127.0.0.1:8080 ; server 127.0.0.1:8081 ; ip_hash; }
ip_hash
是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash
是有缺陷的,不能在一些情况下使用:
- nginx不是最前端的服务器。
ip_hash
要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。 - nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
2019-04-18 设置定时任务为每天凌晨2点执行和每小时执行一次
2018-04-18 MAC下是用brew安装Redis
2018-04-18 python用zipfile模块打包文件或是目录、解压zip文件实例