nginx–正向代理、反向代理及负载均衡(图解+配置)

nginx–正向代理、反向代理及负载均衡(图解+配置)学习背景什么是 nginx 百度百科 Nginx enginex 是一个高性能的 HTTP 和反向代理 web 服务器 那么除了反向代理 nginx 支持正向代理 负载均衡以及基于 SSL 安全证书的 HTTPS 访问等功能特性 本文主要是介绍是 nginx 如何配置正向代理 反向代理及负载均衡 如果你自己从来没有安装过 nginx 想要先初步了解下 nginx 的基本安装及最简单的访问 可以看下我的这篇博文 nginx 如何基于 rpm 包进行离线安装及配置 Linux 进入正文 一 正向代理 1 1 什么是正向

学习背景

什么是nginx?

除了反向代理,nginx还支持正向代理负载均衡以及基于SSL安全证书的HTTPS访问等功能特性~
本文主要是介绍是如何配置nginx正向代理、反向代理及负载均衡,进入正文~

一、代理服务

什么是代理?来一张图了解下
在这里插入图片描述
代理又分为正向代理反向代理




二、正向代理

1.1 什么是正向代理?

先来看张图~
在这里插入图片描述

【再举个栗子】

某同学喜欢面向搜索引擎编程,想通过 百度搜索引擎查找一些学习资料,但是有些网站直接访问可能不太安全,会暴露自己的IP,同学比较苦恼,想着怎样才能使用百度搜索自己想要的学习资料,又不会暴露自己的IP在网站上呢?
这时我告诉该同学,我呢手上刚好有一台代理服务器,这台代理服务器通过nginx配置了正向代理转发httphttps请求,你呢,只需要在自己的Windows本地电脑的网关配置一下这台代理服务器的IP和端口号,就能正常通过代理服务器访问到百度并搜索相关的学习资料了,还不会暴露自己真实的IP~
在这里插入图片描述




同学非常兴奋,说自己了解过nginx,但是啥是正向代理啊?

正向代理,指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。
正向代理服务的特点是代理服务器 代理的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。

同学觉得有点意思,于是又问,那nginx如何实现正向代理啊?

1.2 如何实现nginx正向代理?

(1)正向代理转发https说明

在实现nginx正向代理之前,先说明一下,现在的网站基本上都是https,因此要实现nginx正向代理转发请求,除了要配置转发http80端口的请求,还有配置https443端口的请求~
正向代理转发http请求很简单,不过正向代理转发https请求稍微有一点麻烦,目前网上的教程大多都是如下这样配置的(也不知道他们验证过没。。。):
在这里插入图片描述
一开始我也像上面那样配置,虽然http请求正常转发了,但是发现https并没有转成功,而是报错HTTP/1.1 400 Bad Request~
后来才了解到,nginx官方并不支持直接转发https请求,但是阿里的一个大佬对nginx拓展了一个ngx_http_proxy_connect_module模块,并且在github上开源了 https://github.com/chobits/ngx_http_proxy_connect_module
不过维护的ngx_http_proxy_connect_module模块的补丁也是有nginx版本限制的(目前维护了1.4.x~1.19.x版本),如README.md说明:
在这里插入图片描述
如果你安装的nginx版本不在1.4.x~1.19.x这个范围内,那无法支持正向代理转发https请求。














(2)安装nginx
如果已安装nginx(可跳过),这里以1.9.2版本为例,使用root用户进行安装:

$ cd /usr/nginx $ wget http://nginx.org/download/nginx-1.9.2.tar.gz $ tar -xzvf nginx-1.9.2.tar.gz $ cd /usr/nginx/nginx-1.9.2 $ make && make install 

这里安装nginx通过install进行编译安装,编译后默认安装目录为/usr/local/nginx,后续配置新模块ngx_http_proxy_connect_module还需要重新install编译一次~

(3)下载新模块
GitHub上下载ngx_http_proxy_connect_modulezip压缩包源码:
https://github.com/chobits/ngx_http_proxy_connect_module
在这里插入图片描述






