Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >nginx--❤️图解及代码实现正向代理、反向代理、负载均衡❤️

nginx--❤️图解及代码实现正向代理、反向代理、负载均衡❤️

原创
作者头像
用户4396583
发布于 2024-07-25 02:21:59
发布于 2024-07-25 02:21:59
1.2K0
举报

一、代理服务

什么是代理?来一张图了解下

代理又分为正向代理和反向代理。

二、正向代理

1.1 什么是正向代理?

举个栗子:

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

正向代理:指的是通过代理服务器 代理浏览器/客户端去重定向请求访问到目标服务器 的一种代理服务。

正向代理服务的特点: 是代理服务器 代理的对象是浏览器/客户端,也就是对于目标服务器 来说浏览器/客户端是隐藏的。

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.25.x版本),如README.md说明:

如果你安装的nginx版本不在1.4.x~1.25.x这个范围内,那无法支持正向代理转发https请求。

(2)安装nginx

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

代码语言:bash
AI代码解释
复制
$ 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_module的zip压缩包源码:

https://github.com/chobits/ngx_http_proxy_connect_module

(4)解压新模块源码

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

代码语言:bash
AI代码解释
复制
$ 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

代码语言:bash
AI代码解释
复制
$ /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/nginx给nginx用户或者其他普通用户~

代码语言:bash
AI代码解释
复制
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的配置分别添加http和https的server,其他配置保持不变~

代码语言:bash
AI代码解释
复制
vi /usr/local/nginx/conf/nginx.conf

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

代码语言:ini
AI代码解释
复制
#正向代理转发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配置

代码语言:bash
AI代码解释
复制
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload

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

客户端要代理访问目标网站示例对象:

http://www.baidu.comhttps://www.baidu.com

(1)客户端–Windows浏览器访问

首先在本地电脑的IE浏览器设置代理服务器和端口:

IE->右上角 ->工具 ->Internet选项->连接->局域网(LAN)设置 ->配置代理IP和端口

浏览器访问

http://www.baidu.com/https://www.baidu.com/

实时查看nginx日志

代码语言:bash
AI代码解释
复制
tail -f /usr/local/nginx/logs/access.log

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

(2)客户端–Linux代理访问

Linux下也可以验证代理服务器是否能正常代理转发http和https请求~

代码语言:bash
AI代码解释
复制
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 什么是反向代理?

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

nginx可以当做反向代理服务器来使用:

  • 我们需要提前在nginx中配置好反向代理的规则,不同的请求,交给不同的真实服务器处理
  • 当请求到达nginx,nginx会根据已经定义的规则进行请求的转发,从而实现路由功能

利用反向代理,就可以解决我们前面所说的端口问题,如图

nginx中的每个server就是一个反向代理配置,可以有多个server

代码语言:ini
AI代码解释
复制
#user  nobody;
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;

    keepalive_timeout  65;

    gzip  on;
    server {
        listen       80;
        server_name  manage.leyou.com;

        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://127.0.0.1:9001;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
    }
    server {
        listen       80;
        server_name  api.leyou.com;

        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            proxy_pass http://127.0.0.1:10010;
            proxy_connect_timeout 600;
            proxy_read_timeout 600;
        }
    }
}
  • 浏览器准备发起请求,访问http://mamage.leyou.com,但需要进行域名解析
  • 优先进行本地域名解析,因为我们修改了hosts,所以解析成功,得到地址:127.0.0.1
  • 请求被发往解析得到的ip,并且默认使用80端口:http://127.0.0.1:80

本机的nginx一直监听80端口,因此捕获这个请求

  • nginx中配置了反向代理规则,将manage.leyou.com代理到127.0.0.1:9001,因此请求被转发
  • 后台系统的webpack server监听的端口是9001,得到请求并处理,完成后将响应返回到nginx
  • nginx将得到的结果返回到浏览器

2.2 nginx实现反向代理

(1)修改nginx配置

修改nginx配置vi /usr/local/nginx/conf/nginx.conf 在http模块中配置如下:

nginx反向代理都是结合负载均衡来实现的,这里先直接提供反向代理+负载均衡的配置

代码语言:ini
AI代码解释
复制
#反向代理+负载均衡
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配置

代码语言:bash
AI代码解释
复制
/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_fails(1次),则在失效时间fail_timeout(10秒)内不会再转发请求到该节点~

代码语言:ini
AI代码解释
复制
upstream defaultReverseProxyServer{
    server 192.168.0.1:8080; 
    server 192.168.0.2:8080; 
}

