nginx反向代理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理相关的知识,希望对你有一定的参考价值。

nginx反向代理

第1章 需求:

公司产品app端新上线的功能,用户自己在app上上传图片,通过PC端可以读取到图片,但是app上传图片的地址是阿里云的OSS对象存储,用户可以正常访问,但是PC端上是只可以访问我们阿里云ECS服务器的地址的,安全需求比较高,不可以开放OSS地址的访问,想通过ECS来代理OSS

即访问:ecsport/image 可以到达oss.aliyun.com/hug

用户网络环境说明:

用户程序分别部署在两台机器上,分别是前置机和应用机,两台机器不在一个内网网段,这两台机器中间有网闸,通过网闸转发来实现互通,前置机有公网ip的映射,并且只有对应端口对外,只可以访问我们阿里云ecs的地址

第2章 配置过程

我这里程序中是通过/image来访问的,但是实际的访问请求中是没有image这个目录的,也就是匹配成功之后要去掉这个目录,刚开始是这样配的

   server {

       listen       8110;

       server_name  公网ip;

       location /image/ {

       rewrite ^/image/hug/questionnaire/(.*)$ http://oss.aliyun.com/hug/questionnaire/$1 permanent;

       }

       }

然后我在测试机器上也配置nginx反向代理,把本地的请求转发到阿里云正式服务器上

   server {

       listen       8110;

       server_name  localhost;

       location /image/ {

           proxy_pass http://公网ip/image;

      }

}

配置好以后我在本地访问ecs服务器进行测试,并进行抓包,发现匹配后uri中的image目录地址是去掉了,但是请求的ip地址还是我自己的地址,这在用户的程序上的话是根本无法访问到的

技术分享图片

个人理解nginx中的proxy_passrewrite模块的区别是:

proxy_pass是将请求交给第三方,由第三方去目标中请求,得到返回结果后将结果交给你

rewrite只是帮你修改请求的地址,但是访问者还是自己


所以想我这种需求只能用proxy_pass来进行配置,在阿里云ecs上如下配置:

          location /image/ {

               proxy_pass http://oss.aliyun.com/;

          }

在用户的前置机和应用服务器上分别添加如下的配置:

server {

       listen       3002;

       server_name  前置机服务器内网地址;

       location /image/ {

            proxy_pass http://ecs服务公网地址/image;

       }

       }

server {

       listen       3002;

       server_name  应用服务器内网地址;

       location /image/ {

           proxy_pass http://前置机内网地址/image;

       }

       }

部署成功之后访问图片正常


以上是关于nginx反向代理的主要内容,如果未能解决你的问题,请参考以下文章

用nginx反向代理的问题?(详内)

Nginx简单粗暴的反向代理教程

nginx反向代理数据传输能提高数据响应么?

Nginx 最全操作——nginx反向代理(5)

Nginx 如何设置反向代理

nginx反向代理三种模式