nginx反向代理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx反向代理相关的知识,希望对你有一定的参考价值。
nginx反向代理
第1章 需求:
公司产品app端新上线的功能,用户自己在app上上传图片,通过PC端可以读取到图片,但是app上传图片的地址是阿里云的OSS对象存储,用户可以正常访问,但是PC端上是只可以访问我们阿里云ECS服务器的地址的,安全需求比较高,不可以开放OSS地址的访问,想通过ECS来代理OSS
即访问:ecs:port/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_pass和rewrite模块的区别是:
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反向代理的主要内容,如果未能解决你的问题,请参考以下文章