(2)基于权重的算法

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

代码语言:ini
AI代码解释
复制
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共享问题。

代码语言:ini
AI代码解释
复制
upstream ipHashReverseProxyServer{
    ip_hash;
    server 192.168.0.1:8080;
    server 192.168.0.2:8080;
}

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
Nginx从入门到放弃04-反向代理、正向代理、负载均衡
通过前面几篇的文章,我们知道nginx最主要的功能之一可以做负载均衡器、正向代理和反向代理,今天我们就来学习如何利用nginx配置
星哥玩云
2022/06/24
1.1K0
Nginx从入门到放弃04-反向代理、正向代理、负载均衡
Nginx反向代理与负载均衡
在做需求的时候,有时候会和别的三方系统交互,如调用一个第三方系统的http接口查询商品物流信息,获得响应数据返回给我们自己系统的前端页面进行展示,整个流程会遇到什么样的问题呢,现在整理一下。
编程大道
2019/10/15
1.2K0
Nginx反向代理与负载均衡
Nginx正向代理
记一次使用Nginx做正向代理,实现http与https的代理访问 1.环境介绍 操作系统:CentOS Linux release 7.6.1810 (Core) Nginx编译安装,版本-nginx/1.18.0 服务器A部署在DMZ区域且可上网,服务器B不可上网,但是和服务器A能够通信 在服务器A上部署Nginx正向代理,使服务器B通过服务器A正向代理功能可访问http和https Nginx默认不支持https的正向代理,这里需要安装第三方模块“ngx_http_proxy_connect_modu
染指流年
2023/03/13
9330
Nginx正向代理与反向代理 负载均衡
Nginx #1 什么是正向代理 正向代理类似一个跳板机,代理访问外部资源 举个例子: 我是一个用户,我访问不了某网站(用户知道该网站的服务器地址),但是我能访问一个代理服务器,这个代理服务器
Autooooooo
2020/11/09
8610
Nginx正向代理与反向代理 负载均衡
05 . Nginx的反向代理与负载均衡
Nginx负载均衡 客户端的访问都被代理到后端的一台服务器上,最终会出现性能瓶颈,从而导致效率降低,前端用户的访问速度急速下降,要解决这个问题就需要添加多台httpd,同时承受大量并发连接,每台服务器接收的并发连接降低了,效率就高了,nginx作为代理,在收到客户端的请求时,会分发到不同的后端服务器,但是nginx收到请求之后会分配到那个服务器之上,有什么规律和需求,就需要用调度算法来分配. upstream语法 # upstream的定义必须在server{..}外定义 upstream <组名
iginkgo18
2020/09/27
8670
nginx反向代理与负载均衡
     正向代理,就是我们常用的代理,类似于一个跳板,通俗的来说就是,我访问不了某网站,例如我想访问pornhub,但是由于一些不可描述的原因,我们是无法直接访问的,但是我们有一台服务器,这台服务器可以访问到该站,而我们恰好也能访问该服务器,所以我们就先连上这台服务器,告诉他,我想访问pornhub,然后这台服务器便去访问,最后将结果返回给我。
dogfei
2020/07/31
6860
nginx使用学习之正向代理、反向代理、负载均衡(配置实例详解)
Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
IT大咖说
2019/12/17
3.8K0
nginx使用学习之正向代理、反向代理、负载均衡(配置实例详解)
Nginx-正反向代理及负载均衡
目录 正/反向代理 代理的方式 Nginx代理服务支持的协议 代理实战 部署web01 部署Lb01 Nginx代理常用参数 添加发往后端服务器的请求头信息 代理到后端的TCP连接、响应、返回等超时时间 proxy_buffer代理缓冲区 配置代理优化文件 负载均衡 负载均衡的架构 负载均衡的实现 连接池 实现步骤 负载均衡的比例 轮询 权重 ip_hash 负载均衡后端状态 down backup max_fails、fail_timeout proxy_next_upstream监控的错误类型 负载均衡
HammerZe
2022/03/25
4720
Nginx-正反向代理及负载均衡
Nginx常见的面试题—限流、正向、反向代理、负载均衡策略
Nginx ,是一个 Web 服务器和反向代理服务器用于 HTTP、HTTPS、SMTP、POP3 和 IMAP 协议。
HaC
2020/12/30
2.8K0
Nginx常见的面试题—限流、正向、反向代理、负载均衡策略
tengine、nginx配置正向代理,其他内网机器通过代理访问外网,支持https
PCRE(Perl Compatible Regular Expressions)是一个 Perl 库,包括 perl 兼容的正则表达式库。nginx rewrite 依赖于 PCRE 库,所以在安装 Tengine 前一定要先安装 PCRE。
joshua317
2022/03/29
3K0
tengine、nginx配置正向代理,其他内网机器通过代理访问外网,支持https
前端必须了解Nginx正向代理和反向代理
上篇文章主要分享了公众号的开发流程及开发过程中需要注意的事项。今天分享一些关于Nginx配置的相关知识点,主要内容是正向代理和反向代理。
terrence386
2022/07/14
1K0
前端必须了解Nginx正向代理和反向代理
nginx代理(正向代理和反向代理)
  是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端(目的是为了保护客户端用户)
