You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Nginx部署Symfony时静态文件返回404问题排查

解决Symfony+Nginx Docker部署中静态文件404的问题

我帮你排查这个问题!从你描述的“Nginx提示/var/www/symfony/public/style.css不存在,但文件确实存在”来看,核心问题大概率出在Nginx配置的路径指向或者权限上,咱们一步步来定位:

最常见的错误:Root路径指向错误

这是Symfony部署Nginx时最容易踩的坑——你可能把Nginx的root指令设成了项目根目录/var/www/symfony,而不是Symfony的静态文件根目录/var/www/symfony/public。

举个例子:如果你的root是/var/www/symfony,当请求style.css时,Nginx会去查找/var/www/symfony/style.css,但实际文件在/var/www/symfony/public/style.css,自然会返回404。

正确的Nginx配置示例

给你一个适配Symfony的基础default.conf配置,重点看root和try_files部分:

server {
    listen 80;
    server_name localhost;

    # 关键:Root必须指向Symfony的public目录
    root /var/www/symfony/public;
    index index.php index.html;

    location / {
        # 优先匹配存在的文件/目录,否则转发到index.php处理
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # PHP请求处理,注意fastcgi_pass要对应你的PHP容器名称(比如php:9000)
    location ~ ^/index\.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 禁止访问隐藏文件(除了well-known)
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

后续排查步骤

  • 验证Root路径:打开你的default.conf,确认root指向的是/var/www/symfony/public,而不是项目根目录。
  • 检查权限:进入Docker容器,执行以下命令确保Nginx用户(通常是www-data)能读取静态文件:
    chown -R www-data:www-data /var/www/symfony/public
    chmod -R 644 /var/www/symfony/public
    
  • 重启服务:修改配置后,重启Docker容器或者Nginx服务,确保配置生效:
    # 重启容器(假设你的服务名是nginx)
    docker-compose restart nginx
    
  • 确认try_files指令:确保location /块里的try_files是try_files $uri $uri/ /index.php$is_args$args;,这个指令的逻辑就是先找存在的文件,找不到再转发到index.php,和你预期的一致。

如果按照上面的步骤调整后,静态文件应该就能正常访问了。

内容的提问来源于stack exchange,提问作者dominikweber

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:02:17