实践中客户端没法直接跟服务端发起请求的时候,咱们就须要代理服务。代理能够实现客户端与服务端之间的通讯,咱们的Nginx也能够实现相应的代理服务。代理分为正向代理和反向代理,此文就来演示一下Nginx配置正向代理和反向代理的场景。html
正向代理和反向代理的区别我在知乎上找到两张图能够帮助咱们很好的理解: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
正向代理很常见,咱们的***就是一种正向代理。
咱们接下来演示正向代理的这么一个场景。
首先我在个人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:
resolver
和
proxy_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系统,能够从网络设置中选择高级,而后选择代理
反向代理的演示更为简单一些。
首先在/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结果是访问不到的:
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
由上的打比方和演示例子能够体会到正向代理与反向代理的区别和Nginx正向代理和反向代理的简单配置。正向代理和反向代理的区别上边也说过在于代理的对象不同,正向代理的代理对象是客户端,反向代理的代理对象是服务端。
最后一句话总结此文就是
代理服务器站在客户端那边就是正向代理,
代理服务器站在原始服务器那边就是反向代理,
Nginx经过proxy_pass
能够设置代理服务。