(4)解压新模块源码
将新模块ngx_http_proxy_connect_module源码压缩包上传到服务器/usr/nginx目录,并解压并重命名

$ mkdir -p /usr/nginx $ cd /usr/nginx $ /usr/nginx $ unzip ngx_http_proxy_connect_module-master.zip $ mv ngx_http_proxy_connect_module-master ngx_http_proxy_connect_module 

(5)添加新模块到nginx
使用root用户进入nginx的资源目录/usr/nginx/nginx-1.9.2,给nginx添加新模块ngx_http_proxy_connect_module和并重新编译nginx

$ /usr/nginx/nginx-1.9.2 $ patch -p1 < /usr/nginx/ngx_http_proxy_connect_module/patch/proxy_connect.patch $ ./configure --add-module=/usr/nginx/ngx_http_proxy_connect_module $ make && make install 

–说明:
这里nginx-1.9.2版本对应proxy_connect.patch补丁,其他版本相关补丁支持版本,详情见GitHub~ https://github.com/chobits/ngx_http_proxy_connect_module

使用root用户安装和编译新模块完成后,如果你希望后续不使用root用户运维,可以授权安装目录/usr/local/nginxnginx用户或者其他普通用户~

chown -R nginx:nginx /usr/local/nginx chown root:root /usr/local/nginx/sbin/nginx chmod +s /usr/local/nginx/sbin/nginx 

