凌峰创科服务平台

Linux服务器如何快速配置PHP环境?

我们将以目前最主流的 Nginx + PHP-FPM 组合为例进行讲解,因为它比传统的 Apache + mod_php 在性能和资源利用上更具优势,我也会简要提及 Apache 的配置方法。

Linux服务器如何快速配置PHP环境?-图1
(图片来源网络,侵删)

目录

  1. 准备工作
  2. 安装 Nginx Web 服务器
  3. 安装 PHP 和 PHP-FPM
  4. 配置 Nginx 与 PHP-FPM 协同工作
  5. 配置 PHP (php.ini)
  6. 配置 PHP-FPM (www.conf)
  7. 启动服务并测试
  8. 生产环境优化建议
  9. 常见问题与排查

准备工作

你需要一台已经安装好 Linux 发行版的服务器,这里我们以 Ubuntu 22.04 为例,CentOS/Rocky Linux 的命令会有所不同(主要包管理器是 yumdnf)。

更新系统包列表:

sudo apt update
sudo apt upgrade -y

安装一些基础工具:

sudo apt install -y curl wget gnupg2 software-properties-common lsb-release ca-certificates

安装 Nginx Web 服务器

Nginx 是一个高性能的 HTTP 和反向代理服务器。

Linux服务器如何快速配置PHP环境?-图2
(图片来源网络,侵删)
sudo apt install -y nginx

启动 Nginx 并设置为开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

检查 Nginx 状态:

sudo systemctl status nginx

你应该看到 active (running) 的状态。

测试 Nginx: 在浏览器中访问你的服务器 IP 地址,http://your_server_ip,如果看到 "Welcome to nginx!" 页面,说明 Nginx 安装成功。

Linux服务器如何快速配置PHP环境?-图3
(图片来源网络,侵删)

(可选)配置防火墙 如果你的服务器启用了 UFW (Uncomplicated Firewall),需要允许 HTTP 和 HTTPS 流量。

sudo ufw allow 'Nginx Full'
sudo ufw reload

安装 PHP 和 PHP-FPM

PHP-FPM (FastCGI Process Manager) 是一个 PHP 的 FastCGI 实现,它被设计用来处理高负载的网站,并能更有效地管理资源。

添加 Ondřej Surý 的 PPA (Personal Package Archive) 这是 Ubuntu 上安装最新稳定版 PHP 最推荐的方式。

# 添加仓库
sudo add-apt-repository ppa:ondrej/php -y
# 更新包列表
sudo apt update

安装 PHP 和必要的扩展 我们将安装 PHP 8.2(当前 LTS 版本)和一些最常用的扩展,请根据你的项目需求增减扩展。

# 安装 PHP 8.2 和 FPM
sudo apt install -y php8.2 php8.2-fpm
# 安装常用扩展
sudo apt install -y php8.2-cli php8.2-mysql php8.2-xml php8.2-curl php8.2-gd php8.2-mbstring php8.2-zip php8.2-intl php8.2-bcmath

检查 PHP 版本

php -v

你应该能看到 PHP 8.2 的版本信息。

检查 PHP-FPM 状态

sudo systemctl status php8.2-fpm

确保状态为 active (running)


配置 Nginx 与 PHP-FPM 协同工作

现在我们需要告诉 Nginx 如何将 PHP 请求转发给 PHP-FPM 处理。

创建一个新的 Nginx 配置文件 我们为你的网站创建一个独立的配置文件,而不是修改默认的 default 配置。

sudo nano /etc/nginx/sites-available/my_project

粘贴到文件中:**

server {
    listen 80;
    server_name your_domain.com; # 替换成你的域名或 IP
    root /var/www/my_project;    # 替换成你的网站根目录
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }
    # 将所有 .php 文件的请求转发给 PHP-FPM
    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # 这一行会根据你安装的 PHP 版本自动指向正确的 socket
        # 如果手动指定,通常是 /var/run/php/php8.2-fpm.sock
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
    }
    # 禁止访问 .htaccess 文件
    location ~ /\.ht {
        deny all;
    }
}

配置说明:

  • server_name: 你的域名或服务器 IP。
  • root: 你的网站代码存放的目录,这个目录需要你手动创建。
  • index: 默认的首页文件,index.php 被放在第一位。
  • try_files: 这是 Nginx 的一个重要指令,它会按顺序尝试查找文件或目录,如果找不到,它会将请求重写到 /index.php,这对于框架(如 Laravel, WordPress)至关重要。
  • location ~ \.php$: 这个块匹配所有以 .php 结尾的 URI。
  • include snippets/fastcgi-php.conf: 这个文件包含了与 PHP-FPM 通信所需的基本配置。
  • fastcgi_pass: 将请求转发给 PHP-FPM,我们使用 Unix socket,因为它比 TCP/IP 环回接口更快,路径 /var/run/php/php8.2-fpm.sock 是 Ubuntu 上的标准路径,如果你的 PHP 版本不同,请相应修改。

启用新的网站配置

# 创建网站根目录
sudo mkdir -p /var/www/my_project
# 给目录设置合适的权限
sudo chown -R www-data:www-data /var/www/my_project
sudo chmod -R 755 /var/www/my_project
# 启用配置(创建符号链接到 sites-enabled)
sudo ln -s /etc/nginx/sites-available/my_project /etc/nginx/sites-enabled/
# 删除默认配置(可选)
sudo rm /etc/nginx/sites-enabled/default
# 测试 Nginx 配置语法
sudo nginx -t

如果看到 syntax is oktest is successful,说明配置正确。

重新加载 Nginx

sudo systemctl reload nginx

配置 PHP (php.ini)

