都是Nginx前缀惹的祸,FastDFS不能访问了!

服务器
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。

[[355125]]

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

写在前面

最近在服务器上搭建了一套FastDFS集群,节点为6个。统一对外提供文件的上传和访问服务。在实际开发过程中,前端童鞋需要访问其他服务器来转发对FastDFS服务的访问,此时,前端访问FastDFS服务时多加了一个前缀,导致FastDFS服务返回400状态码。那么,我们该如何解决呢?

文章已收录到:https://gitee.com/binghe001/technology-binghe 和 https://github.com/sunshinelyz/technology-binghe 小伙伴们别忘记给我 Star 呦!!

问题重现

在服务器上搭建集群时,统一对外访问的接口为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; 
   } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

我在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; 
 } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

此时,就存在一个问题:通过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/; 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

此时,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/; 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.

此时,再次访问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/; 
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.

^~/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
    } 

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

本文转载自微信公众号「冰河技术」,可以通过以下二维码关注。转载本文请联系冰河技术公众号。

 

责任编辑:武晓燕 来源: 冰河技术
相关推荐

2014-07-18 14:10:07

WIFI华为

2009-01-07 09:22:00

2010-09-14 11:29:43

谷歌

2020-08-17 17:47:30

内存技术测试

2009-08-01 15:47:04

网线故障

2010-01-12 09:25:17

Windows 7死机系统特效

2009-04-27 13:46:30

网络管理拷贝故障

2023-09-18 07:21:18

装机误区主机

2010-11-08 13:57:46

谷歌云计算

2011-01-10 15:50:40

Hotmail系统故障脚本

2021-09-30 22:37:01

手机内存技术

2019-06-03 14:23:59

AWS宕机光纤

2016-10-14 09:17:12

2020-12-29 09:25:33

5G手机宽带

2018-09-29 08:36:55

宕机停机局域网

2013-07-22 09:43:29

2015-02-28 14:09:48

2015-10-27 14:38:40

2020-05-25 09:45:47

开发技能代码

2023-12-24 22:33:32

宕机Twitter马斯克
点赞
收藏

51CTO技术栈公众号