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

学习背景

什么是nginx?

【百度百科】
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器…

除了反向代理,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 客户端访问(验证正向代理)

客户端要代理访问目标网站示例对象:
http://www.baidu.comhttps://www.baidu.com

(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,nginx在10s内认为server是不可用的,将不在发送请求给这台服务器
    server 应用服务器B的IP:8080 weight=5 fail_timeout=10s max_fails=2;
    #负载均衡应用服务器C: 代理服务器权重为5,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://blog.csdn.net/JustinQin

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

相关推荐


文章浏览阅读3.7k次,点赞2次,收藏5次。Nginx学习笔记一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、Nginx 简介1. 什么是Nginx2. 反向代理3. 负载均衡4. 动静分离二、Nginx基本使用1. Nginx常用的操作命令2. Nginx的配置文件一、Nginx 简介1. 什么是Nginx  Nginx(“engine x”)是一个_nginx代理
文章浏览阅读1.7w次,点赞14次,收藏61次。我们在使用容器的过程中需,有时候需要对容器中的文件进行修改管理,如果不做文件映射的化,我们使用docker exec -it 容器ID/容器名 /bin/bash 才能进入nginx中的文件里面如图。架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将原本要直接发送到web服务器上的http请求发送到代理服务器中。A想要组C的房子,但是A并不认识C所以租不到,但是B认识C,A找B帮忙租到了C的房子。客户端代理服务器服务器。_docker nginx 配置
文章浏览阅读1.4k次。当用户在访问网站的过程中遇到404错误时,通常情况下应该显示一个友好的错误页面,而不是仅仅显示一个简单的错误提示。在Nginx中,可以通过配置来实现404错误自动跳转到首页的功能。如果您的网站使用动态内容生成页面(如PHP或其他服务器端语言),则应相应地修改配置以适应您的网站架构。这样,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。为了使配置生效,需要重新加载Nginx配置。首先,需要打开Nginx的配置文件。现在,当用户访问一个不存在的页面时,Nginx会自动将其重定向到首页。_nginx 404 重定向
文章浏览阅读2.7k次。docker 和 docker-compose 部署 nginx+mysql+wordpress 实战_docker wordpress mariadb
文章浏览阅读1.3k次。5:再次启动nginx,可以正常启动,可以在任务管理器中查看到nginx的进程。重新启动下 直接访问8090端口 ok 访问成功。1 :查看80端口占用情况,pid的值为3960。3:在运行中输入regedit打开注册表编辑器。2: 通过以下命令查看3960所对应的服务名称。4:找到Start,右键修改将其制改为4。_nginx80端口无法访问
文章浏览阅读3.1w次,点赞105次,收藏182次。高性能:Nginx 被设计为能够处理大量并发连接而不显著增加系统负担。它采用异步事件驱动的架构,可以有效地处理高流量的 Web 请求。负载均衡:Nginx 支持负载均衡,可以将请求分发到多个后端服务器,以提高网站性能和可用性。反向代理:Nginx 可以充当反向代理,将客户端请求转发到后端服务器,隐藏后端服务器的真实 IP 地址,增加安全性和可扩展性。静态文件服务:Nginx 可以高效地提供静态文件(如 HTML、CSS、JavaScript、图像等)的服务,减轻应用服务器的负担。
文章浏览阅读976次。nginx作为常用的web代理服务器,某些场景下对于性能要求还是蛮高的,所以本片文章会基于操作系统调度以及网络通信两个角度来讨论一下Nginx性能的优化思路。我们的大学教程大部分讲述七层模型,实际上现代网络协议使用的都是四层模型,如下图,应用层报文经过四层的首部封装到对端。对端链路层拆开首部查看mac地址是自己在网上,拆开ip首部查看目的地址是不是自己,然后到达传输层应用层完成报文接收。文章是基于原有个人知识基础上,对旧知识进行巩固,以及新知识实践学习。
文章浏览阅读5.4k次,点赞9次,收藏15次。最后再说一种情况,就是后端处理了跨域,就不需要自己在处理了(这里吐槽下,某些后端工程师自己改服务端代码解决跨域,但是又不理解其中原理,网上随便找段代码黏贴,导致响应信息可能处理不完全,如method没添加全,headers没加到点上,自己用的那个可能复制过来的并不包含实际项目所用到的,没有添加options请求返回状态码等,导致Nginx再用通用的配置就会可能报以下异常)里面的就好了,因为这里如果是预检请求直接就ruturn了,请求不会再转发到59200服务,如果也删除了,就会报和情况1一样的错误。_nginx 允许跨域
文章浏览阅读2.5k次。项目配置了多个域名,如下,php 代码中有获取的值。当访问a.demo.com时,其获取的值是符合预期的。但是当访问b.demo.com时,其获取的值还是a.demo.com,导致代码中的判断出现错误。_nginxservername多个域名
文章浏览阅读1k次,点赞2次,收藏5次。采用YAML manifest的方式来安装ingress-nginx,用registry.lank8s.cn镜像库来替换 registry.k8s.io的库。_ingress-nginx安装
文章浏览阅读1.6k次,点赞2次,收藏2次。在windows平台编译nginx_windows 编译nginx
文章浏览阅读5.8k次,点赞2次,收藏18次。nginx [engine x] 是 HTTP 和反向代理服务器、邮件代理服务器和通用 TCP/UDP 代理服务器。nginx 的特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在高连接并发的情况下,nginx是Apache服务器不错的替代品,能够支持高达50000个并发连接数的响应。使用epoll and kqueue作为开发模型。_nginx
文章浏览阅读2k次。Linux启动(systemctl start nginx)nginx服务时出现:Failed to start nginx.service: Unit not found._为什么nginx的systemctl start nginx.service不能使用
文章浏览阅读1.3k次。重启之后,打开浏览器,输入http://localhost:8900/myBaidu,这时候就会自动的跳转到百度的页面。按照我们不同的需求修改nginx文件夹中的nginx-1.16.1conf里面的nginx.conf文件。启动nginx:打开nginx的文件夹,然后双击nginx.exe文件,启动nginx。打开之后假设我们需要跳转到百度则在配置文件nginx.conf中的下面加上。1、打开任务管理器关闭nginx的进程。端口在配置文件的(下图)进行查看nginx端口。_nginx 代理百度
文章浏览阅读5.7k次,点赞5次,收藏3次。nginx重定向问题解决(rewrite or internal redirection cycle)_rewrite or internal redirection cycle while internally redirecting to "/inde
文章浏览阅读1.3k次。请注意,上述命令假设 Nginx 已经在系统的 PATH 环境变量中配置。如果没有,请提供正确的 Nginx 安装路径,或者在命令中使用完整的路径来替换。将该命令与所有 Nginx 进程的 PID 一起使用,以终止所有正在运行的 Nginx 进程。此命令将启动一个新的 Nginx 进程来重新加载配置文件并重新启动服务器。使用以下命令来终止所有 Nginx 进程(使用上面的 PID 替换。的进程以及它们的 PID。打开命令提示符(CMD)。此命令将列出所有名为。选项来强制终止进程。_windows 怎么关闭nginx
文章浏览阅读2.7k次,点赞2次,收藏7次。包括 Netflix、GitHub 和 WordPress。Nginx 可以用作 Web 服务器、负载均衡器、反向代理和 HTTP 缓存等。_ubuntu安装nginx
文章浏览阅读915次。轻松搭建短域名短链接服务系统,可选权限认证,并自动生成证书认证把nginx的http访问转换为https加密访问,完整步骤和代码。_nginx 短链代理
文章浏览阅读1.1k次,点赞35次,收藏24次。流媒体方案之Nginx——实现物联网视频监控项目Nginx是什么Nginx在流媒体方案中的位置软硬件准备移植编译Nginx运行Ngnix测试流媒体方案浏览器播放_nginx-rtmp-module
文章浏览阅读1.9k次。nginx 配置 wss 协议转发 ws 服务器_nginx 配置wss