返回

Nginx 显示 PHP 代码?快速解决配置问题!

php

Nginx 显示 PHP 代码而不执行,通常是因为 Nginx 没有正确配置 PHP 处理。这导致 Nginx 直接将 PHP 文件作为文本文件发送给浏览器,而不是交给 PHP 解释器执行。 以下是一些常见原因和解决方案:

问题排查与解决方案

1. 缺少 PHP 处理程序

这是最常见的原因。Nginx 需要配置 fastcgi_pass 指令来告诉它如何将 PHP 文件传递给 PHP-FPM(FastCGI Process Manager)或其他 FastCGI 进程进行处理。

解决方案:

在你的 Nginx 配置文件中,找到处理 PHP 文件的 location 块。 确保正确设置了 fastcgi_pass 指令,指向你的 PHP-FPM 的 socket 文件或 IP 地址和端口。 通常,PHP-FPM 默认使用 Unix socket /var/run/php/php7.4-fpm.sock (版本号可能不同) 或者 TCP 端口 9000。

代码示例:

location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;  # 或 fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

操作步骤:

  1. 确认你的 PHP-FPM 版本和使用的 socket 文件或端口。
  2. 将上述代码中的 /var/run/php/php7.4-fpm.sock 替换为正确的 socket 路径或 127.0.0.1:9000 替换为正确的 IP 地址和端口。
  3. 重启 Nginx: sudo systemctl restart nginxsudo service nginx restart

2. 错误的 fastcgi_param SCRIPT_FILENAME 设置

SCRIPT_FILENAME 参数告诉 PHP-FPM 要执行的 PHP 文件的完整路径。如果配置错误,PHP-FPM 将无法找到文件,从而导致 "No input file specified." 或类似的错误。

解决方案:

确保 SCRIPT_FILENAME 正确设置为 $document_root$fastcgi_script_name。 这会将请求的文件路径添加到 document_root 以形成完整的路径.

代码示例:

已在上面“缺少 PHP 处理程序”部分的代码示例中包含.

3. 文件权限问题

Nginx 用户可能没有读取 PHP 文件或执行 PHP 解释器的权限。

解决方案:

检查 PHP 文件和相关目录的权限。 Nginx 用户 (通常是 www-datanginx) 需要具有读取 PHP 文件的权限。

命令行指令:

sudo chown -R www-data:www-data /var/www/html/wagholigav # 将 /var/www/html/wagholigav 替换为你 PHP 应用的根目录
sudo chmod -R 755 /var/www/html/wagholigav               # 设置适当的权限

4. PHP-FPM 未运行

如果 PHP-FPM 没有运行,Nginx 将无法将 PHP 文件传递给它处理。

解决方案:

启动或重启 PHP-FPM。

命令行指令:

sudo systemctl start php7.4-fpm  # 或 sudo service php7.4-fpm start  (版本号可能不同)

5. SELinux 配置

在启用 SELinux 的系统上,它可能会阻止 Nginx 连接到 PHP-FPM。

解决方案:

如果使用了 SELinux,可以尝试暂时禁用它进行测试, 或配置相应的策略允许 Nginx 和 PHP-FPM 通信。

setenforce 0  # 临时禁用 SELinux

更长久的方案是使用 audit2allow 命令生成并应用 SELinux 策略。

关于提供的代码示例:

提供的 Nginx 配置文件存在一些冗余和潜在冲突的 location 块。建议简化配置并确保只针对 PHP 文件使用 FastCGI 处理。 例如,所有 proxy_pass 指令可能都不必要,尤其是在处理 PHP 文件时。 try_files $uri $uri/ =404; 这行也需要仔细检查, 特别是在使用 PHP 文件时。

通过仔细检查以上几个方面,应该能够解决 Nginx 显示 PHP 代码而不是执行的问题。记住在修改 Nginx 配置文件后要重启 Nginx 服务。

安全建议:

  • 始终保持你的 Nginx 和 PHP 版本更新,以修复已知的安全漏洞。
  • 限制 Nginx 用户的访问权限,只赋予其必要的权限。
  • 定期审查 Nginx 的错误日志和访问日志,以检测潜在的安全问题.

良好的 Nginx 配置和服务器安全实践对于网站的稳定性和安全性至关重要。 通过理解上述步骤和安全建议,可以更有效地解决 PHP 代码显示问题并提高网站的安全性能。