Nginx正向代理与反向代理

1、介绍

实践中客户端没法直接跟服务端发起请求的时候,咱们就须要代理服务。代理能够实现客户端与服务端之间的通讯,咱们的Nginx也能够实现相应的代理服务。代理分为正向代理和反向代理,此文就来演示一下Nginx配置正向代理和反向代理的场景。html


2、正向代理和反向代理的区别

正向代理和反向代理的区别我在知乎上找到两张图能够帮助咱们很好的理解:python


 
 

 
 
正向代理:客户端 <一> 代理 一>服务端

正向代理简单地打个租房的比方:nginx

A(客户端)想租C(服务端)的房子,可是A(客户端)并不认识C(服务端)租不到。
B(代理)认识C(服务端)能租这个房子因此你找了B(代理)帮忙租到了这个房子。浏览器

这个过程当中C(服务端)不认识A(客户端)只认识B(代理)
C(服务端)并不知道A(客户端)租了房子,只知道房子租给了B(代理)。服务器

反向代理:客户端 一>代理 <一> 服务端

反向代理也用一个租房的例子:网络

A(客户端)想租一个房子,B(代理)就把这个房子租给了他。
这时候实际上C(服务端)才是房东。
B(代理)是中介把这个房子租给了A(客户端)。app

这个过程当中A(客户端)并不知道这个房子到底谁才是房东
他都有可能认为这个房子就是B(代理)的spa

由上的例子和图咱们能够知道正向代理和反向代理的区别在于代理的对象不同,正向代理的代理对象是客户端,反向代理的代理对象是服务端。3d

3、Nginx代理的配置演示

一、正向代理配置场景演示

正向代理很常见,咱们的***就是一种正向代理。
咱们接下来演示正向代理的这么一个场景。
首先我在个人A服务器的nginx设置访问控制
访问控制以前我访问A下的test.html是这样的:代理


 
 

咱们打开/etc/nginx/conf.d/default.conf
咱们加入这么一个判断语句
若是访问A的IP不是118.126.106.11(个人B服务器)则返回403.

location / {
        if ( $remote_addr !~* "^118\.126\.106\.11") { return 403; } root /opt/app/demo/html; index index.html index.htm; } 

添加后reload一下nginx再访问test.html:

 
 

此时本地个人浏览器就是被限制了,访问不了该资源。
如今我登陆上个人B服务器,打开/etc/nginx/conf.d/default.conf
添加 resolverproxy_pass,设置以下:

 

server {
    listen       80; server_name localhost nginx.tangll.cn; resolver 8.8.8.8; location / { proxy_pass http://$http_host$request_uri; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 

resolver为DNS解析,这里填写的IP为Google提供的免费DNS服务器的IP地址
proxy_pass配置代理转发
至此即是配置了B服务器全部访问根一级的请求所有都代理转发对应到$http_host$request_uri去了,$http_host就是咱们要访问的主机名,$request_uri就是咱们后面所加的参数。
简单的说至此就是至关于配置好了咱们请求了B服务器,B服务器再去请求咱们所请求的地址。

那么接下来咱们来看一下结果,咱们在本地配置好代理,我这里是mac系统,能够从网络设置中选择高级,而后选择代理

 
 

填入咱们B服务器的IP,而后咱们来看一下代理是否成功。
咱们登陆 http://www.ip138.com/ 能够看到此时咱们的IP地址已经为B服务器的IP,说明代理成功。
 
 

而后咱们再来访问一下test.html:
 
 

结果证实,此时的客户端已经能够成功访问A服务器的资源。
以上就是正向代理的一个场景演示,这个过程当中能够知道,咱们客户端是想要A的资源,可是A的资源只有B能拿到,便让B代理去帮助咱们访问A的资源。整个过程A只知道B拿了他的资源,并不知道客户端拿到。

 

二、反向代理配置场景演示

反向代理的演示更为简单一些。
首先在/etc/nginx/conf.d/下新建一个test.conf:

server {
    listen       8080; server_name localhost nginx.tangll.cn; location / { root /opt/app/demo/html; index index.html index.htm; } error_page 500 502 503 504 404 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 

能够看到我server里listen的是8080端口,可是个人服务器自己不对外开放8080端口,只开放了80端口。
因此咱们此时访问test.html结果是访问不到的:

 
 

而后咱们打开咱们的/etc/nginx/conf.d/default.conf
添加 proxy_pass设置以下:

 

server {
    listen       80; server_name localhost nginx.tangll.cn; location / { root /usr/share/nginx/html; index index.html index.htm; } #设置代理 #location ~ /test.html$ { # proxy_pass http://127.0.0.1:8080; #} error_page 500 502 503 504 404 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 

咱们设置当匹配test.html结尾的URL时就去代理访问本机的8080端口
为了对比咱们先注释掉,而后直接80端口访问一下test.html:


 
 

能够看到此时返回的404。
这时候取消注释咱们reload一下nginx而后用80端口访问test.html


 
 

此时即可访问8080端口配置的资源。
以上即是完成了一个反向代理的演示,这个过程当中咱们能够知道,客户端想要访问的是test.html,可是test.html其实是8080端口下配置的,中间通过了代理才能拿到。也就是说客户端并不知道中间经历了什么代理过程,只有服务端知道。客户端只知道他拿到了test.html也就是8080端口下配置的资源内容。

4、总结

由上的打比方和演示例子能够体会到正向代理与反向代理的区别和Nginx正向代理和反向代理的简单配置。正向代理和反向代理的区别上边也说过在于代理的对象不同,正向代理的代理对象是客户端,反向代理的代理对象是服务端。
最后一句话总结此文就是
代理服务器站在客户端那边就是正向代理,
代理服务器站在原始服务器那边就是反向代理,
Nginx经过proxy_pass能够设置代理服务。

做者:唐龙隆 连接:https://www.jianshu.com/p/ae76c223c6ef 来源:简书 简书著做权归做者全部,任何形式的转载都请联系做者得到受权并注明出处。
相关文章
相关标签/搜索