如何让Nginx从另一个Docker容器提供Symfony上传文件服务
问题解决:Nginx无法访问PHP容器中上传的图片文件
问题根源
上传的图片仅存储在PHP容器的/app/public/uploads目录,Nginx容器无此目录访问权限;同时Nginx配置中/uploads位置的规则错误(同时使用fastcgi_pass和proxy_pass,逻辑冲突)。
修复步骤
1. 用Docker卷共享上传目录
让PHP和Nginx容器共享uploads目录,确保两边都能访问到上传的文件。修改docker-compose.yml:
version: '3' services: php: # 其他配置保持不变 volumes: # 原有卷配置... - uploads_volume:/app/public/uploads nginx: # 其他配置保持不变 volumes: # 原有卷配置... - uploads_volume:/app/public/uploads # 在文件末尾添加卷定义 volumes: uploads_volume:
2. 修正Nginx的/uploads位置配置
删除原有的冲突配置,让Nginx直接处理静态文件:
# 替换原有的location /uploads块 location /uploads { expires 30d; access_log off; log_not_found off; add_header Cache-Control "public, immutable"; }
说明:Nginx的root已设置为/app/public,此配置会直接从/app/public/uploads读取文件,无需转发到PHP容器。
3. 确保上传目录权限正确
在PHP镜像的Dockerfile中添加目录创建和权限设置,保证nginx用户可读写:
FROM MyOwnTaggedImage:latest as php # 原有配置... RUN mkdir -p /app/public/uploads && chown nginx:www-data /app/public/uploads && chmod 755 /app/public/uploads # 原有配置...
4. 验证修复
重启所有容器:
docker-compose down && docker-compose up -d --build
上传一张图片后,访问对应URL(如http://localhost/uploads/test.jpg),确认图片可正常显示。
内容的提问来源于stack exchange,提问作者Jorge
相关产品推荐
相关产品推荐