–说明:
二进制/usr/local/nginx/sbin/nginx文件需要重新归属为root用户,并且权限位添加s权限(权限位+s的二进制文件属于是管道文件,也就是普通用户也可执行该二进制文件,执行后产生的进程属于该文件的权限所有者,这里文件所有者是root
在这里插入图片描述




(6)修改nginx的配置
修改nginx的配置分别添加httphttpsserver,其他配置保持不变~

vi /usr/local/nginx/conf/nginx.conf 

这两个server主要配置是对DNS解析proxy_pass代理进行:

#正向代理转发http请求 server { 
    #指定DNS服务器IP地址  resolver 114.114.114.114; #监听80端口,http默认端口80 listen 80; #服务器IP或域名 server_name localhost; #正向代理转发http请求 location / { 
    proxy_pass http://$host$request_uri; proxy_set_header HOST $host; proxy_buffers 256 4k; proxy_max_temp_file_size 0k; proxy_connect_timeout 30; proxy_send_timeout 60; proxy_read_timeout 60; proxy_next_upstream error timeout invalid_header http_502; } } #正向代理转发https请求 server { 
    #指定DNS服务器IP地址  resolver 114.114.114.114; #监听443端口,https默认端口443 listen 443; #正向代理转发https请求 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 http://$host; proxy_set_header Host $host; } } 

– DNS说明:
(国内外)目前比较主流的DNS:
(国外)谷歌:8.8.8.8 developers.google.com
(国外)OpenDNS:208.67.222.222 signup.opendns.com
(国内)114:114.114.114.114 www.114dns.com
(国内)腾讯:119.29.29.29 www.dnspod.cn
(国内)阿里:223.5.5.5 alidns.com
(国内)百度:180.76.76.76 dudns.baidu.com














(7)检查和刷新nginx配置

/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload 

1.3 客户端访问(验证正向代理)

(1)客户端–Windows浏览器访问
首先在本地电脑的IE浏览器设置代理服务器和端口
IE->右上角 ->工具 ->Internet选项->连接->局域网(LAN)设置 ->配置代理IP和端口
在这里插入图片描述
浏览器访问
http://www.baidu.com/ 和https://www.baidu.com/
在这里插入图片描述












实时查看nginx日志

tail -f /usr/local/nginx/logs/access.log 

通过实时查看nginx的访问日志,可以看到Windows下设置代理IP和端口后,本地电脑访问的所有网页会通过代理服务器进行访问网页,实现了正向代理的功能,并且隐藏了用户自己真实的IP~

(2)客户端–Linux代理访问
Linux下也可以验证代理服务器是否能正常代理转发httphttps请求~

curl http://www.baidu.com/ -v -x 127.0.0.1:80 curl https://www.baidu.com/ -v -x 127.0.0.1:443 

nginx正向代理转发https成功:
在这里插入图片描述

二、反向代理

2.1 什么是反向代理?

先来一张图了解下~
在这里插入图片描述
相比于正向代理,反向代理的定义如下:




反向代理,指的是浏览器/客户端并不知道自己要访问具体哪台目标服务器,只知道去访问代理服务器代理服务器再通过反向代理 +负载均衡实现请求分发到应用服务器的一种代理服务。
反向代理服务的特点是代理服务器 代理的对象是应用服务器,也就是对于浏览器/客户端 来说应用服务器是隐藏的。

2.2 nginx实现反向代理

(1)修改nginx配置
修改nginx配置vi /usr/local/nginx/conf/nginx.confhttp模块中配置如下:
在这里插入图片描述
nginx反向代理都是结合负载均衡来实现的,这里先直接提供反向代理+负载均衡的配置,负载均衡后一章节介绍~






#反向代理+负载均衡 upstream reverseProxyServer{ 
    #负载均衡应用服务器A: 权重为10,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器 server 应用服务器A的IP:8080 weight=10 max_fails=2 fail_timeout=10s; #负载均衡应用服务器B: 代理服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器 server 应用服务器B的IP:8080 weight=5 fail_timeout=10s max_fails=2; #负载均衡应用服务器C: 代理服务器权重为5,10s内连接请求失败2次,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器 server 应用服务器C的IP:8080 weight=5 fail_timeout=10s max_fails=2; } server { 
    #监听80端口,http默认端口80 listen 80; #服务器IP或域名 server_name localhost; #反向代理请求路径中含有/appname的所有请求到upstream定义的对应反向代理模块 location /appname { 
    proxy_pass http://reverseProxyServer; } } 

(2)检查和刷新nginx配置

/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload 

(3)浏览器访问
代理服务器部署了tomcat应用,访问tomcat静态页面验证一波~
http://代理服务器IP:8080/appname/ReverseProxy1.html
在这里插入图片描述






三、负载均衡

3.1 什么是负载均衡?

再来看下前面介绍反向代理的这张图~
在这里插入图片描述
可以看到负载均衡(Load Balance)的主要作用是采用了负载均衡算法将请求分发到集群模式中的应用服务器上,这样即使某个后台应用服务器挂了,其他应用服务器还可以正常接收请求,实现了高可用,并且集群模式模式下的应用服务器支持纵向扩展,可以应对业务快速增长带来的高并发应用场景~




3.2 负载均衡算法有哪些?

负载均衡算法常用的有轮询权重ip_hash算法,默认是轮询算法~

(1)基于轮询的算法
原理是每一个请求按时间顺序逐一被分发到不同的应用服务器,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails1次),则在失效时间fail_timeout10秒)内不会再转发请求到该节点~

upstream defaultReverseProxyServer{ 
    server 192.168.0.1:8080; server 192.168.0.2:8080; } 

(2)基于权重的算法
原理是每一个请求按权重被分发到不同的应用服务器,同样,如果接收请求的应用服务器挂了,并且请求超过最大失败次数max_fails默认1次或可设置N次),则在失效时间fail_timeout默认10秒,可设置N秒)内,不会再转发请求到该节点~

upstream weightReverseProxyServer{ 
    server 192.168.0.1:8080 weight=10 max_fails=2 fail_timeout=5s; server 192.168.0.2:8080 weight=5 max_fails=2 fail_timeout=5s; } 

(3)基于ip_hash的算法
原理是每一个请求按用户访问IP的哈希结果分配,如果请求来自同一个用户IP则固定这台IP访问一台应用服务器,该算法可以有效解决动态网页中存在的session共享问题。

