nginx 正向代理、反向代理和负载均衡
一:介绍
关于什么是正向代理、反向代理,网上概念一大把,这里用比较通俗的语言描述下。
1:正向代理
内网服务器A访问不了外网,但可以访问B服务器,而B服务器可以访问外网;那么就可以在B服务器上配置代理,使内网服务器A通过B服务器访问外网。流程:A——》B(代理)——》外网。
一般用于企业访问外网,比如公司穷、或者出于保密,你们开发这般人电脑不能直接连接外网;或者访问海那边的网站。
特点:客户端需要配置,你知道你在访问什么,只是你访问是通过你配置的这台服务器转的,对客户端是透明的
2:反向代理
外网要访问内网A,但是A服务器不在公网之中,直接访问不了,但是B服务器在公网之中,且B服务器可以访问内网A,那么在B服务器上配置一个代理,使得所有外网请求通过B服务器访问A。流程:外网——》B(代理)——》A
一般用于网站架构,比如负载均衡
特点:客户端不需要配置,具体访问谁,是由代理分发的,对客户端来说并不透明。
二:正向代理
1:nginx配置
配置很简单,增加一个server,几个简单的配置撸进去即可,其他还有一些配置,但不是必须的
server { resolver 8.8.8.8; #dns解析resolver listen 8088; #代理端口 location / { proxy_pass $scheme://$host$request_uri; #代理指令 } }设置完后,重启nginx,如果有防火墙,记得开启8088端口号
2:测试
谷歌浏览器,设置——高级设置——打开代理设置
用伟大的PHP输出一下访问IP,这里输出的正是代理服务器的IP,说明配置正确。
再访问一下百度,靠,访问不了,什么原因?原来百度是https,据说nginx正向代理不支持https,需要巧妙转一下,这里不搞了,有知道的请告诉我。
另外正向代理还是推荐 Squid,这货专门干这个事的,点击:centos7配置Squid
三:反向代理
1:配置
nginx配置通过proxy_pass,我在192.168.0.25上配置
server { listen 8090; location / { proxy_pass http://192.168.0.23; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
上面的意思是,访问http://192.168.0.25:8090/ nginx 把http://192.168.0.23页面给取出来。
这里有三个参数讲解一下:
# Host:Host:是请求资源,比如你访问百度,Host:www.baidu.com,这个设置是把原http请求的Header中的Host字段带过来传给转发中, proxy_set_header Host $host; # X-Real-IP,一般只记录真实发出请求的客户端IP,但是该变量可以覆盖,所以只在第一层设置,防止被覆盖 proxy_set_header X-Real-IP $remote_addr; # X-Forwarded-For,会记录所有的IP,比如客户端的,DNS转发的等等,逗号分隔,不过一般情况下CDN服务商为了自身安全考虑会将这个信息做些改动,只保留客户端IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 后端取IP: 1:先获取 X-Real-IP 2:如果获取不到 X-Real-IP,通过 X-Forwarded-For 取 3:如果再取不到,就直接取 remote_addr
访问成功!
proxy_pass配置很多,其他配置建议查看一下手册
四:负载均衡
简单配置:
Nginx负载均衡服务器 192.168.0.25:9080
后端服务器01 192.168.0.23
后端服务器02 192.168.0.12
通过设置upstream和proxy_pass,upstream定义web服务器池,也就是节点;proxy_pass转发请求。
1:upstream 设置,upstream 常见请求方式
(1):轮询
按照请求时间逐一分配
upstream dev_server_pools{ server 192.168.0.23 server 192.168.0.12 }
dev_server_pools:这个名称是自己命名的
(2):weight权重
按照weight设置比例分配
upstream dev_server_pools{ server 192.168.0.23 weight=6; server 192.168.0.12 weight=4; }
weight:权重,权重越高,访问概率越大,比如上面23服务器有60%的访问概率,12服务器有40%的访问概率
(3):ip_hash
如果一个用户登录的时候在A服务器,下一个请求又在B服务器,这会造成session跨域问题。为了解决这个问题,可以通过ip_hash设置,保证一个用户后续访问固定在某个服务器。
upstream dev_server_pools{ ip_hash; server 192.168.0.23; server 192.168.0.12; }除了用这种方式解决session外,也可以通过把session放到memcache中,或者用nfs
(4):fair,按照节点响应时间分配,响应时间短的优先分配
upstream dev_server_pools{ server 192.168.0.23; server 192.168.0.12; fair; }2:实例
upstream dev_server_pools{ #web服务器池 server 192.168.0.23 weight=1; #后台节点 server 192.168.0.12 weight=1; #后台节点 } server{ listen 8090; #端口 server_name 192.168.0.25:8090; #负载均衡服务器,该配置就在这台服务器 location /{ proxy_pass http://dev_server_pools; #请求web服务器池 } }
注意:upstream在nginx的http模块里面配置,如:
:
2:测试:
1:浏览器打开192.168.0.25:8090,多刷新几次,看是否在切换。
2:把某个服务器nginx停掉,看是否还能正常访问。
这只是基本的配置,nginx配置文件还可以配置一些优化。其他方面,比如文件、程序同步可以使用rsync,文件共享可以用NFS。