1. 概述

在使用 Nginx 搭建 PHP 应用服务器时,如果配置不当,访问 PHP 文件时浏览器会提示下载,而不是执行。这是因为 Nginx 默认不处理 PHP 请求。

本文将介绍如何配置 Nginx,使其能够正确执行 PHP 文件,从而顺利运行 PHP 应用。

2. 问题原理

PHP 是一个独立于 Nginx 的程序,它与 Nginx 或 Apache 等主流 Web 服务器之间没有开箱即用的集成机制。要解决 PHP 文件被下载的问题,我们需要安装并配置 PHP-FPM(FastCGI 进程管理器),并让 Nginx 将 PHP 请求转发给 PHP-FPM 处理。

否则,Nginx 会将 PHP 文件当作静态资源(如 HTML 或 CSS)返回给客户端,从而导致文件被下载而不是执行。

3. 前置条件

在开始配置之前,请确保以下组件已安装:

✅ 安装 Nginx

$ nginx -v
nginx version: nginx/1.24.0

✅ 安装 PHP-FPM(以 Debian/Ubuntu 为例)

$ sudo apt install php-fpm

确认安装完成后,我们就可以开始配置 Nginx 与 PHP-FPM 的联动了。

4. 配置 Nginx 执行 PHP 文件

4.1. 修改 Nginx Server Block

Nginx 的配置文件通常位于 /etc/nginx/sites-available/ 目录下,主配置文件名为 default。我们在这个文件的 server 块中添加对 PHP 的支持。

默认的 server 块可能如下所示:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.html index.htm;

    server_name _;
    location / {
        try_files $uri $uri/ =404;
    }

    # other configurations
}

4.2. 添加 PHP 处理配置

使用 nano 编辑配置文件:

$ sudo nano /etc/nginx/sites-available/default

修改 index 行,加入 index.php

index index.php index.html index.htm;

然后在 server 块中添加如下 location 配置,以处理 .php 文件:

location ~* \.php$ {
    fastcgi_index   index.php;
    fastcgi_pass    unix:/var/run/php/php-fpm.sock;
    include         fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
}

✅ 配置说明:

  • location ~* \.php$:匹配所有以 .php 结尾的请求,~* 表示不区分大小写的正则匹配
  • fastcgi_index index.php:设置默认 PHP 入口文件
  • fastcgi_pass:将 PHP 请求通过 Unix 套接字转发给 PHP-FPM 处理
  • include fastcgi_params:包含 FastCGI 必要的参数
  • fastcgi_param SCRIPT_FILENAME ...:指定要执行的 PHP 脚本路径
  • fastcgi_param SCRIPT_NAME ...:设置请求的脚本路径

修改后的完整配置如下:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html;
    index index.php index.html index.htm;

    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~* \.php$ {
        fastcgi_index   index.php;
        fastcgi_pass    unix:/var/run/php/php-fpm.sock;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
    }
}

保存并关闭文件。

4.3. 测试与重启 Nginx

✅ 检查配置语法是否正确

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

✅ 重启 Nginx 生效配置

$ sudo systemctl restart nginx

✅ 创建测试文件 index.php

在网站根目录下创建测试文件:

<?php
phpinfo();
?>

✅ 访问测试页面

打开浏览器访问 http://localhost,如果看到 PHP 信息页面,说明配置已成功生效 ✅

5. 小结

通过本文,我们完成了以下关键配置:

  • 安装了 PHP-FPM
  • 修改了 Nginx 的 server block
  • 添加了处理 PHP 的 location 块
  • 验证了配置的正确性

现在你的 Nginx 已能正确执行 PHP 文件,避免了“下载 PHP 文件”这类常见问题。如果你在配置过程中遇到权限或路径问题,记得检查 php-fpm.sock 文件是否存在,以及 Nginx 用户是否具有相应读写权限。


原始标题:Execute PHP Files Instead of Downloading in Nginx