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

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

问题重现

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

微信图片_20211120131255.jpg

其实,问题的定位也比较简单,就是前端访问时多加了一个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上,能够正确访问文件服务接口。

微信图片_20211120131259.jpg

知识扩展

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

相关文章
|
18天前
|
监控 应用服务中间件 定位技术
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
要统计Nginx的客户端IP,可以通过分析Nginx的访问日志文件来实现
|
28天前
|
安全 应用服务中间件 网络安全
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
如何测试Nginx反向代理实现SSL加密访问的配置是否正确?
52 3
|
28天前
|
安全 应用服务中间件 网络安全
配置Nginx反向代理实现SSL加密访问的步骤是什么?
我们可以成功地配置 Nginx 反向代理实现 SSL 加密访问,为用户提供更安全、可靠的网络服务。同时,在实际应用中,还需要根据具体情况进行进一步的优化和调整,以满足不同的需求。SSL 加密是网络安全的重要保障,合理配置和维护是确保系统安全稳定运行的关键。
102 3
|
1月前
|
Web App开发 算法 应用服务中间件
nginx开启局域网https访问
【10月更文挑战第22天】为了调试WebRTC功能,需要在局域网内搭建HTTPS协议。具体步骤包括:在已部署Nginx和安装OpenSSL的环境中生成私钥、证书签名请求和自签名证书;将生成的文件放置到Nginx的证书目录并修改Nginx配置文件,最后重启Nginx服务。注意,自签名证书不受第三方机构认可,如需正式使用,需向CA申请签名。
|
2月前
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
|
4月前
|
应用服务中间件 nginx Docker
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
这篇文章介绍了如何通过域名在本地访问虚拟机上的nginx服务,包括创建nginx容器、修改配置文件、修改本地host文件以及进行访问测试的详细步骤。文章提供了具体的Docker命令来创建并配置nginx容器,展示了配置文件的修改示例,说明了如何在本地系统的hosts文件中添加虚拟机IP和自定义域名,以及如何通过浏览器进行测试访问。
本地通过域名访问虚拟机上nginx的服务、搭建域名访问环境一(反向代理配置)
|
3月前
|
Ubuntu 应用服务中间件 数据库
Nginx配置:阻止非国内IP地址访问的设置方法
此外,出于用户隐私和法律合规性的考虑,应慎重考虑阻止特定国家或地区IP地址的决策。在某些情况下,这可能被视为歧视性或违反当地法律。
208 2
|
4月前
|
负载均衡 前端开发 应用服务中间件
FastDFS+Nginx+fastdfs-nginx-module集群搭建
FastDFS+Nginx+fastdfs-nginx-module集群搭建
|
4月前
|
JavaScript 应用服务中间件 PHP
nginx server 禁止特定目录下的某类文件访问
【8月更文挑战第26天】这段Nginx配置代码旨在保护`/uploads/`目录下的文件,禁止执行任何`.php`, `.html`, `.htm`, 或 `.js`等潜在有害文件,即便被访问也无法运行。取而代之的是重定向到首页。为了实现这一设置,用户需要定位到对应子域名的`.conf`配置文件中进行相应修改。若网站支持多个访问域名,则需确保在正确的`.conf`文件中实施此配置。
108 1
|
4月前
|
应用服务中间件 Linux nginx
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?
在Linux中,如何统计ip访问情况?分析 nginx 访问日志?如何找出访问页面数量在前十位的ip?