Nginx搭建反向代理服务器

news/2024/10/18 18:29:16/

前面学了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=10ginactive=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 访问服务器,发现数据没有更新,服务器返回此状态码。然后从缓存中读取数据。

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


http://www.ppmy.cn/news/248264.html

相关文章

魔兽世界台服被大陆玩家挤爆

据台湾媒体消息,由于《魔兽世界》大陆代理权更迭带来用户担忧、九城关停服务器等多重因素影响,众多大陆玩家涌入台服,这也引起了台湾玩家的抗议。 近日,台湾玩家聚集在官方论坛发泄自己的不满,许多玩家表示&#xff0c…

理性讨论,4年经验,面试要20K很高吗?....

普通二本,4年多测试工作经验,现在依然在测试岗位,只是时间长了和一些个人原因有跳槽的想法,懂python,会写脚本,会selenium,会性能,本来信心满满的,像这样优秀的人找份高薪…

Chrome驱动安装问题

1、org.openqa.selenium.WebDriverException: unknown error: call function result missing value 原因:浏览器版本与驱动版本不一致 http://npm.taobao.org/mirrors/chromedriver/ 2、org.openqa.selenium.WebDriverException: unknown error: cannot find Chrome…

Vue实践TS中的一些常见错误解决方案

Vue实践TS中的一些常见错误解决方案 参考文章: (1)Vue实践TS中的一些常见错误解决方案 (2)https://www.cnblogs.com/sefaultment/p/10244685.html 备忘一下。

MPQ8873电源芯片配置

芯片就不介绍了,直接通过I2C配置寄存器。需要注意的是I2C时序,当时以为I2C的时钟只要小于400KHZ就行。。。。我使用的I2C的代码SCL的时钟高电平与低电平持续时间是对半分的,但是该芯片的I2C的SCL要求了高电平与低电平的时序关系。。 如上图所…

hive客户端无法进入(Cannot create directory /tmp/hive/root/a0ec1f00-cd32-41ef-814d-b6aa3d669d77)

项目场景: 客户端启动hive 问题描述: 启动HA后服务端可以启动metastore,客户端启动hive报错:Cannot create directory /tmp/hive/root/a0ec1f00-cd32-41ef-814d-b6aa3d669d77. Name node is in safe mode. 原因分析&#xff1a…

Android 使用本地Gradle

先去下载好 Gradle Distributions 放到 C:/Users/Administrator/.gradle/wrapper/dists/gradle-6.9-bin.zip 然后studio的gradle.properties 改 distributionUrlfile:///C:/Users/Administrator/.gradle/wrapper/dists/gradle-6.9-bin.zip

没法绑定浮动ip

floating IP 能够让外网直接访问租户网络中的 instance。这是通过在 router 上应用 iptalbes 的 NAT 规则实现的。 floating IP 是配置在 router 的外网 interface 上的,而非 instance,这一点需要特别注意。 1、controller控制节点 # cd /etc/sysconfig/…