什么是反向代理?
说到反向代理,大家一般都会提一下:正向代理,正向代理就是代理,比如我们写爬虫的时候IP被封、Google的时候404,这个时候我们都会用到代理,你可以把代理理解成一个跳板,我们的电脑不能访问Google,那我们就去访问能访问Google的服务器,一般我都是在这两种情况下使用代理,可能有更高深的用法,具体我也没用过。 说完代理,就来说一下我们今天的主角--反向代理
定义
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
功能
对客户端隐藏服务器的IP地址 通过缓存静态资源,加速Web请求 更安全,因为任何来自Internet的请求都必须先经过代理服务器,可以在这里做防护(例如ip过滤)
实现方法:location / { proxy_pass_header Server; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Scheme $scheme; proxy_pass http://abc.com; }
第一次看到上面这些内容时,大多人可能还是不明白 简单点说就是你有A、B两台服务器,这两台服务器上都放着你的代码,当用户访问你的内容时,会访问A服务器,A服务器再去请求B内容返回给用户,用户不知道请求的是B,这样就是实现了反向代理
下面我们通过以下简单的几步演示一下反向代理
通过上一篇的Docker创建Nginx服务,我们可以快速创建3个nginx服务,来模拟3台服务器
- 首先创建一个nginx的配置文件
-
#创建 nginx配置文件 touch nginx.conf # 创建a、b、c三个文件夹存放项目 mkdir a b c
- 编写Nginx配置文件
# Nginx的配置文件,这里主要作用是为了指定端口和项目路径 events { #每个工作进程的并发连接数 worker_connections 1024; } http { server { #监听端口 listen 80; #绑定域名 server_name localhost; #项目路径 root /nginx/share/nginx/html; } }
- 启动Nignx服务
#创建a容器 docker run -p 80:80 -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf -v $PWD/html/a:/usr/share/nginx/html --name a-server -d nginx #创建b容器 docker run -p 80:8081 -v $PWD/html/b:/usr/share/nginx/html --name b-server -d nginx #创建c容器 docker run -p 80:8082 -v $PWD/html/c:/usr/share/nginx/html --name c-server -d nginx #参数解释 -p 8080:80 将容器的80端口映射到宿主机的8080端口 -v $PWD/a.conf:/etc/nginx/nginx.conf 将宿主机中当前目录下的a.conf挂载到容器的/etc/nginx/nginx.conf -v $PWD:/a 将主机中当前目录a挂载到容器的/usr/share/nginx/html --name 容器的名称 -d 后台运行容器,并返回容器ID
- 判断Nginx是否启动成功
docker ps -a 查看容器是否成功启动 或者 curl 127.0.0.1 curl 127.0.0.1:8081 curl 127.0.0.1:8082
- 修改配置文件
events { #每个工作进程的并发连接数 worker_connections 1024; } http { server { #监听端口 listen 80; #绑定域名 server_name localhost; #项目路径 root /nginx/share/nginx/html; # 反向代理 location /b { rewrite ^/b(.*) /$1 break; proxy_pass http://127.0.0.1:8081 } # 反向代理 location /c { rewrite ^/c(.*) /$1 break; proxy_pass http://127.0.0.1:8082 } } }
这个时候就我们就已经实现了方向代理,可以在浏览器中访问
http://127.0.0.1 输出this is a http://127.0.0.1/b 输出 this is b http://127.0.0.1/c 输出 this is c
今天的另外一个主角是负载均衡
-
什么是负载均衡 很多新手在听说负载均衡的时候,都会感觉是很高深莫测,其实实现起来也不难, 下面我们修改配置实现一个简单的负载均衡
首先来了解一下负载均衡定义
用来在多个计算机、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载平衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性
功能
将流量分配给多个应用程序服务器,提高Web应用程序的可伸缩性和可靠性
实现方法
http { upstream myServer { server 127.0.0.1:8081; server 127.0.0.1:8082; } server { listen 80; location / { proxy_pass http://myServer; } } }
对于上面的很官方定义,我再用大白话解释一下, 将用户的请求分配到压力小的服务器上,从而减轻服务器压力
下面我们通过简单的Demo演示一下负载均衡
修改刚才的配置文件nginx.conf
events { #每个工作进程的并发连接数 worker_connections 1024; } http { #定义负载均衡设备的 Ip及设备状态 upstream myServer { server 127.0.0.1:8081; server 127.0.0.1:8082; } server { #监听端口 listen 80; #绑定域名 server_name localhost; #项目路径 root /nginx/share/nginx/html; location / { proxy_pass http://myServer; } } } 打开浏览器输入http://127.0.0.1 我们刷新浏览器,就输出this is b或者this is a
到这里反向代理和负载均衡的基本配置就分享完了。
但是机智的你可能会发提出一些疑问,通过负载均衡,用户访问到B服务器时,下次刷新又去访问C服务器,能不能还继续访问A服务器。当然Nginx提供了方法 具体配置内容如下
upstream myServer { #weight 指定轮询几率,如果现在有5个请求, #有4个会请求到B服务器上,1个请求到C服务器上, #一般我们会把服务器配置比较高的权重加大 server b.com weight=4; server c.com; #通过客户端的IP地址,确定下一个请求应该选择哪个服务器 ip_hash; }
本次主要分享了Nginx的反向代理和负载均衡,当然,分享的内容还是比较基础,Nginx虽然体积不大,但是功能很全面,更多模块和配置文件可以去查看官方文档
注意事项
- 如果 nginx没有开启热更新,修改配置文件一定要重启
#docker 容器的重启命令 docker restart id(容器ID) #不是使用docker安装的nginx service nginx restart
- 反向代理中nginx的配置 proxy_pass
location /c { #如果是绑定目录,这里的rewrite一定要写 rewrite ^/c(.*) /$1 break; # docker容器中这里一定要填写本机的ip地址,不能填写127.0.0.1 proxy_pass http://117.189.124.134:8082; }
总结:Nginx的反向代理、负载均衡配置还是比较简单的,主要用到proxy_pass和upstream,避免上述几个坑,应该没有什么问题