php.ini 是 PHP 的主配置文件,用于调整 PHP 的各种行为。

找到 php.ini 的位置

# 对于 CLI (命令行)
php --ini
# 对于 FPM
ls /etc/php/8.2/fpm/php.ini

FPM 的配置文件在 /etc/php/8.2/fpm/php.ini

编辑 php.ini

sudo nano /etc/php/8.2/fpm/php.ini

一些重要的配置项:

  • upload_max_filesize = 32M: 上传文件的最大大小。
  • post_max_size = 32M: POST 数据的最大大小,通常应该等于或大于 upload_max_filesize
  • memory_limit = 256M: 单个 PHP 脚本可以使用的最大内存。
  • max_execution_time = 30: 脚本最大执行时间(秒)。
  • date.timezone = "Asia/Shanghai": 设置时区,非常重要!
  • display_errors = Off: 生产环境务必设置为 Off,避免敏感信息泄露,开发环境可以设置为 On
  • error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT: 设置错误报告级别。

修改后,需要重启 PHP-FPM 使配置生效

sudo systemctl restart php8.2-fpm

配置 PHP-FPM (www.conf)

www.conf 用于配置 PHP-FPM 的工作进程池。

编辑 www.conf

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

一些重要的配置项:

  • listen = /var/run/php/php8.2-fpm.sock: 确保 listen 指令与 Nginx 配置中的 fastcgi_pass 路径一致。
  • listen.owner = www-data
  • listen.group = www-data
  • listen.mode = 0660: 确保 Nginx 用户 (www-data) 对 socket 文件有读写权限。
  • pm = dynamic: 进程管理方式,dynamic 是推荐的方式,它会根据负载动态创建和销毁进程。
  • pm.max_children = 50: 最大子进程数。
  • pm.start_servers = 2: 启动时创建的进程数。
  • pm.min_spare_servers = 1: 最小空闲进程数。
  • pm.max_spare_servers = 3: 最大空闲进程数。
  • pm.max_requests = 500: 每个子进程处理 500 个请求后会被重新启动,可以防止内存泄漏。

修改后,需要重启 PHP-FPM

sudo systemctl restart php8.2-fpm

启动服务并测试

创建一个测试文件 在网站根目录下创建一个 info.php 文件。

sudo nano /var/www/my_project/info.php
```如下:
```php
<?php
phpinfo();
?>

保存并退出。

在浏览器中访问 在浏览器中访问 http://your_domain_or_ip/info.php

你应该能看到一个详细的 PHP 信息页面,这证明了 Nginx 和 PHP-FPM 已经成功协同工作。

安全建议 测试完成后,立即删除 info.php 文件,因为它会暴露你的 PHP 环境配置信息,带来安全风险。

sudo rm /var/www/my_project/info.php

生产环境优化建议

  1. 使用 PHP OPcache: OPcache 是一个内置的缓存器,用于存储预编译的脚本字节码,能极大地提升 PHP 的性能。

    • 安装扩展:sudo apt install php8.2-opcache
    • 编辑 php.ini,取消并修改以下配置:
      opcache.enable=1
      opcache.memory_consumption=128
      opcache.max_accelerated_files=10000
      opcache.revalidate_freq=2
      opcache.fast_shutdown=1
    • 重启 PHP-FPM: sudo systemctl restart php8.2-fpm
  2. 配置 HTTPS: 使用 Let's Encrypt 免费证书为你的域名配置 HTTPS,这是现代网站的标配。

    • 安装 Certbot: sudo apt install certbot python3-certbot-nginx
    • 获取证书: sudo certbot --nginx -d your_domain.com
  3. 监控和日志: 定期检查 Nginx 和 PHP-FPM 的错误日志。

    • Nginx 错误日志: /var/log/nginx/error.log
    • PHP-FPM 错误日志: 在 www.conf 中配置 error_log = /var/log/php8.2-fpm.log

常见问题与排查

  • 问题 1: 403 Forbidden 错误

    • 原因: Nginx 没有权限访问网站目录下的文件。
    • 解决: 检查目录和文件的所有者是否为 www-data,权限是否正确,使用 sudo chown -R www-data:www-www /var/www/my_projectsudo chmod -R 755 /var/www/my_project 修复。
  • 问题 2: 502 Bad Gateway 错误

    • 原因: Nginx 无法连接到 PHP-FPM,通常是 fastcgi_pass 的路径不正确,或者 PHP-FPM 服务没有运行。
    • 解决:
      1. 检查 PHP-FPM 状态: sudo systemctl status php8.2-fpm
      2. 检查 Nginx 配置中的 fastcgi_pass 路径是否与 www.conf 中的 listen 路径完全一致。
      3. 检查 PHP-FPM 的错误日志,看是否有报错。
  • 问题 3: PHP 文件直接下载,而不是执行

    • 原因: Nginx 没有将 .php 文件正确地转发给 PHP-FPM。
    • 解决: 仔细检查 Nginx 配置文件中的 location ~ \.php$ 块,确保配置正确无误,使用 sudo nginx -t 测试语法。
  • 问题 4: White Screen of Death (WSOD)

    • 原因: PHP 代码有致命错误,但 display_errors 被设置为 Off,所以你看不到任何错误信息。
    • 解决:
      1. 临时解决: 将 php.ini 中的 display_errors 设置为 On,然后刷新页面查看具体错误。
      2. 根本解决: 修复代码中的错误,然后将 display_errors 设置回 Off
      3. 查看错误日志:tail -f /var/log/php8.2-fpm.log

这个指南涵盖了从零开始配置一个功能完整的 PHP 生产环境的所有关键步骤,希望对你有帮助!

分享:
扫描分享到社交APP
上一篇
下一篇