道者编程

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。


最新评论:
3楼 广东省深圳市 电信 发表于 2018-08-24 17:50:54
666
2楼 广东省深圳市 电信 发表于 2021-11-05 10:15:43
so fuck
共有 2 条记录  首页 上一页 下一页 尾页 1
我要评论:

看不清楚