Docker化PHP+Nginx网站POST请求404错误排查求助
问题描述
我有一个基于PHP构建、通过Docker部署的个人网站,使用Nginx服务器并配置了SSL。运行docker compose up一段时间后,Docker Compose日志中出现POST /index.php和POST /_ignition/execute-solution的404错误,同时登录页面表单提交失败。我已尝试修改default.conf指定index index.php,但问题仍未解决。
相关日志
nginx-note | 136.*.*.* - - [22/Aug/2023:16:54:14 +0000] "GET /register HTTP/1.1" 200 11347 "https://mydomain/sessions" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" php-note | 172.19.*.* - 22/Aug/2023:16:54:25 +0000 "POST /index.php" 200 nginx-note | 136.*.*.* - - [22/Aug/2023:16:54:25 +0000] "POST /register HTTP/1.1" 200 11990 "https://mydomain/register" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" php-note | 172.19.*.* - 22/Aug/2023:16:55:26 +0000 "POST /index.php" 404 nginx-note | 109.*.*.* - - [22/Aug/2023:16:55:27 +0000] "POST /_ignition/execute-solution HTTP/1.1" 404 7988 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" phpmyadmin-note | 109.*.*.* - - [22/Aug/2023:16:55:27 +0000] "\x01\x01" 400 484 "-" "-" php-note | chattr: No such file or directory while trying to stat /etc/ld.so.preload php-note | chattr: Operation not supported while reading flags on /var/spool/cron php-note | chattr: Permission denied while setting flags on /etc/crontab php-note | bash: line 9: ufw: command not found php-note | bash: line 10: iptables: command not found php-note | bash: line 11: /proc/sys/kernel/nmi_watchdog: Read-only file system php-note | bash: line 12: /etc/sysctl.conf: Permission denied php-note | 172.19.*.* - 22/Aug/2023:16:55:27 +0000 "POST /index.php" 404 php-note | main: line 236: pkill: command not found php-note | main: line 237: pkill: command not found php-note | main: line 238: pkill: command not found
排查与解决方案
1. 清理PHP容器中的无效启动命令
日志中大量出现chattr、ufw、iptables、pkill相关错误,说明PHP容器的启动脚本包含了宿主机级别的系统操作——Docker容器默认没有这些工具,且无权修改系统级文件。
- 检查PHP容器的
Dockerfile或启动脚本(如entrypoint.sh),删除所有修改系统权限、防火墙、内核参数的命令。 - 若使用第三方PHP镜像,确认是否挂载了
/etc、/proc这类不必要的宿主机目录,直接取消此类挂载。
2. 修正Nginx的PHP请求转发配置
POST /index.php 404和表单提交失败,核心原因是Nginx未正确将请求转发到PHP-FPM,或路由规则错误。参考以下配置修改default.conf:
server { listen 443 ssl; server_name mydomain; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; root /var/www/html; index index.php index.html; # 静态文件缓存规则 location ~* \.(css|js|png|jpg|jpeg|gif|ico)$ { expires 1y; add_header Cache-Control "public, immutable"; } # PHP请求处理规则,确保Nginx能找到PHP-FPM服务 location ~ \.php$ { fastcgi_pass php-note:9000; # 需与Docker Compose中PHP服务名一致 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 框架路由重写(适用于Laravel、Symfony等单入口框架) location / { try_files $uri $uri/ /index.php?$query_string; } }
同时确认Docker Compose中Nginx与PHP服务处于同一网络,Nginx可通过服务名访问PHP-FPM的9000端口。
3. 处理/_ignition/execute-solution 404
该路径是Laravel Ignition调试工具的接口,出现404分两种情况:
- 若为Laravel项目:检查Ignition包是否正确安装,生产环境需设置
APP_DEBUG=false(此时该接口本就不存在,属于正常情况)。 - 若非Laravel项目:该请求大概率是恶意扫描,可在Nginx配置中屏蔽:
location ~* /_ignition/ { deny all; return 403; }
4. 验证网站文件权限
确保PHP容器中网站根目录(如/var/www/html)的权限正确,让PHP-FPM进程用户(通常为www-data)拥有读写权限:
- 在Dockerfile中添加:
RUN chown -R www-data:www-data /var/www/html
- 或启动容器后执行:
docker exec -it php-note chown -R www-data:www-data /var/www/html
内容的提问来源于stack exchange,提问作者M.H Rezaie
相关产品推荐
相关产品推荐

