Docker中php:8.2.1-cli容器静态资源缓存配置求助
解决PHP内置服务器静态资源无缓存问题
你的核心问题是用了PHP内置HTTP服务器——这个服务器仅用于开发调试,完全没有静态资源缓存功能,所以你之前尝试的meta标签、opcache等方案都无法解决图片、CSS、字体这类静态资源的缓存问题。必须切换到生产级Web服务器(如Nginx)配合PHP-FPM的架构部署,以下是具体Docker配置方案:
1. 重构Docker架构(Nginx + PHP-FPM)
放弃直接用php:8.2.1-cli启动内置服务器,改用php:8.2.1-fpm处理PHP脚本,Nginx负责接收请求、处理静态资源缓存并转发PHP请求给FPM。
目录结构示例
your-project/ ├── docker-compose.yml ├── nginx/ │ └── default.conf └── src/ # 你的网站代码目录 ├── index.php ├── css/ ├── images/ └── fonts/
编写docker-compose.yml
version: '3.8' services: php-fpm: image: php:8.2.1-fpm volumes: - ./src:/var/www/html # 挂载本地代码目录到容器内 # 如需安装PHP扩展(如gd、zip),可添加command字段执行docker-php-ext-install命令 nginx: image: nginx:alpine ports: - "80:80" # 映射宿主机80端口到容器 volumes: - ./src:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf # 挂载Nginx配置文件 depends_on: - php-fpm
2. 配置Nginx静态资源缓存
在nginx/default.conf中添加静态资源缓存规则,设置缓存过期时间和控制头:
server { listen 80; server_name localhost; root /var/www/html; index index.php index.html; # 图片类资源缓存配置 location ~* \.(jpg|jpeg|png|gif|svg|webp|ico)$ { expires 30d; # 缓存30天 add_header Cache-Control "public, immutable"; } # CSS/JS资源缓存配置 location ~* \.(css|js)$ { expires 7d; # 缓存7天 add_header Cache-Control "public, immutable"; } # 字体文件缓存配置 location ~* \.(woff|woff2|ttf|eot)$ { expires 180d; # 缓存半年 add_header Cache-Control "public, immutable"; } # 转发PHP请求到FPM location ~ \.php$ { fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 路由 fallback 处理 location / { try_files $uri $uri/ /index.php?$query_string; } }
3. 部署与验证
- 将网站代码放入
src目录 - 在项目根目录执行命令:
docker-compose up -d - 访问
http://localhost,打开Chrome开发者工具的网络面板,刷新页面后查看静态资源的状态:- 首次加载显示
200 OK,响应头包含Cache-Control和Expires字段 - 再次刷新显示
304 Not Modified,说明缓存生效
- 首次加载显示
关键说明
immutable头告诉浏览器:缓存过期前无需发送验证请求(如If-Modified-Since),进一步提升加载效率- 可根据资源更新频率调整
expires时间:比如频繁修改的CSS/JS设短周期,长期不变的字体、图片设长周期 - Nginx处理静态资源是核心强项,配合PHP-FPM的架构是生产环境标准配置,性能远高于PHP内置服务器
内容的提问来源于stack exchange,提问作者Nokt
相关产品推荐
相关产品推荐