码缘
2019/08/14
2.6K0
Nginx - 深入了解 正向代理vs反向代理 、负载均衡算法 、 缓存策略
Nginx是一款高性能的HTTP服务器和反向代理服务器。代理服务器(Proxy Server)在客户端和目标服务器之间充当中介,其主要作用包括负载均衡、缓存、内容过滤和安全增强等。
小小工匠
2024/05/26
1.9K0
Nginx安装、实现反向代理及深度优化
一、Nginx的安装 关于Nginx的基本概念,在之前的博文中:https://blog.51cto.com/14227204/2464167 有详细的介绍,这篇博文就直接从安装开始谈起。
小手冰凉
2020/02/11
2.9K0
Nginx安装、实现反向代理及深度优化
Nginx upstream与proxy_pass反向代理配置详解
Nginx除了实现基本的Web Server功能之外还可以作为正向代理与反向代理。正向代理与反向代理的区别在于代理的对象不一样。正向代理的对象是客户端,反向代理的对象是服务端。做正向代理时,当客户端发起请求其访问目标应该是后端真实服务器;做反向代理时,客户端发起请求其目标应该是代理服务器本身,由代理服务器把后端真实服务器上的数据发给了客户端。反向代理通常是作为负载均衡来分发流量给后端的应用程序服务器,以此来提高性能。比如前端是一台Nginx作为负载均衡的分发器,后端是多台Apache搭建的Web Server,当访问流量很大时,就让Nginx分发请求给后端多台服务器,让它们分工响应。
鹏程
2023/05/02
3.8K13
nginx反向代理与负载均衡
如果我们无法访问到谷歌网站的时候,就可以设置一个代理,然后我们去访问代理服务器,代理会向谷歌发送请求,然后再将数据返回给我们。这样的代理就是正向代理。
兰舟千帆
2022/08/05
6370
nginx反向代理与负载均衡
Nginx专辑|05 -如何使用Nginx配置正向代理
在之前的编译nginx的基础上,我们对nginx二进制增加新的模块ngx_http_proxy_connect_module[1]
公众号: 云原生生态圈
2020/08/04
3K0
Nginx专辑|05 -如何使用Nginx配置正向代理
Nginx 正向代理 http、https(openEuler)
Nginx正向代理,通过服务器代理客户端去重定向请求访问到目标服务器的一种代理服务。对于目标服务器来说浏览器/客户端是隐藏的。Nginx 正向代理默认只支持http 协议,不支持 https 协议,需借助"ngx_http_proxy_connect_module"模块实现https 正向代理。
Kevin song
2024/03/21
2.8K0
Nginx 正向代理 http、https(openEuler)
简单说说什么是正向代理和反向代理,以及他们的区别|nginx反向代理配置教程
一般的访问流程是客户端直接向目标服务器发送请求并获取内容,比如大家通过浏览器,输入对应的网址,baidu.com、qq.com、taobao.com、zygxsq.cn/daohang 等,就可以直接进入对方的网站。
小小鱼儿小小林
2024/05/25
2780
正向代理、负载均衡、反向代理
假设我们需要使用自己的笔记本(A)访问国外的站点(B),由于网络限制,我们无法访问国外的站点.但是此时我们有一台服务器(C)跳出了网络限制可以访问国外站点,那么我们可以通过正向代理技术,让我们笔记本访问服务器C,通过服务器C间接的访问国外站点B.这个过程就称之为正向代理.
郑小超.
2018/12/06
5980
推荐阅读
相关推荐
Nginx从入门到放弃04-反向代理、正向代理、负载均衡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文