都是Nginx前缀FastDFS无法访问

问题重现

在服务器上搭建集群时,统一对外访问的接口为http://192.168.175.110,前端童鞋访问时,是通过http://192.168.175.101访问的,并且前端加了一个前缀file,也就是通过http://192.168.175.101/file来访问的。第一时间我想到的是直接将前端的请求通过Nginx转发到192.168.175.110服务器。在192.168.175.101服务器上简化后的Nginx配置如下所示。

upstream file { 
    server 192.168.175.110:80 max_fails=3; 
} 
 
server { 
    listen       80; 
    server_name  192.168.175.101; 
     location / { 
  root   html; 
  index  index.html index.htm; 
  #允许cros跨域访问  
  add_header 'Access-Control-Allow-Origin' '*'; 
  #proxy_redirect default; 
  #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。 
  proxy_connect_timeout 10; 
     } 
     
   location ~/file { 
 add_header 'Access-Control-Allow-Origin' '*'; 
 add_header 'Access-Control-Allow-Credentials' 'true'; 
 proxy_pass                  http://file; 
 proxy_set_header Host $host:$server_port; 
   } 
} 

我在192.168.175.110服务器上配置的Ngin如下所示。

server { 
 listen       80; 
 server_name  192.168.175.110; 
 #charset koi8-r; 
 #access_log  logs/host.access.log  main; 
 location / { 
     root   html; 
     index  index.html index.htm; 
     #允许cros跨域访问  
     add_header 'Access-Control-Allow-Origin' '*'; 
     #proxy_redirect default; 
     #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。 
     proxy_connect_timeout 10; 
 }   
 location ~/group([0-9]){ 
  root /data/fastdfs/storage/data; 
  ngx_fastdfs_module; 
 } 
} 

此时,就存在一个问题:通过file前缀将请求转发到192.168.175.110服务器时,会返回400状态码。

其实,问题的定位也比较简单,就是前端访问时多加了一个file前缀。那么,我们该如何解决这个问题呢?

问题解决

一般情况下,Nginx的反向代理,只会替换域名或者IP部分,其他部分会按照原样进行转发。也就是说,前端访问http://192.168.175.101/file时,会被转发到http://192.168.175.110/file上,从而无法正常访问文件服务接口。

既然定位到问题了,那我们下一步就是要解决这个问题。思路也比较简单,就是在192.168.175.101服务器上接收到请求时将file前缀去掉。那如何去掉呢?

其实也很简单,只需要在192.168.175.101服务器上的Nginx上添加如下配置。

location ^~/file/ { 
 proxy_set_header Host $host; 
 proxy_set_header  X-Real-IP        $remote_addr; 
 proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
 proxy_set_header X-NginX-Proxy true; 
 proxy_pass http://file/; 
} 

此时,192.168.175.101服务器上的Nginx配置如下所示。

upstream file { 
    server 192.168.175.110:80 max_fails=3; 
} 
 
server { 
    listen       80; 
    server_name  192.168.175.101; 
     location / { 
  root   html; 
  index  index.html index.htm; 
  #允许cros跨域访问  
  add_header 'Access-Control-Allow-Origin' '*'; 
  #proxy_redirect default; 
  #跟代理服务器连接的超时时间,必须留意这个time out时间不能超过75秒,当一台服务器当掉时,过10秒转发到另外一台服务器。 
  proxy_connect_timeout 10; 
     } 
     
      location ^~/file/ { 
        proxy_set_header Host $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
        proxy_set_header X-NginX-Proxy true; 
        proxy_pass http://file/; 
    } 
} 

此时,再次访问http://192.168.175.101/file时,就被转发到http://192.168.175.110上,能够正确访问文件服务接口。

知识扩展

nginx反向代理配置如何去除前缀?

使用Nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:

方法一:加"/"

upstream pay { 
  server localhost:8089 weight=5; 
} 
upstream order { 
  server localhost:8090 weight=5; 
} 
server { 
    listen              80; 
    server_name         binghe.com; 
 
    location ^~/pay/ { 
        proxy_set_header Host $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
        proxy_set_header X-NginX-Proxy true; 
 
        proxy_pass http://pay/; 
    } 
 
    location ^~/order/ { 
        proxy_set_header Host $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
        proxy_set_header X-NginX-Proxy true; 
 
        proxy_pass http://order/; 
    } 
} 

^~/pay/表示匹配前缀是pay的请求,proxy_pass的结尾有/, 则会把/pay/*后面的路径直接拼接到后面,即移除pay。

方法二:rewrite

upstream pay { 
  server localhost:8089 weight=5; 
} 
upstream order { 
  server localhost:8090 weight=5; 
} 
 
server { 
    listen              80; 
    server_name  binghe.com; 
 
    location ^~/pay/ { 
        proxy_set_header Host $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
        proxy_set_header X-NginX-Proxy true; 
 
        rewrite ^/user/(.*)$ /$1 break; 
        proxy_pass http://pay; 
    } 
 
    location ^~/order/ { 
        proxy_set_header Host $host; 
        proxy_set_header  X-Real-IP        $remote_addr; 
        proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for; 
        proxy_set_header X-NginX-Proxy true; 
 
        rewrite ^/order/(.*)$ /$1 break; 
        proxy_pass http://order; 
    } 
} 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值