在Ubuntu VPS上安装LEMP Stack — Nginx MySQL PHP-FPM完整配置

LEMP Stack 是搭建动态网站和Web应用最流行的服务器环境之一。LEMP 代表 Linux 操作系统、Enginx(读作"engine-x")Web服务器、MySQL 数据库和 PHP 编程语言。这四个开源组件协同工作,为网站提供高效、可靠的运行环境。

本教程将带您在 Ubuntu 22.04 LTS VPS 上完整安装 LEMP Stack,从系统更新到SSL证书配置,每个步骤都有详细说明。无论是 AsiaGB 的 VPS 还是其他服务商的服务器,本指南均适用。

1. LEMP Stack 是什么?Nginx 与 Apache 对比

LEMP Stack 用 Nginx 取代了传统 LAMP Stack 中的 Apache。这一替换带来了显著的性能差异:

特性 Nginx(LEMP) Apache(LAMP)
连接处理模型 事件驱动、非阻塞 每请求一个进程/线程
内存占用 低且稳定 随连接数增长
静态文件服务 非常快 良好
PHP 执行方式 通过 PHP-FPM(独立进程) mod_php(内置)
适合场景 资源有限的VPS、高并发场景 大量使用 .htaccess 的网站

Nginx 的事件驱动架构使其能以极少的内存处理数千个并发连接,非常适合资源受限的 VPS 环境。

2. 安装前的准备工作

开始安装前,请确保以下条件已就绪:

提示:AsiaGB 的 VPS 方案起价 500 泰铢/月,支持 Ubuntu 22.04 LTS,提供完整 Root 权限和 SSD 存储,99% 正常运行时间保证。收到账户信息后即可立即安装 LEMP Stack。

3. 更新系统软件包

通过 SSH 连接到 VPS 后,首先更新软件包列表和已安装的软件:

sudo apt update && sudo apt upgrade -y

这个过程可能需要 2-5 分钟。如果升级过程中询问关于配置文件的问题,选择保留当前版本即可。

4. 安装和配置 Nginx

从 Ubuntu 官方仓库安装 Nginx:

sudo apt install nginx -y

设置 Nginx 开机自启并启动服务:

sudo systemctl enable nginx
sudo systemctl start nginx
sudo systemctl status nginx

如果状态显示 active (running),说明 Nginx 已正常运行。在浏览器中输入 VPS 的 IP 地址,应看到 "Welcome to nginx!" 页面。

配置 UFW 防火墙

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status

⚠️ 重要:启用 UFW 前必须先允许 OpenSSH,否则将立即被锁在服务器外。如果发生这种情况,请通过 VPS 提供商的控制台访问服务器。

5. 安装 MySQL 并运行安全配置

安装 MySQL 服务器:

sudo apt install mysql-server -y

运行安全配置脚本以加固 MySQL 安装:

sudo mysql_secure_installation

脚本会询问以下问题:

创建专用数据库用户

为每个网站创建独立的 MySQL 用户,而不是使用 root:

sudo mysql

-- 创建数据库
CREATE DATABASE mywebsite CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建专用用户
CREATE USER 'webuser'@'localhost' IDENTIFIED BY '强密码';

-- 授予权限
GRANT ALL PRIVILEGES ON mywebsite.* TO 'webuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

6. 安装 PHP 和 PHP-FPM

Ubuntu 22.04 默认仓库包含 PHP 8.1,安装 PHP-FPM 和常用扩展:

sudo apt install php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd \
  php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath \
  php8.1-imagick php8.1-intl -y

验证 PHP-FPM 运行状态:

sudo systemctl status php8.1-fpm

调整 PHP 配置参数

编辑 FPM 使用的 php.ini 文件:

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

找到并修改以下值:

upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
memory_limit = 256M
max_input_vars = 3000

重启 PHP-FPM 使配置生效:

sudo systemctl restart php8.1-fpm

7. 配置 Nginx 与 PHP-FPM 的连接

编辑 Nginx 默认服务器块以启用 PHP 处理:

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

添加 PHP location 块:

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}

测试配置并重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

8. 配置虚拟主机(Server Block)

在同一台 VPS 上托管多个域名时,为每个域名创建独立的服务器块:

sudo mkdir -p /var/www/example.com/public_html
sudo chown -R $USER:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com

创建新的配置文件:

sudo nano /etc/nginx/sites-available/example.com
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    root /var/www/example.com/public_html;
    index index.php index.html;

    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js|webp|svg|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

启用站点并重新加载 Nginx:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

9. 测试 PHP 是否正常运行

创建一个 phpinfo() 测试文件:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/phpinfo.php

