一、nginx反向署理
1、什么是署理服务器?
署理服务器,客户机在发送请求时,不会直接发送给目的主机,而是先发送给署理服务器,署理服务继承客户机请求之后,再向主机发出,并接收目的主机返回的数据,存放在署理服务器的硬盘中,再发送给客户机。
2、为什么要用署理服务器?
进步访问速度:由于目标主机返回的数据会存放在署理服务器的硬盘中,因此下一次客户再访问雷同的站点数据时,会直接从署理服务器的硬盘中读取,起到了缓存的作用,尤其对于热门站点能显着进步请求速度。
防火墙作用:由于全部的客户机请求都必须通过署理服务器访问远程站点,因此可在署理服务器上设限,过滤某些不安全信息。
通过署理服务器访问不能访问的目标站点:互联网上有很多开发的署理服务器,客户机在访问受限时,可通过不受限的署理服务器访问目标站点。
3、反向署理 VS 正向署理
正向署理:正向署理,架设在客户机与目标主机之间,只用于署理内部网络对Internet的连接请求,客户机必须指定署理服务器,并将原来要直接发送到Web服务器上的http请求发送到署理服务器中。
反向署理:反向署理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端。
4、nginx正向署理实战
由于于nginx正向署理的功能指令较少,只必要举行简单的配置即可:
- server {
- resolver 114.114.114.114; #指定DNS服务器IP地址
- listen 8080;
- location / {
- proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
- }
- }
复制代码 以上的配置只能访问80 端口的网站,而不能访问https443端口的网站,现在的网站基本上都是https的要解决技能访问
http80端口也能访问https443端口的网站,必要置两个SERVER节点,一个处置惩罚HTTP转发,另一个处置惩罚HTTPS转发,而客户端都通过HTTP来访问署理,通过访问署理差异的端口,来区分HTTP和HTTPS请求。
由于原生 nginx 只支持 http 正向署理,为了 nginx 支持 https 正向署理,可以打ngx_http_proxy_connect_module 补丁+ ssl 模块支持。
这里必要重新编译 nginx,必要检察当前 nginx 的版本和编译选项,然后去官网下载同版本的 nginx 源码举行重新编译: - /usr/local/nginx/sbin/nginx -V
- wget http://nginx.org/download/nginx-1.15.12.tar.gz
- tar -zxvf nginx-1.15.12.tar.gz
复制代码 下载模块 ngx_http_proxy_connect_module:
- git clone https://github.com/chobits/ngx_http_proxy_connect_module
复制代码 打补丁,对 nginx 源码修改,这一步很紧张,否则后面的 make 过不去: - patch -d /root/nginx-1.15.12/ -p 1 <
- /root/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite
复制代码 在原有配置后追加模块make 后注意不要 install: - cd /root/nginx-1.15.12/
- ./configure --with-http_stub_status_module --with-http_ssl_module --with-fileaio --with-http_realip_module --add-module=/root/ngx_http_proxy_connect_module/
- make
- mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
- cp /root/nginx-1.15.12/objs/nginx /usr/local/nginx/sbin/
复制代码 配置文件如下,然后启动服务: - # 正向代理上网
- server {
- listen 38080;
- # 解析域名
- resolver 8.8.8.8;
- # ngx_http_proxy_connect_module
- proxy_connect;
- proxy_connect_allow 443 563;
- proxy_connect_connect_timeout 10s;
- proxy_connect_read_timeout 10s;
- proxy_connect_send_timeout 10s;
- location / {
- proxy_pass $scheme://$http_host$request_uri;
- }
- }
复制代码 5、nginx反向署理实战
现在很多大型web网站都用到反向署理。除了可以防止外网对内网服务器的恶性攻击、缓存以淘汰服务器的压力和访问安全控制之外,还可以举行负载均衡,将用户请求分配给多个服务器。 情况准备: HOSTNAME | IP | 阐明 | lb01 | 192.168.150.11 | ngginx主负载均衡器 | lb02 | 192.168.150.12 | nginx副负载均衡器 | web01 | 192.168.150.13 | web01服务器 | web02 | 192.168.150.14 | web02服务器 | (1)配置假造主机
在两台web服务器上:
- # cd /etc/nginx/conf.d/
- # mv default.conf{,.bak}
- # cat vhost.conf
- server {
- listen 80;
- server_name bbs.yunjisuan.com;
- location / {
- root /usr/share/nginx/html/bbs;
- index index.html index.htm;
- }
- access_log /usr/share/nginx/html/bbs/logs/access_bbs.log main;
- }
- server {
- listen 80;
- server_name www.yunjisuan.com;
- location / {
- root /usr/share/nginx/html/www;
- index index.html index.htm;
- }
- access_log /usr/share/nginx/html/www/logs/access_www.log main;
- }
复制代码 (2)准备测试页面
在两台web服务器上:
- mkdir -p /usr/share/nginx/html/{www,bbs}/logs
- echo "`hostname -I `www" > /usr/share/nginx/html/www/index.html
- echo "`hostname -I `bbs" > /usr/share/nginx/html/bbs/index.html
复制代码 (3)启动服务测试
- [root@lb01 ~]# curl -H host:bbs.yunjisuan.com 192.168.150.13
- 192.168.150.13 bbs
- [root@lb01 ~]# curl -H host:bbs.yunjisuan.com 192.168.150.14
- 192.168.150.14 bbs
- [root@lb01 ~]# curl -H host:www.yunjisuan.com 192.168.150.13
- 192.168.150.13 www
- [root@lb01 ~]# curl -H host:www.yunjisuan.com 192.168.150.14
- 192.168.150.14 www
复制代码 二、nginx负载均衡
搭建负载均衡服务的需求如下:
1 ) 把单台盘算机无法承受的大规模并发访问或数据流量分担到多台节点设备上,分别举行处置惩罚, 淘汰用户等待相应的时间, 提拔用户体验。
2 ) 单个重负载的运算分担到多台节点设备上做并行处置惩罚, 每个节点设备处置惩罚竣事后, 将结果汇总, 返回给用户, 体系处置惩罚能力得到大幅度进步。
3 ) 7 x 24 小时的服务保证, 任意一个或多个有限后面节点设备宕机, 不能影响业务。在负载均衡集群中, 同组集群的全部盘算机节点都应该提供雷同的服务。 集群负载均衡器会截获全部对该服务的入站请求。 然后将这些请求尽大概地均匀地分配在全部集群节点上。
实现 Nginx 负载均衡的组件阐明
Nginx http 功能模块 | 模块阐明 | ngx_http_proxy_module | proxy 署理模块, 用于把请求后拋给服务器节点或 upstream 服务器池 | ngx_http_upstream_module | 负载均衡模块, 可以实现网站的负载均衡功能及节点的康健检査 | 配置简单的负载均衡:
在lb01上:
- upstream www_server_pools {
- server 192.168.150.13:80 weight=1;
- server 192.168.150.14:80 weight=1;
- }
- server {
- listen 80;
- #server_name localhost;
- server_name www.yunjisuan.com;
- #charset koi8-r;
- #access_log /var/log/nginx/log/host.access.log main;
- location / {
- # root /usr/share/nginx/html;
- # index index.html index.htm;
- # 访问www.yunjisuan.com,请求发送给www_server_pools里面的节点
- proxy_pass http://www_server_pools;
- }
- }
- #这里定义Web服务器池,包含了13,14两个Web节点
复制代码 重启服务: - [root@lb01 ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb01 ~]# systemctl restart nginx
复制代码 配置hosts解析并测试:
- [root@lb01 ~]# tail -1 /etc/hosts
- 192.168.150.11 www.yunjisuan.com
- [root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://www.yunjisuan.com; done
- 192.168.150.13 bbs
- 192.168.150.14 bbs
- 192.168.150.13 bbs
- 192.168.150.14 bbs
复制代码 可以看到按照轮询的算法依次访问后端web服务器,但测试结果是bbs页面,而不是www,必要通过proxy_set_header Host $host解决,在后面有先容到。
1、Nginx upstream模块
Nginx的负载均衡功能依靠于ngx_http_upsteam_module模块,所支持的署理方式包括 proxy_pass,fastcgi_pass,memcached_pass等,新版Nginx软件支持的方式有所增长。这里重要讲解proxy_pass署理方式。
ngx_http_upstream_module模块允许Nginx定义一组或多组节点服务器组,利用时可以通过proxy_pass署理方式把网站的请求发送到事先定义好的对应Upstream组的名字上,具体写法为“proxy_pass http:// www_server_pools”,其中www_server_pools就是一个Upstream节点服务器组名字。ngx_http_upstream_module模块官方地点为:http://nginx.org/en/docs/http/ngx_http_upstream_module.html。
示例1:基本的upstream配置案例
- upstream www_server_pools {
- #upstream是关键字必须有,后面的www_server_pools为一个Upstream集群组的名字,可以自己起名,
- 调用时就用这个名字
- server 192.168.0.223:80 weight=5;
- server 192.168.0.224:80 weight=10;
- server 192.168.0.225:80 weight=15;
- #server关键字是固定的,后面可以接域名(门户会用)或IP。如果不指定端口,默认是80端口。weight代表权重,数值越大被分配的请求越多,结尾有分号。
- }
复制代码 示例2:较完整的upstream配置案例
- upstream www_server_pools {
- server 192.168.0.223; #这行标签和下行是等价的
- server 192.168.0.224:80 weight=1 max_fails=1 fail_timeout=10s; #这行标签和上一行是等价的,此行多余的部分就是默认配置,不写也可以。
- server 192.168.0.225:80 weight=1 max_fails=2 fail_timeout=20s backup;
- # server最后面可以加很多参数,具体参数作用看下文的表格
- }
复制代码 示例3:利用域名及socket的upstream配置案例
- upstream backend {
- server backend1.example.com weight=5;
- server backend2.example.com:8080; #域名加端口。转发到后端的指定端口上
- server unix:/tmp/backend3; #指定socket文件
- #提示:server后面如果接域名,需要内网有DNS服务器或者在负载均衡器的hosts文件做域名解析。
- server 192.168.0.223;
- server 192.168.0.224:8080;
- server backup1.example.com:8080 backup;
- #备份服务器,等上面指定的服务器都不可访问的时候会启动,backup的用法和Haproxy中用法一样
- server backup2.example.com:8080 backup;
- }
复制代码 upstream参数:
模块内参数 | 参数阐明 | server 10.0.10.8:80 | 负载均衡后面的RS配置,可以是IP或域名,如果端口不写,默认是80端口。高并发场景下, IP可换成域名,通过 DNS做负载均衡。 | weigth=1 | 代表服务器的权重,默认值是1。权重数字越大表示继承的请求比例越大。 | max_fails=3 | Nginx尝试连接后端主机失败的次数,这个值是共同proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream 这三个参数来利用的。当nginx接收后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503、 Max_fails的默认值是1 ;企业场景下建议2-3次。如京东1次,蓝汛10次,根据业务需求去配置 | fail_timeout=10s | 在max_fails定义的失败次数后,距离下次查抄的间隔时间,默认是10s ;如果max_fails是5 ,它就检测5次,如果5次都是502,那么,它就会根据fail_timeout的值,等待10s再去查抄,还是只查抄一次,如果一连502,在不重新加载 Nginx配置的情况下,每隔10s都只查抄一次。常规业务2~3秒比力公道,比如京东3秒,蓝汛3秒,可根据业务需求去配置 | backup | 热备配置(RS节点的高可用),当前面激活的RS都失败后会主动启用热备RS这标志看这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求。注意:当负载调理算法为ip_hash时,后端服务器在负载均衡调理中的状态不能是weight和backup。 | down | 这标志着服务器永远不可用,这个参数可共同ip_hash利用;雷同与解释。 | 模块调理算法:
调理算法一样平常分为两类: 第一类为静态调理算法,即负载均衡器根据自身设定的规则举行分配,不必要思量后端节点服务器的情况,例如:rr,wrr,ip_hash等都属于静态调理算法。 第二类为动态调理算法,即负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先得到请求,相应时间短的优先得到请求。例如:least_conn,fair等都属于动态调理算法。
常用调动算法:
1.定义轮询调理算法-rr-默认调理算法
2.定义权重调理算法-wrr 3.定义静态调理算法-ip_hash(该调理算法可以解决动态网页的session共享问题) 4.定义最小的连接数-least_conn
2、http_proxy_module模块
proxy_pass指令属于ngx_http_proxy_module模块,此模块可以将请求转发到另一台服务器,在实际的反向署理工作中,会通过location功能匹配指定的URI,然后把接收到的符合匹配URI的请求通过proxy_pass抛给定义好的upstream节点池。该指令官方地点:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
示例1:将匹配URI为name的请求抛给http://127.0.0.1/remote/.
- location /name/ {
- proxy_pass http://127.0.0.1/remote/;
- }
复制代码 示例2:将匹配URI为some/path的请求抛给http://127.0.0.1
- location /some/path/ {
- proxy_pass http://127.0.0.1;
- }
复制代码 示例3:将匹配URI为name的请求应用指定的rewrite规则,然后抛给http://127.0.0.1
- location /name/ {
- rewrite /name/( [^/]+ ) /username=$1 break;
- proxy_pass http://127.0.0.1;
- }
复制代码 nginx负载均衡相干紧张参数:
Nginx 反向署理重 要参敎 | 解释阐明 | proxy_pass http://server_pools; | 通过proxy_pass功能把用户的清求转向到反向署理定义的upstream服务器池 | proxy_set_header Host $host | 在署理向后端服务器发送的 http请求头中参加 host字段信息,用于当后端服务器配置有多个假造主机时,可以识别署理的是哪个假造主机。这是节点服务器多假造主机时的关键配置 | proxy_set_header X-Forwarded-For $remote_addr; | 在署理向后端服务器发送的 http请求头中参加 X-Forward-For字段信息,用于后端服务器程序、日志等接收记录真实用户的 IP ,而不是署理服务器的IP这是反向署理时,节点服务器获取用户真实 IP的必要功能配置 | http proxy 模块相干参数阐明:
http proxy 模块相干参数 | 阐明 | proxy_set_header | 设置http请求header项传给后端服务器节点,例如:可实现让署理后端的服务器节点获取访问客户端用户的真实IP地点 | client_body_buffer_size | 用于指定客户端请求主体缓冲区大小 | proxy_connect_timeout | 表示反向署理后端节点服务器连接的超时时间,即发起握手等候相应的超时时间 | proxy_send_timeout | 表示署理后端服务器的数据回传时间,即在规定时间内后端服务器必须传完全部数据,否则nginx将断开这个连接 | proxy_read_timeout | 设置nginx从署理的后端服务器获取信息的时间,表示连接建立乐成后,nginx等待后端服务器的相应时间,实在是nginx已经进入后端的排队之中等候处置惩罚的时间 | proxy_buffer_size | 设置缓冲区大小,默认该缓冲区大小即是指令proxy_buffers设置的大小 | proxy_buffers | 设置缓冲区的数目和大小,nginx从署理的后端服务器获取的相应信息,会设置到缓冲区 | proxy_busy_buffers_size | 用于设置雷同很忙时可以利用的proxy_buffers大小,官方保举的大小为 proxy_buffers * 2 | proxy_trmp_file_write_size 指 | 指定proxy缓存临时文件的大小 | 三、nginx反向署理负载均衡案例
1、反向署理多假造主机节点服务器企业案例
proxy_set_header host $host; 在署理向后端服务器发送的http请求头中参加host字段信息后,若后端服务器配置有多个假造主机,它就可以识别署理的是哪个假造主机。 - [root@lb01 ~]# cat /etc/nginx/conf.d/vhost.conf
- server {
- listen 80;
- server_name www.yunjisuan.com;
- location / {
- proxy_pass http://www_server_pools;
- proxy_set_header Host $host;
- }
- }
- server {
- listen 80;
- server_name bbs.yunjisuan.com;
- location / {
- proxy_pass http://www_server_pools;
- proxy_set_header Host $host;
- }
- }
复制代码 重启署理测试:
- [root@lb01 ~]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- [root@lb01 ~]# systemctl restart nginx[root@lb01 ~]# tail -1 /etc/hosts192.168.150.11 www.yunjisuan.com bbs.yunjisuan.com[root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://bbs.yunjisuan.com; done192.168.150.14 bbs192.168.150.13 bbs192.168.150.14 bbs192.168.150.13 bbs[root@lb01 ~]# for ((i=1;i<=4;i++)); do curl http://www.yunjisuan.com; done192.168.150.14 www192.168.150.13 www192.168.150.14 www192.168.150.13 www
复制代码 2、经过反向署理后的节点服务器记录用户IP企业案例
Web01节点服务器对应的WWW假造主机的访问日志的第一个字段记录的并不是客户端的IP而是反向署理服务器本身的IP(192.168.150.1),最后一个字段也是一个“-”,那么怎样解决这个问题?实在很简单,同样是增长一行参数:proxy_set_header X-Forwarded-For $remote_addr;
3、根据URL中的目录地点实现署理转发案例
通过Nginx实现动静分离,即通过Nginx反向署理配置规则实现让动态资源和静态资源及其他业务分别由差异的服务器解析,以解决网站性能,安全,用户体验等紧张问题。
下图为企业常见的动静分离集群架构图,此架构图得当网站前端只利用同一个域名提供服务的场景,例如,用户访问的域名是www.yunjisuan.com,然后,当用户请求www.yunjisuan.com/upload/xx地点时候,代分析分配请求到上传服务器池处置惩罚数据;当用户请求www.yunjisuan.com/static/xx地点的时候,代分析分配请求到静态服务器池请求数据;当用户请求www.yunjisuan.com/xx地点的时候,即不包含上述指定的目录地点路径时,代分析分配请求到默认的动态服务器池请求数据(注意:上面的xx表示任意路径)。
当用户请求www.yunjisuan.com/upload/xx地点时,实现由upload上传服务器池处置惩罚请求。当用户请求www.yunjisuan.com/static/xx地点时,实现由静态服务器池处置惩罚请求。除此以外,对于其他访问请求,全都由默认的动态服务器池处置惩罚请求。
upstream模块服务器池的配置:
- #static_pools为静态服务器池,有一个服务器,地址为192.168.150.13,端口为80.
- upstream static_pools {
- server 192.168.150.13:80 weght=1;
- }
- #upload_pools为上传服务器池,有一个服务器地址为192.168.150.14,端口为80.
- upstream upload_pools {
- server 192.168.150.14:80 weight=1;
- }
- #default_pools为默认的服务器池,即动态服务器池,有一个服务器,地址为192.168.150.15,端口为80.
- upstream default_pools {
- server 192.168.150.15:80 weight=1;
- }
- #提示:需要增加一台测试Web节点Web03(ip:192.168.150.15),配置与Web01,Web02一样。
复制代码 以location方案实现,将符合static的请求交给静态服务器池static_pools,配置如下:
- location /static/ {
- proxy_pass http://static_pools;
- proxy_set_header X-Forwarded-For $remote_addr;
- }
- #将符合upload的请求交给上传服务器池upload_pools,配置如下:
- location /upload/ {
- proxy_pass http://upload_pools;
- proxy_set_header X-Forwarded-For $remote_addr;
- }
- #不符合上述规则的请求,默认全部交给动态服务器池default_pools,配置如下:
- location / {
- proxy_pass http://default_pools;
- proxy_set_header X-Forwarded-For $remote_addr;
- }
复制代码 准备测试数据:
- [root@web01 ~]# cd /usr/share/nginx/html/
- [root@web01 html]# mkdir static
- [root@web01 html]# echo "static_pools" >> static/index.html
- [root@web02 ~]# cd /usr/share/nginx/html/
- [root@web02 html]# mkdir upload
- [root@web02 html]# echo "upload_pools" >> upload/index.html
- [root@web03 ~]# cd /usr/share/nginx/html/
- [root@web03 html]# echo "default_pools" >> index.html
复制代码 测试:
- [root@lb02 ~]# tail -1 /etc/hosts
- 192.168.150.11 www.yunjisuan.com
- [root@lb02 ~]# curl http://www.yunjisuan.com/upload/
- upload_pools
- [root@lb02 ~]# curl http://www.yunjisuan.com/static/
- static_pools
- [root@lb02 ~]# curl http://www.yunjisuan.com/
- default_pools
复制代码 根据URL目录地点转发的应用场景:
根据HTTP的URL举行转发的应用情况,被称为第7层(应用层)的负载均衡,而LVS的负载均衡一样平常用于TCP等的转发,因此被称为第4层(传输层)的负载均衡。
在企业中,偶尔盼望只用一个域名对外提供服务,不盼望利用多个域名对应同一个产物业务,此时就必要在署理服务器上通过配置规则,使得匹配差异规则的请求会交给差异的服务器池处置惩罚。 业务的域名没有拆分或者不盼望拆分,但盼望实现动静分离,多业务分离,差异的客户端设备(例如:手机和PC端)利用同一个域名访问同一个业务网站,就必要根据规则将差异设备的用户请求交给后端差异的服务器处置惩罚,以便得到最佳用户体验。
4、根据客户端的设备(user_agent)转发
在企业中,为了让差异的客户端设备用户访问有更好的体验,必要在后端架设差异服务器来满足差异的客户端访问,例如:移动客户端访问网站,就必要部署单独的移动服务器及程序,体验才能更好,而且移动端还分苹果,安卓,Ipad等,在传统的情况下,一样平常用下面的办法解决这个问题。
利用之前的情况:
- location / {
- if ($http_user_agent ~* "MSIE")
- #如果请求的浏览器为微软IE浏览器(MSIE),则让请求由static_pools池处理
- {
- proxy_pass http://static_pools;
- }
- if ($http_user_agent ~* "Chrome")
- #如果请求的浏览器为谷歌浏览器(Chrome),则让请求由upload_pools池处理
- {
- proxy_pass http://upload_pools;
- }
- proxy_pass http://default_pools;
- proxy_set_header Host $host;
- #其他客户端,由default_pools处理
- }
复制代码 测试:curl -A 指定访问范例
- [root@lb01 conf.d]# curl -A MSIE -H host:www.yunjisuan.com 192.168.150.11
- 192.168.150.13 www
- [root@lb01 conf.d]# curl -A Chrome -H host:www.yunjisuan.com 192.168.150.11
- 192.168.150.14 www
- [root@lb01 conf.d]# curl -A xxx -H host:www.yunjisuan.com 192.168.150.11
- default_pools
复制代码 5、根据扩展名转发的应用场景
可根据扩展名实现资源的动静分离访问,如图片,视频等请求静态服务器池,PHP,JSP等请求动态服务器池。 - location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
- proxy_pass http://static_pools;
- include proxy.conf;
- }
- location ~ .*\.(php|php3|php5)$ {
- proxy_pass http://dynamic_pools;
- include proxy.conf
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |