Nginx搭建反向代理服务器

前面学了web资源服务器的搭建,这篇博文就总结一下如何搭建反向代理服务器。

为什么需要反向代理

反向代理是实现负载均衡的一种方法。假设,很多人同时对订单进行支付,此时,用于支付服务的上游服务器挂掉了,用户就没有办法完成支付服务。用户因为体验感不好的原因,就会选择别的电商平台了。
此时,如果使用Nginx做反向代理,实现水平扩展。然后缓存所有的支付请求,接着使用负载均衡算法,分别将请求转发到正常的服务器,这样,就能保证支付服务的可用性,就不会出现服务挂掉的情况。当然,还有其他方式阻止服务器挂掉,这里就以反向代理为例。

说了这么多,那么什么是反向代理呢?它有什么用呢?这里推荐一篇微信公众号的文章《如何给女朋友解释什么是反向代理?》

作者:漫画编程
链接:https://mp.weixin.qq.com/s/T7vd5heXXUjnbV-1wHg8xg

Nginx搭建反向代理服务器

上游服务器

将上篇博文搭建的Nginx服务器作为上游服务。需要修改其配置。

在监听的8080端口加上127.0.0.1。这表示只能本机的进程来访问打开的8080端口。
然后停止服务,重新启动

./sbin/nginx -s stop  # 停止nginx服务

此时访问Nginx服务器,就会显示无法访问了。

反向代理服务器

重新编译一个新的Nginx服务器作为反向代理服务器。至于编译,可以参考第一篇博文。
新的Nginx服务器编译好之后,就需要对配置文件进行修改。

当然,最先配置的就是监听端口了,因为作为反向代理服务器,这里就开放80端口。
接着就需要配置图中第一个矩形框中的内容了。
upstream:使Nginx跨越单机的限制,完成网络数据的接收、处理和转发。
这里填的是上游服务的地址,如果有很多台上游服务器,可以依次放在里面。

扩展一下Nginx的upstream的五种分配方式:

  1. 轮询
upstream local {
    server 192.168.1.100:8080;
    server 192.168.1.200:8080;
}

这是upstream默认的分配方式,将请求轮流分配到不同的服务器上。

  1. 权重
upstream local {
    server 192.168.1.100 weight=3;
    server 192.168.1.200 weight=1;
}

权重比例大的服务器,接受的请求就多。

  1. ip_hash
upstream local {
    ip_hash;
    server 192.168.1.100:8080;
    server 192.168.1.200:8080;
}

每个请求按照访问ip的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。

  1. fair
upstream local {
    server 192.168.1.100:8080;
    server 192.168.1.200:8080;
    fair;
}

按照响应时间短的原则进行服务器的分配。

  1. url_hash
upstream local {
    server 192.168.1.100:8080;
    server 192.168.1.200:8080;
    hash $request_uri;
    hash_method crc32;
}

按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景。

讲完了第一个部分的配置,接下来就讲第二个矩形框的配置。


proxy_set_header:是Nginx的一个模块。主要作用是,允许重新定义或添加字段传递给代理服务器的请求头。
                —— Host $host:$host是直接引用了Nginx的变量,Host是一个变量名。
                —— X-Real-IP $remote_addr:设置$remote_addr这个变量,可以让Nginx获得用户的真实ip,X-Real-IP同样是变量名。
                —— X-Forwarded-For $proxy_add_x_forwarded_for:这个我也是脑瓜有点疼,没太搞懂。
                
proxy_pass http://local; 这个配置表示,设置后端代理服务器的地址。这里的local是上面upstream指令块的别名,即引用upstream指令块的地址。

反向代理的配置就讲完了,下面就可以启动代理服务器进行访问了。当我把上游服务器关掉后,再访问,就会报502,无效网关的错误。其实Nginx还支持缓存这一特性。可以将上游服务器返回的内容缓存指定的时间。即使上游服务器挂掉。Nginx的代理服务器依然可以返回响应结果。

具有缓存作用的反向代理服务器

在上面配置的基础上,新增缓存功能。首先在http指令块下新增以下指令

proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g
                 inactive=60m use_temp_path=off;

# /tmp/nginxcache:表示将Nginx缓存到哪个目录下(首先使用mkdir创建这个文件夹,这个位置是可以指定的)。
# levels:默认所有缓存文件都放在上面指定的根路径中,从而可能影响缓存的性能。推荐指定为2级目录来存储缓存文件。
# key_zone:用于在共享内存中定义一块存储区域来存放缓存的key和metadata。
# max_size:最大的cache空间。
# inactive:内存中缓存的过期检查周期。
# use_temp_path:如果为off,则Nginx会将缓存文件直接写入指定的cache文件中,而不使用temp_path指定的临时存储路径。 


设置完了,还要在需要做缓存的url路径下添加以下指令。

proxy_cache my_cache;   # my_cache指上面开辟的共享内存。
proxy_cache_key $host$uri$is_args$args;  # 增加设置web缓存的key值,指明哪个用户,哪个资源,哪些参数。
proxy_cache_valid 200 304 302 1d;  # 对指定的HTTP状态进行缓存,并指定缓存时间。

下图基本上是反向代理和缓存所需的所有配置。

然后就启动上游服务器,再启动具有缓存的反向代理服务器。最后停掉上游服务器,看是否能够正常得到返回结果。
经本人测试,停掉上游服务器,并不会像之前报502错误,而是会显示返回结果。同时,查看谷歌浏览器的控制台,会显示下面的情况。

根据英语单词的意思可知,来自于缓存,详细解释如下。

200 from memory cache 不访问服务器,直接读缓存,从内存中读取缓存。此时的数据是缓存到内存中的。
200 from disk cache 不访问服务器,直接读缓存,从磁盘中读取缓存。
304 Not Modified 访问服务器,发现数据没有更新,服务器返回此状态码。然后从缓存中读取数据。

思考时,要像一位智者;但讲话时,要像一位普通人。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值