nginx反向代理+keepalived
编译时要注意要安装upstream模块,但是默认是安装的,,所以编译可以用web服务的编译来编译。
反向代理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | upstream backend { #ip_hash;保持会话,这个功能不是很好,这个可以查看本地图片 server 192.168 . 222.140 : 80 max_fails = 3 fail_timeout = 30s ; server 192.168 . 222.141 : 80 max_fails = 3 fail_timeout = 30s ; } server { listen 80 ; server_name www.etiantian.org; location / { proxy_pass http: / / backend; } } |
此时如果要域名解析,应该使用负载均衡服务器的ip ,域名是www.eitiantian.org,bbs.etiantian.org,blog.etiantian.org。
用户web服务器是多站点,多虚拟主机的情况下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | upstream backend { server 192.168 . 222.140 : 80 max_fails = 3 fail_timeout = 30s ; server 192.168 . 222.141 : 80 max_fails = 3 fail_timeout = 30s ; } server { listen 80 ; server_name www.etiantian.org; location / { proxy_pass http: / / backend; proxy_set_header Host $host; proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for; } } server { listen 80 ; server_name bbs.etiantian.org; location / { proxy_pass http: / / backend; proxy_set_header Host $host; proxy_set_header X - Forwarded - For $proxy_add_x_forwarded_for; } } |
一致性哈希算法对数据的存储是不均匀的,但可以最大限度的减少缓存的失效量。在大规模部署Memcached时,容灾和扩容一定要用一致性哈希算法,以确保在出现故障或容量问题时减小对数据库的影响。
当遇到缓存服务器时,,缓存不会存在一个服务器上,所以各个之间是不相互联系的,所以要固定每次访问的缓存服务器,而不是每次访问的服务器都不一样,,,所以ip_hash就体现了效果,所有的缓存服务器加载一起才是个整体。
二、Keepalived+nginx
前提需要关闭防火墙,,因为是内网,关闭没啥大碍,,,不关闭,,keepalived就无法检测对方是否存在
master配置-keepalived:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ! Configuration File for keepalived global_defs { notification_email { 。。。。。。@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0 . 0.1 smtp_connect_timeout 30 router_id LVS_7 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168 . 222.143 / 24 } } |
slave-keepalived配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | ! Configuration File for keepalived global_defs { notification_email { 。。。。。@qq.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 10.0 . 0.1 smtp_connect_timeout 30 router_id LVS_2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168 . 222.143 / 24 } } |
MASTER 与slave的-nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | worker_processes 1 ; events { worker_connections 1024 ; } http { include mime.types; default_type application / octet - stream; sendfile on; keepalive_timeout 65 ; error_log logs / error.log error; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"' ; include extra / upstream.conf; } |
master--extra/upstream
1 2 3 4 5 6 7 8 9 10 11 12 13 | upstream backend { server 192.168 . 222.132 : 80 max_fails = 3 fail_timeout = 30s ; server 106.14 . 124.164 : 80 max_fails = 3 fail_timeout = 30s ; } server { listen 80 ; server_name www.etiantian.org; location / { proxy_pass http: / / backend; } } |
================================================================================================================
用VIP来访问
master 192.168.222.130
slaver 192.168.222.131
realserver 1 192.168.222.132
realserver 2 192.168.222.133
模拟调试,关闭任意keepalived
PV低于2000万,可以选用NGINX做反向代理
LVS属于转发,,,NGINX是代理
大并发,简单转发,,LVS
大并发,功能要求复杂,根据URI转发,,LVS+NGINX
并发不大,NGINX/haproxy
=================================================================================================================
upstream模块
它支持的代理方式有 proxy_pass,fastcgi_pass,memecached_pass
proxy_pass:反向代理
fastcgi_pass:用于动态程序的交互
memecached_pass:与memcached交互
语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | upstream backend { server backend1.example.com weight = 5 ; / / 端口默认不加就是 80 ,,后面是权重,跟LVS一样,越大,分配的可能性越多 server backend2.example.com: 8080 ; / / 域名加端口 server unix: / tmp / backend3; / / 指定socket文件 server backup1.example.com: 8080 backup; / / 备份服务器,等上面指定的服务器都不可以访问的时候会启用,backup的用法和haproxy中用法一样 server backup2.example.com: 8080 backup; } server { location / { proxy_pass http: / / backend; } } |
参数:
1、本地图片有参数信息,upstream模块
max_fails=number
nginx尝试连接后端主机失败的次数,这个参数配合下面的三个参数:proxy_next_upstream, fastcgi_next_upstream, memcached_next_upstream
当请求失败后,不去提示用户,而是再去请求别的服务器。
当Nginx接收后端服务器返回这三个参数定义的状态码的时候,会将这个请求转发给正常工作的后端服务器,例如404,502,503
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
==================================================================================================================
upstream算法:
rr轮询(默认)
按客户端请求顺序把客户端的请求逐一分配到不同的后端的服务器,这相当于LVS中
的RR算法。
weight(权重)
在轮询算法的基础上加上权重(默认是rr+weight),权重越大,转发的请求也就越多。
ip_hash
每个请求按访问的IP 的hash结果分配,当新的请求到达时,先将其客户端ip通过哈希算法哈希出一个值,在随后请求客户端,ip的哈希值只要相同,就会被分配至同一台服务器,该调度算法可以解决动态网页session共享问题,但有时会导致请求分配不均,即无法保证1:1的负载均衡。在国内所有的公司都是NAT上网,多个PC对应一个外部ip。
提示:必须是最前端的服务器,后端也必须直接应用服务器多数情况不能和权重参数一起使用。
1 2 3 4 5 6 7 8 | upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; } |
注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup
fair
按照后端服务器的响应时间来分配请求,响应时间短的优先分配。
url_hash
按照url的hash结果来分配请求,让每个url定向到同一个后端服务器,后端服务器为缓存服务器时效果显著。。。。提高后端缓存服务器的命中率。
1 2 3 4 5 6 7 8 9 | upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com down; server backend4.example.com; hash $request_uri; hash_method crc32; } |
least_conn
最少连接数,哪个节气连接数少就少分发。
淘宝的服务器的一致性哈希算法。
http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html
================================================================================================================
location的正则表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | = 精确匹配,如果找到匹配 = 号的内容,立即停止搜索,并立即处理请求(优先级最高) ~ 区分大小写 ~ * 不区分大小写 ^~ 只匹配字符串,不匹配正则表达式 @ 指定一个命名的location,一般只用于内部重定向请求。 Let’s illustrate the above by an example: location = / { [ configuration A ] } location / { [ configuration B ] } location / documents / { [ configuration C ] } location ^~ / images / { [ configuration D ] } location ~ * \.(gif|jpg|jpeg)$ { [ configuration E ] } The “ / ” request will match configuration A, the “ / index.html” request will match configuration B, the “ / documents / document.html” request will match configuration C, the “ / images / 1.gif ” request will match configuration D, and the “ / documents / 1.jpg ” request will match configuration E. |
http_proxy_module
proxy_pass指令,将请求转发到另一台服务器。
1 2 3 4 5 6 7 | location / { error_page 404 = @fallback; } location @fallback { proxy_pass http: / / backend; } |
http_proxy模块参数,,,nginx的代理功能是通过http proxy模块来实现的,默认在安装nginx时已经安装了http_proxy模块,因此可以直接使用http proxy模块
本地有图片,,http proxy 模块参数
http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_set_header
特殊的参数:
proxy_set_header 设置由后端的服务器获取用户的主机名或者真实ip地址,以及代理者的真实ip地址。
proxy_set_header Host $host 当后端WEB服务器上也配置有多个虚拟主机时,需要用该Header来区分反向代理哪个主机名。
上述的可以实现,在负载均衡器上配,,有负载均衡器向后端请求
proxy_set_header X-Forwarded-For $remote_addr 如果后端WEB服务器上的程序需要获取用户ip,从该Header头获取。
rs节点的nginx.conf配置:
log_format commonlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
要看客户的ip,不知加参数,还要将日志格式修改。
根据url中的目录地址实现代理转发
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | upstream static_pools { server 10.0 . 0.6 : 80 weight = 5 ; } upstream dynamic_pools { server 10.0 . 0.8 : 80 weight = 5 ; } server { listen 80 ; server_name blog.etiantian.org; location / { proxy_pass http: / / dynamic_pools; include extra / proxy.conf; } location / static / { proxy_pass http: / / static_pools; include extra / proxy.conf; } location / dynamic / { proxy_pass http: / / dynamic_pools; include extra / proxy.conf; } access_log off; } |
根据用户请求的user_agent向后转发对应的服务器。,,手机浏览跟pc浏览
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | server { listen 80 ; server_name blog.etiantian.org; location / { if ($http_user_agent ~ * "android" ) { proxy_pass http: / / dynamic_pools; } if ($http_user_agent ~ * "iphone" ) { proxy_pass http: / / static_pools; } proxy_pass http: / / dynamic_pools; include extra / proxy.conf; } access_log off; } |
health_ceck
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 2025成都.NET开发者Connect圆满结束
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 用一种新的分类方法梳理设计模式的脉络