在浏览器中访问 http://VPS的IP/phpinfo.php,如果看到详细的 PHP 信息页面,说明 LEMP Stack 已完整安装成功。

⚠️ 测试完成后立即删除 phpinfo.php:此文件会暴露服务器的详细配置信息,绝对不能保留在生产服务器上。

sudo rm /var/www/html/phpinfo.php

10. 使用 Let's Encrypt 安装免费 SSL 证书

Let's Encrypt 提供免费的 SSL 证书。安装 Certbot 和 Nginx 插件:

sudo apt install certbot python3-certbot-nginx -y

为域名申请并自动配置 SSL 证书:

sudo certbot --nginx -d example.com -d www.example.com

Certbot 会询问您的邮箱地址、接受服务条款,并询问是否将 HTTP 请求重定向到 HTTPS(建议选择重定向)。

测试自动续期功能

sudo certbot renew --dry-run

如果没有报错,说明自动续期配置正确。证书将在到期前30天自动续期。

💡 提示:AsiaGB 也提供付费 SSL 证书(OV、EV、通配符),适合需要企业验证或覆盖所有子域名的业务场景。价格从每年 1,000 泰铢起。

11. 性能优化技巧

开启 Nginx Gzip 压缩

/etc/nginx/nginx.confhttp {} 块中添加:

gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;

调整 PHP-FPM 进程池配置

编辑 /etc/php/8.1/fpm/pool.d/www.conf(适用于 2GB 内存 VPS):

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 500

优化 MySQL InnoDB 缓冲池

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld]
innodb_buffer_pool_size = 256M
innodb_log_file_size = 64M
query_cache_size = 0
query_cache_type = 0

12. 常见问题排查

问题 解决方法
502 Bad Gateway PHP-FPM 未运行:sudo systemctl restart php8.1-fpm
403 Forbidden 权限问题:sudo chown -R www-data:www-data /var/www/html
PHP 文件被下载而非执行 缺少 location ~ \.php$ 块,或 Socket 路径不正确
MySQL 连接被拒绝 验证凭据:mysql -u webuser -p
修改配置后 Nginx 无法启动 sudo nginx -t 查看具体配置错误

13. 常见问题解答(FAQ)

LEMP Stack 是什么?与 LAMP Stack 有什么区别?

LEMP Stack 使用 Nginx(E 代表 Engine-x)替代了 LAMP Stack 中的 Apache。Nginx 的事件驱动、非阻塞 I/O 模型能以更少的内存处理更多并发连接,特别适合内存有限的 VPS 环境。LAMP 则更适合大量依赖 .htaccess 的网站。

运行 LEMP Stack 需要什么 VPS 配置?

运行单个网站的基本 LEMP Stack 至少需要 1GB 内存和 1 个 CPU 核心。WordPress 或中等流量网站建议使用 2GB 内存。AsiaGB VPS 方案起价 500 泰铢/月,提供 SSD 存储和完整 Root 权限,99% 正常运行时间保证,完全支持 LEMP Stack。

为什么 Nginx 需要 PHP-FPM 而 Apache 不需要?

Nginx 是纯粹的 HTTP 服务器,无法直接执行应用程序代码。PHP-FPM(FastCGI 进程管理器)作为独立守护进程运行,Nginx 通过 FastCGI 协议将 PHP 请求转发给它处理。这种分离架构允许独立配置和扩展各组件,实现更好的资源利用率。

LEMP Stack 可以运行 WordPress 吗?

完全可以。WordPress 与 Nginx 和 PHP-FPM 完全兼容。安装 LEMP Stack 后,创建 MySQL 数据库,下载并解压 WordPress 到网站根目录,然后配置 Nginx 服务器块,添加 try_files $uri $uri/ /index.php?$args; 以支持 WordPress 固定链接。建议安装缓存插件以获得最佳性能。

安装 LEMP 后需要配置 UFW 防火墙吗?

是的,防火墙配置是必要的安全措施。只开放必要端口:SSH(22)、HTTP(80)和 HTTPS(443)。命令:sudo ufw allow OpenSSH && sudo ufw allow 'Nginx Full' && sudo ufw enable。启用 UFW 前务必先允许 SSH,否则会被锁在服务器外面。

mysql_secure_installation 必须运行吗?

对生产服务器来说是必须的。默认安装的 MySQL 存在匿名用户账户和测试数据库等安全隐患。安全安装脚本会删除匿名用户、禁用远程 root 登录、删除测试数据库,这些都是保护面向互联网的服务器的关键步骤。

立即开始您的 LEMP Stack VPS 之旅

AsiaGB VPS 起价 500 泰铢/月,提供完整 Root 权限、SSD 存储、99% 正常运行时间。泰国和新加坡数据中心可选。

查看 VPS 方案