upstream ipHashReverseProxyServer{ 
    ip_hash; server 192.168.0.1:8080; server 192.168.0.2:8080; } 

一般使用的是基于权重的算法,因为现在很多情况下都是集群部署,而且集群下的各个服务器资源大多都是不均匀的,资源高的则分配权重高一些,资源低的则分配权重低一些,这种情况使用基于权重的负载均衡算法,可以更高效的利用资源和提高并发处理能力~

原创不易,觉得有用的小伙伴来个一键三连(点赞+收藏+评论 )走起~
在这里插入图片描述
在这里插入图片描述




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/176491.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午9:48
下一篇 2026年3月26日 下午9:48


相关推荐

  • NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)

    NVIDIA英伟达GPU显卡算力一览(包含Tesla和GeForce、TITAN及RTX系列等)英伟达 GPU 算力一览官方说明在 GPU 算力高于 5 0 时 此计算机可以用来跑神经网络 而在 CSDN 和网页上查找 GPU 算力时 没有一个比较全面的博客对目前的显卡算力做统计 而且英伟达官网链接打开真的谜一样 很慢或者直接打不开 所以用这篇博客记录一下截至到 2020 8 27 一部分主流供深度学习的 GPU 的算力 NVIDIA 官方查找 GPU 算力的网址 https developer nvidia com cuda gpus 此外 目前主流的游戏本显卡 1650 1660 以及 1660Ti 等并未出现在官网的算力表中

    2025年7月30日
    13
  • 简述冯诺依曼计算机体系结构

    简述冯诺依曼计算机体系结构当前计算机主要是基于冯诺依曼体系结构设计的 下面就简单分析一下冯诺依曼体系结构的计算机是如何工作的 首先下面的图就是冯诺依曼体系结构图 主要由五大部件组成 1 存储器用来存放数据和程序 2 运算器主要运行算数运算和逻辑运算 并将中间结果暂存到运算器中 3 控制器主要用来控制和指挥程序和数据的输入运行 以及处理运算结果 4 输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式 常

    2026年3月16日
    2
  • 微信每日早安推送「建议收藏」

    微信每日早安推送「建议收藏」七夕到啦,做一个程序员给女朋友的浪漫礼物吧。微信公众号推送。每日早安推送

    2022年9月29日
    4
  • 程序员法则xiazai_程序员手册

    程序员法则xiazai_程序员手册第六章论剑  我深深的吸了一口气,让自己的激动的心情平息下来。“大家好,很高兴可以和大家合作开发这个项目,我也不浪费大家的时间,下面我就给大家讲一下这个项目的具体构架情况”。一个个的方案才我的嘴里轻松的说出来,每个人都分配到合适的任务,每个人都清楚的明白自己的目的,我全身心的投入指挥当中,我记得BRUCE,也是我程序道路上的领路人之一,曾经在发给我的EMAIL中说过:“许,你编写的程序让我感受到

    2022年10月7日
    6
  • 根据两点经纬度计算距离

    根据两点经纬度计算距离在实际应用当中,一般是通过一个个体的编码来查找该编码对应的地区中心的经纬度,然后再根据这些经纬度来计算彼此的距离,从而估算出某些群体之间的大致距离范围(比如酒店旅客的分布范围-各个旅客的邮政编码对应的经纬度和酒店的经纬度所计算的距离范围-等等)。用GPS测出两个点的经纬度后,如何计算这两个点之间的距离呢?设两点A、B的经、纬度分别为(jA,wA)(jB,wB),则半径为

    2026年2月25日
    7
  • mysql查看binlog日志内容

    mysql查看binlog日志内容一 binlog 介绍 binlog 即二进制日志 它记录了数据库上的所有改变 并以二进制的形式保存在磁盘中 它可以用来查看数据库的变更历史 数据库增量备份和恢复 Mysql 的复制 主从数据库的复制 二 binlog 格式 binlog 有三种格式 Statement Row 以及 Mixed 基于 SQL 语句的复制 statement basedreplic

    2026年3月19日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号