nginx反向代理及负载平衡
nginx反向代理功能https://i-blog.csdnimg.cn/direct/d95e0f6876ff4d218e7afb65a70733ca.png
[*]反向代理:reverse proxy,指的是代理外网用户的哀求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式
[*]Nginx除了可以在企业提供高性能的web服务之外,另外还可以将nginx自己不具备的哀求通过某种预定义的协议转发至别的服务器处理,不同的协议就是Nginx服务器与其他服务器进行通讯的一种规范,紧张在不同的场景使用以下模块实现不同的功能:
[*]ngx_http_proxy_module 将客户端的哀求以http协议转发至指定服务器进行处理
[*]ngx_http_upstream_module 用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组
[*]ngx_stream_proxy_module 将客户端的哀求以tcp协议转发至指定服务器处理
[*]ngx_http_fastcgi_module 将客户端对php的哀求以fastcgi协议转发至指定服务器助理
[*]ngx_http_uwsgi_module 将客户端对Python的哀求以uwsgi协议转发至指定服务器处理
逻辑调用关系:
https://i-blog.csdnimg.cn/direct/bbf73c6a8edd4813937d179ce75cf2d4.png
访问逻辑图:
https://i-blog.csdnimg.cn/direct/4ccc38f62d034141aceceaa08ba58398.png
[*]同构代理:用户不需要其他程序的参与,直接通过http协议或者tcp协议访问后端服务器
[*]异构代理:用户访问资源时需要颠末处理后才华返回,好比php,python等等,这种访问资源需要颠末处理才华被访问
https://i-blog.csdnimg.cn/direct/cd7fe3b384d14fff9b8935c98e3febbc.png
http反向代理
官方文档:https://nginx.org/en/docs/http/ngx_http_proxy_module.html
反向代理配置参数
[*]proxy_pass 用来设置将客户端哀求转发给的后端服务器的主机,
[*]可以是主机名:端口、IP地址:端口
[*]也可以代理到预先设置的主机群组,需要模块ngx_http_upstream_module支持
[*]proxy_hide_header field 用于nginx作为反向代理的时候,在返回给客户端http响应时,潜伏后端服务器相应头部的信息,可以设置在http,server或location块
#示例: 隐藏后端服务器ETag首部字段
location /web {
index index.html;
proxy_pass http://10.0.0.18:8080/;
proxy_hide_header ETag;
}
[*]proxy_pass_header field 透传,默认nginx在响应报文中不传递后端服务器的首部字段Date, Server, X-Pad, X-Accel等参数,如果要传递的话则要使用proxy_pass_header field声明将后端服务器返回的值传递给客户端
[*]field 首部字段大小不敏感
#示例:透传后端服务器的Server和Date首部给客户端,同时不再响应报中显示前端服务器的Server字段
proxy_pass_header Server;
proxy_pass_header Date;
[*]proxy_pass_request_body on | off 是否向后端服务器发送HTTP实体部分,可以设置在http,server或location块,默认即为开启
[*]proxy_pass_request_headers on | off 是否将客户端的哀求头部转发给后端服务器,可以设置在http,server或location块,默认即为开启
[*]proxy_set_header 可更改或添加客户端的哀求头部信息内容并转发至后端服务器,好比在后端服务器想要获取客户端的真实IP的时候,就要更改每一个报文的头部
#示例:
location ~ /web {
proxy_pass http://172.25.254.20:80;
proxy_hide_header ETag;
proxy_pass_header Server;
proxy_pass_request_body on;
proxy_pass_request_headers on;
proxy_set_header X-Forwarded-For $remote_addr;
}
[*]proxy_connect_timeout time 配置nginx服务器与后端服务器尝试建立连接的超时时间,默认为60秒
#用法如下:proxy_connect_timeout 60s;
#60s为自定义nginx与后端服务器建立连接的超时时间,超时会返回客户端504响应码
[*]proxy_read_timeout time 配置nginx服务器向后端服务器或服务器组发起read哀求后,等待的超时时间,默认60s
[*]proxy_send_timeout time 配置nginx项后端服务器或服务器组发起write哀求后,等待的超时 时间,默认60s
[*]proxy_http_version 1.0 用于设置nginx提供代理服务的HTTP协议的版本,默认http 1.0
[*]proxy_ignore_client_abort off 当客户端网络中断哀求时,nginx服务器中断其对后端服务器的哀求。即如果此项设置为on开启,则服务器、会忽略客户端中断并不停等着代理服务实行返回,如果设置为off,则客户端中断后Nginx也会中断客户端哀求并立即纪录499日志,默认为off
proxy_pass的留意事项
location /web {
index index.html;
proxy_passhttp://172.25.254.30:8080;
}
#8080后面无uri,即无/符号,会将location后面的url加到proxy_pass指定的url后面,此行为类似于root
#proxy_pass指定的uri不带斜线将访问/web下的内容
[*]如果location定义其uri时使用了正则表达式模式(包罗~,~*,但不包罗^~),则proxy_pass之后必须不能使用uri。即不能有/ ,用户哀求时传递的uri将直接附加至后端服务器之后
location /web {
index index.html;
proxy_passhttp://172.25.254.30:8080/;
}
#8080后面有uri,即/符号,此行为类似于alias
#proxy_pass指定的uri带斜线等于访问http://172.25.254.30:8080/index.html
[*]location中的proxy_pass只能有一个,不能有多个,否则会报错
案例:反向代理单台后端服务器
[*]nginx服务器:172.25.254.100 www.huazi.org
[*]web1服务器:172.25.254.10
# yum install httpd -y
# echo 172.25.254.10 > /var/www/html/index.html
# systemctl start httpd
# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.huazi.org;
location / {
proxy_pass http://172.25.254.10:80;
}
}
# nginx -s reload
测试:当访问www.huazi.org时,nginx会将哀求代理到web1上
https://i-blog.csdnimg.cn/direct/8d60c2cd95f24ced87200738b03033a0.png
案例:反向代理实现动静分离
https://i-blog.csdnimg.cn/direct/94e2ef18cc874d0ca35a7244c153c0e4.png
[*]nginx服务器:172.25.254.100 www.huazi.org
[*]web1服务器:172.25.254.10 动
[*]web2服务器:172.25.254.20 静
# yum install php -y
# vim /var/www/html/index.php
<?php
phpinfo();
?>
# systemctl restart httpd
# yum install httpd -y
# mkdir -p /var/www/html/static
# echo static 172.25.254.20 > /var/www/html/static/index.html
# systemctl start httpd
# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.huazi.org;
location ~ \.php$ {
proxy_pass http://172.25.254.10:80;
}
location /static {
proxy_pass http://172.25.254.20:80;
}
}
# nginx -s reload
测试
https://i-blog.csdnimg.cn/direct/fbeb7125248b4b509963419d275dc928.png
https://i-blog.csdnimg.cn/direct/721aa205a84d45bf87659dc48e3c3644.png
案例:反向代理的缓存功能
[*]proxy_cache zone_name | off; 默认off 指明调用的缓存,或关闭缓存机制
[*]zone_name表现缓存的名称,需要由proxy_cache_path事先定义
[*]proxy_cache_key string 缓存中用于“键”的内容,默认值:proxy_cache_key $scheme$proxy_host$request_uri;
[*]proxy_cache_valid time; 定义对特定响应码的响应内容的缓存时长,定义在http{...}中
[*]示例: proxy_cache_valid 200 302 10m; 对于 HTTP 响应状态码为 200(OK)和 302(Found,通常用于暂时重定向)的响应,它们将被缓存,而且缓存有用期为 10 分钟(10m)
[*]proxy_cache_path 路径 定义可用于proxy功能的缓存
[*]proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ; 默认是off 在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应给客户端
[*]示例 proxy_cache_use_stale error http_502 http_503;
[*]proxy_cache_methods GET | HEAD | POST ...; 对哪些客户端哀求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
#示例:在http配置定义缓存信息
proxy_cache_path/var/cache/nginx/proxy_cachelevels=1:2:2keys_zone=proxycache:20minactive=120s max_size=10g;
#/var/cache/nginx/proxy_cache定义缓存保存路径,proxy_cache会自动创建
#levels=1:2:2定义缓存目录结构层次,1:2:2可以生成2^4x2^8x2^8=2^20=1048576个目录
#keys_zone=proxycache:20m 定义了一个名为proxycache的缓存键区域,并为其分配了20MB的内存,一般1M可存放8000个左右的key
#inactive=120s 缓存有效时间
#max_size=10g 最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值
#调用缓存功能,需要定义在相应的配置段,如server{...};或者location等
proxy_cache proxycache;
proxy_cache_key $request_uri; #对指定的数据进行MD5的运算做为缓存的key
proxy_cache_valid 200 302 301 10m; #指定的状态码返回的数据缓存多长时间,10分钟
proxy_cache_valid any 1m; #除指定的状态码返回的数据以外的缓存多长时间,必须设置,否则不会缓存
非缓存场景下测压
# ab -n 1000 -c 100 http://www.huazi.org/static/index.html
https://i-blog.csdnimg.cn/direct/17e9312f4d2d41f3ace24668d6c6884c.png
准备缓存
[*]在主配置文件中
# vim /usr/local/nginx/conf/nginx.conf
https://i-blog.csdnimg.cn/direct/42af285ca93d4bdeb914c1e7040838e4.png
[*]proxycache名字可以自定义
# vim /usr/local/nginx/conf.d/vhosts.conf
https://i-blog.csdnimg.cn/direct/9c1c9da7c1504365a4ff82fb5eb4d995.png
# nginx -s reload
缓存场景下测压
# ab -n 1000 -c 100 http://www.huazi.org/static/index.html
https://i-blog.csdnimg.cn/direct/ea3a751fbf42432eadcaea93ef85bbac.png
[*]发现哀求变快了
验证缓存文件
https://i-blog.csdnimg.cn/direct/2b1819a9a33e43a6a70e21ccc47a84e7.png
https://i-blog.csdnimg.cn/direct/222ce37709394d7e84d5bd9417dde56a.png
反向代理负载平衡(7层)
[*]官方文档: https://nginx.org/en/docs/http/ngx_http_upstream_module.html
[*]在上面的案例中Nginx可以将客户端的哀求转发至单台后端服务器,但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测
[*]Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能
upstream配置参数
http {
upstream name {
server ip:port ;
......................
}
server {
location / {
proxy_pass http://name;
}
}
}
[*]upstream中的server支持的params如下
weight=number #设置权重,默认为1,实现类似于LVS中的WRR,WLC等
max_conns=number #给当前后端server设置最大活动链接数,默认为0表示没有限制
max_fails=number #后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器连续进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
fail_timeout=time #后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否恢复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
backup #设置为备份服务器,当所有后端服务器不可用时,才会启用此备用服务器
down #标记为down状态,可以平滑下线后端服务器
resolve #当server定义的是主机名的时候,当A记录发生变化会自动应用新IP而不用重启
负载平衡算法
Nginx支持多种负载平衡算法,常见的包罗:
[*]轮询(Round Robin):默认算法,按照次序将哀求依次分发到后端服务器
[*]权重(Weighted Round Robin):为每个后端服务器设置权重,权重高的服务器分配的哀求会更多
[*]IP 哈希(ip_hash):根据客户端 IP 的哈希值决定分发到哪台后端服务器,实用于需要保持会话同等性的场景
[*]最少连接(least_conn):将哀求分配给当前连接数最少的后端服务器
[*]hash(指定字段哈希):基于指定的哀求字段(如URL、Cookie等)来分配哀求
https://i-blog.csdnimg.cn/direct/028f0b00631c41d1a4bdd86d009bc275.png
案例:反向代理多台web服务器(轮询)
[*]需要location块中的proxy_pass参数和upstream块配合使用
[*]upstream块和server块是同级的
# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster { server 172.25.254.10:80 fail_timeout=15s max_fails=3; server 172.25.254.20:80 fail_timeout=15s max_fails=3; server 172.25.254.100:80 backup;}server { listen 80; server_name www.huazi.org; location / { proxy_passhttp://webcluster; }}
[*]max_fails=number 后端服务器的下线条件,当客户端访问时,对本次调度选中的后端服务器一连进行检测多少次,如果都失败就标记为不可用,默认为1次,当客户端访问时,才会利用TCP触发对探测后端服务器健康性检查,而非周期性的探测
[*]fail_timeout=time 后端服务器的上线条件,对已经检测到处于不可用的后端服务器,每隔此时间间隔再次进行检测是否规复可用,如果发现可用,则将后端服务器参与调度,默认为10秒
[*]backup关键字意味着只有当webcluster组中的其他全部服务器都不可用时,Nginx才会向这个服务器发送哀求
# nginx -s reload
测试:
https://i-blog.csdnimg.cn/direct/85aed4e27c8b45f39e6d4a6def2e4eb7.png
案例:反向代理多台web服务器(源地址hash调度)
[*]有ip_hash,就不能有backup
# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster { ip_hash; server 172.25.254.10:80 fail_timeout=15s max_fails=3; server 172.25.254.20:80 fail_timeout=15s max_fails=3;}server { listen 80; server_name www.huazi.org; location / { proxy_passhttp://webcluster; }} # nginx -s reload
测试:
https://i-blog.csdnimg.cn/direct/f92679d150a34e94be01b56a834a8db6.png
案例:反向代理多台web服务器(对uri进行hash调度)
# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster { hash $request_uri consistent; server 172.25.254.10:80 fail_timeout=15s max_fails=3; server 172.25.254.20:80 fail_timeout=15s max_fails=3;}server { listen 80; server_name www.huazi.org; location / { proxy_passhttp://webcluster; }}# nginx -s reload
# mkdir -p /var/www/html/static/
# echo 172.25.254.10 static > /var/www/html/static/index.html
https://i-blog.csdnimg.cn/direct/753adeca5d3a434bac1411f25f7a6f2c.png
案例:反向代理多台web服务器(对cookie值进行hash调度)
# vim /usr/local/nginx/conf.d/vhosts.conf
upstream webcluster { hash $cookie_huazi; server 172.25.254.10:80 fail_timeout=15s max_fails=3; server 172.25.254.20:80 fail_timeout=15s max_fails=3;}server { listen 80; server_name www.huazi.org; location / { proxy_passhttp://webcluster; }}# nginx -s reload
https://i-blog.csdnimg.cn/direct/27a9ca64299741489e0a96b2d57d2050.png
案例:反向代理多台web服务器(下线)
upstream webcluster {
hash $cookie_huazi;
server 172.25.254.10:80 fail_timeout=15s max_fails=3 down;
server 172.25.254.20:80 fail_timeout=15s max_fails=3;
}
server {
listen 80;
server_name www.huazi.org;
location / {
proxy_passhttp://webcluster;
}
}
# nginx -s reload
https://i-blog.csdnimg.cn/direct/fb2473b5ef6744c68ac723cf78dbe944.png
反向代理负载平衡(4层)
stream {
upstream backend {
server backend1.example.com:3306;
server backend2.example.com:3306;
}
server {
listen 3306;
proxy_pass backend;
}
}
[*]Nginx在1.9.0版本开始支持tcp模式的负载平衡,在1.9.13版本开始支持udp协议的负载,udp紧张用于DNS的域名解析,其配置方式和指令和http代理雷同,其基于ngx_stream_proxy_module模块实现tcp负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、调度算法等高级功能
[*]如果编译安装,需要指定--with-stream选项才华支持ngx_stream_proxy_module模块
[*]官方文档:https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html
案例:基于udp的dns的负载平衡
[*]nginx服务器:172.25.254.100 www.huazi.org
[*]dns1服务器:172.25.254.10
[*]dns2服务器:172.25.254.20
先配置dns服务器
# yum install bind -y
# vim /etc/named.conf
https://i-blog.csdnimg.cn/direct/7c9fed022e38409d80081ef72322f685.png
# vim /etc/named.rfc1912.zones
https://i-blog.csdnimg.cn/direct/3464f8cab1144162acefe875b52004a4.png
# cd /var/named/
# cp -a named.localhost /var/named/huazi.com.zone
# vim huazi.com.zone
https://i-blog.csdnimg.cn/direct/b892c109109c44249267928c708371c6.png
# systemctl start named
# dig www.huazi.com @172.25.254.10
https://i-blog.csdnimg.cn/direct/727e1ff3523844c795541299ec0d645b.png
# yum install bind -y
# vim /etc/named.conf
https://i-blog.csdnimg.cn/direct/7c9fed022e38409d80081ef72322f685.png
# vim /etc/named.rfc1912.zones
https://i-blog.csdnimg.cn/direct/3464f8cab1144162acefe875b52004a4.png
# cd /var/named/
# cp -a named.localhost /var/named/huazi.com.zone
# vim huazi.com.zone
https://i-blog.csdnimg.cn/direct/18e06adc42354438b5632531ea73b716.png
# systemctl start named
# dig www.huazi.com @172.25.254.20
https://i-blog.csdnimg.cn/direct/340ddca6f802451a97cfffb3683fb10a.png
nginx配置
[*]udp和tcp的负载平衡要写在http块之外
#修改主配置文件
# vim /usr/local/nginx/conf/nginx.conf
https://i-blog.csdnimg.cn/direct/8c8397834bcd42b3af0899c751a6fdf6.png
# mkdir -p /usr/local/nginx/tcpconf.d/
# vim /usr/local/nginx/tcpconf.d/dns.conf
stream {
upstream dns {
server 172.25.254.10:53 fail_timeout=15s max_fails=3;
server 172.25.254.20:53 fail_timeout=15s max_fails=3;
}
server {
listen 53 udp reuseport;
proxy_timeout 20s;
proxy_pass dns;
}
}
# nginx -s reload
测试
https://i-blog.csdnimg.cn/direct/2057c8dcc86b49c8b794ee9505b93ec4.png
[*]100上没有dns服务,dig却可以指定到100,通过100进行代理
案例:基于tcp的MySQL的负载平衡
[*]nginx服务器:172.25.254.100 www.huazi.org
[*]MySQL1服务器:172.25.254.10
[*]MySQL2服务器:172.25.254.20
数据库配置
# yum install mariadb-server -y
# yum install mariadb-server -y
# vim /etc/my.cnf.d/mariadb-server.cnf
https://i-blog.csdnimg.cn/direct/8c2f3951340448cf98b7578b8262df27.png
# vim /etc/my.cnf.d/mariadb-server.cnf
https://i-blog.csdnimg.cn/direct/e27cc8e173144f27bc984af84ac7e8f7.png
https://i-blog.csdnimg.cn/direct/4a9fd3c1932b4485bb5a869337ac05f2.png
https://i-blog.csdnimg.cn/direct/de1de669cb4e41148faaf085bc0034dd.png
nginx配置
# vim /usr/local/nginx/tcpconf.d/dns.conf
https://i-blog.csdnimg.cn/direct/b649f1f4d5c04cc68eb385c4a5452cef.png
# nginx -s reload
[*]下载MySQL的客户端
# yum install mariadb -y
测试
https://i-blog.csdnimg.cn/direct/a41e6365f39c44e2a98cb6b0eddffcfb.png
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]