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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:14:51