Ubuntu上Nginx搭配uWSGI部署Flask访问静态图片报404咨询
问题根因
现有Nginx配置没有对静态图片请求做单独处理,所有请求都会被全量转发给后端uWSGI进程,而Flask内置的静态文件路由规则和你需要的 /myproject/static/ 访问路径不匹配,导致图片请求返回404。
可直接落地的配置方案
将现有Nginx server块替换为如下内容:
server { listen 80; server_name _; # 拦截所有静态资源请求,由Nginx直接读取本地文件返回 location ^~ /myproject/static/ { # 路径映射:将URL中的静态资源前缀对应到服务器实际存储目录 alias /myproject/static/; # 静态文件基础缓存配置,降低重复请求开销 expires 7d; add_header Cache-Control "public"; } # 原有动态请求转发逻辑保留,非静态路径请求仍交给uWSGI处理 location / { include uwsgi_params; uwsgi_pass unix:/root/myproject_sock/myproject.sock; } }
配置说明
- 用
^~修饰符标记静态路径块:匹配到/myproject/static/开头的请求时,Nginx会优先直接处理本地文件,不会把请求转发给uWSGI - 用
alias而非root做路径映射:如果误用root /myproject/,Nginx会自动拼接完整路径为/myproject/myproject/static/xxx.jpg,出现路径重复匹配的错误,alias可以精准把URL前缀替换为实际磁盘路径,刚好和你的图片存储位置对齐 - 保留原有动态请求块:所有接口、页面类的动态请求,仍然按照原逻辑通过unix socket转发给uWSGI,不影响现有Flask应用的功能
- 本配置不需要修改Flask应用本身的代码,重载配置后即可通过
http://你的服务器IP/myproject/static/images/first_image.jpg正常访问对应图片资源
上线前校验步骤
- 执行
sudo nginx -t检查Nginx配置语法是否有错误 - 确认无报错后,执行
sudo systemctl reload nginx重载配置生效,无需重启Nginx服务 - 校验目录权限:确保Ubuntu下Nginx运行用户(默认为
www-data)对/myproject、/myproject/static、/myproject/static/images三层目录有读、进入权限,对图片文件有读权限,避免出现403禁止访问的问题
内容的提问来源于stack exchange,提问作者shantanu rahut
相关产品推荐
相关产品推荐

