LEMP 环境搭建完全指南(Nginx + MariaDB + PHP)
前言
LEMP 是 Linux + Nginx + MariaDB(或 MySQL)+ PHP 的缩写,是搭建动态网站和 Web 应用最流行的技术栈之一。与传统的 LAMP(Apache)相比,Nginx 在高并发场景下表现更出色,内存占用更少,配置也更简洁。
本文将详细介绍如何在 Ubuntu 22.04 LTS 上从零搭建一套完整的 LEMP 环境,涵盖 Nginx 安装配置、MariaDB 数据库部署、PHP-FPM 集成、虚拟主机配置、性能优化和安全加固等各个环节。
一、准备工作
1.1 系统要求
- Ubuntu 22.04 LTS(或其他 Debian 系 Linux 发行版)
- 至少 1GB 内存(推荐 2GB+)
- 至少 10GB 可用磁盘空间
root 权限或具有 sudo 权限的用户
1.2 更新系统包
在开始安装之前,先更新系统软件包索引:
1 2
| sudo apt update sudo apt upgrade -y
|
二、安装 Nginx
2.1 通过 apt 安装
Ubuntu 22.04 默认仓库中的 Nginx 版本较新,直接安装即可:
1
| sudo apt install nginx -y
|
2.2 验证安装
1 2 3 4 5
| nginx -v
sudo systemctl status nginx
|
如果一切正常,你应该能在浏览器中通过服务器 IP 地址看到 Nginx 的默认欢迎页面。
2.3 Nginx 配置文件结构
1 2 3 4 5 6 7
| /etc/nginx/ ├── nginx.conf ├── sites-available/ ├── sites-enabled/ ├── conf.d/ ├── modules-enabled/ └── modules-available/
|
三、安装 MariaDB
3.1 安装 MariaDB 服务器
1
| sudo apt install mariadb-server mariadb-client -y
|
3.2 安全初始化配置
MariaDB 安装完成后,运行安全初始化脚本:
1
| sudo mysql_secure_installation
|
这个脚本会引导你完成以下安全设置:
- 设置 root 密码(推荐使用强密码)
- 移除匿名用户
- 禁止 root 远程登录
- 移除测试数据库
- 重新加载权限表
3.3 验证安装
1 2 3 4 5
| sudo systemctl status mariadb
sudo mysql -u root -p
|
登录成功后,执行 SHOW DATABASES; 应能看到默认数据库列表。
四、安装 PHP 及 PHP-FPM
4.1 安装 PHP 核心包
1
| sudo apt install php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip php-bcmath php-intl -y
|
说明:php-fpm 是 PHP 的 FastCGI 进程管理器,Nginx 通过它来处理 PHP 请求。其他扩展根据需要安装,上述列表覆盖了大多数 Web 应用(如 WordPress、Laravel)的常用扩展。
4.2 验证 PHP 安装
4.3 检查 PHP-FPM 服务状态
1
| sudo systemctl status php8.1-fpm
|
Ubuntu 22.04 默认安装 PHP 8.1,所以服务名是 php8.1-fpm。PHP-FPM 默认监听 Unix Socket:/run/php/php8.1-fpm.sock。
五、配置 Nginx 集成 PHP
5.1 默认站点配置
编辑默认站点配置文件:
1
| sudo nano /etc/nginx/sites-available/default
|
修改为以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| 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$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; }
location ~ /\.ht { deny all; } }
|
5.2 测试配置并重启
1 2 3 4 5
| sudo nginx -t
sudo systemctl reload nginx
|
5.3 创建 PHP 测试文件
1
| echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
|
在浏览器中访问 http://服务器IP/info.php,如果能正常显示 PHP 信息页面,说明 LEMP 环境搭建成功。
安全提醒:测试完成后,务必删除 info.php 文件,因为它会暴露服务器敏感信息:
1
| sudo rm /var/www/html/info.php
|
六、配置虚拟主机(Server Block)
6.1 创建站点目录
1 2
| sudo mkdir -p /var/www/example.com/public_html sudo chown -R $USER:$USER /var/www/example.com/public_html
|
6.2 创建虚拟主机配置
1
| sudo nano /etc/nginx/sites-available/example.com
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| server { listen 80; listen [::]:80;
root /var/www/example.com/public_html; index index.php index.html index.htm;
server_name example.com www.example.com;
location / { try_files $uri $uri/ =404; }
location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; }
location ~ /\.ht { deny all; }
gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml; gzip_min_length 1000; gzip_vary on; }
|
6.3 启用站点
1 2 3 4 5 6 7 8
| sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
|
6.4 创建测试页面
1
| echo "<?php echo 'Hello, LEMP Stack!'; ?>" > /var/www/example.com/public_html/index.php
|
七、数据库配置
7.1 创建数据库和用户
1 2 3 4 5
| CREATE DATABASE example_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'example_user'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON example_db.* TO 'example_user'@'localhost'; FLUSH PRIVILEGES; EXIT;
|
7.2 MariaDB 配置文件优化
编辑 /etc/mysql/mariadb.conf.d/50-server.cnf,根据服务器内存调整:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| [mysqld]
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
key_buffer_size = 256M max_allowed_packet = 64M table_open_cache = 400 sort_buffer_size = 2M net_buffer_length = 64K read_buffer_size = 2M read_rnd_buffer_size = 8M myisam_sort_buffer_size = 128M
innodb_buffer_pool_size = 1G innodb_log_file_size = 256M innodb_flush_log_at_trx_commit = 2 innodb_file_per_table = 1
|
注意:innodb_buffer_pool_size 应根据服务器实际内存调整。对于 4GB 内存的服务器,建议设为 2-2.5GB。
八、性能优化
8.1 Nginx 性能调优
编辑 /etc/nginx/nginx.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| user www-data; worker_processes auto; worker_rlimit_nofile 65535;
events { worker_connections 4096; use epoll; multi_accept on; }
http { sendfile on; tcp_nopush on; tcp_nodelay on;
keepalive_timeout 65; keepalive_requests 1000;
client_body_buffer_size 128k; client_max_body_size 20m;
gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_proxied any; gzip_vary on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml text/javascript; server_tokens off; }
|
8.2 PHP-FPM 性能调优
编辑 /etc/php/8.1/fpm/pool.d/www.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13
| pm = dynamic
pm.max_children = 50
pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 15
pm.max_requests = 500
|
计算参考:每个 PHP-FPM 进程大约占用 30-50MB 内存。对于 2GB 内存的服务器,pm.max_children 建议设为 30-40。
8.3 PHP 配置优化
编辑 /etc/php/8.1/fpm/php.ini:
1 2 3 4 5 6
| max_execution_time = 180 max_input_time = 60 memory_limit = 256M post_max_size = 20M upload_max_filesize = 20M date.timezone = Asia/Shanghai
|
8.4 应用缓存
1 2
| sudo apt install php8.1-opcache -y
|
OPcache 配置(/etc/php/8.1/cli/conf.d/10-opcache.ini):
1 2 3 4 5 6
| opcache.enable=1 opcache.memory_consumption=128 opcache.interned_strings_buffer=8 opcache.max_accelerated_files=4000 opcache.revalidate_freq=2 opcache.fast_shutdown=1
|
九、安全加固
9.1 Nginx 安全配置
在 server 块中添加安全头部:
1 2 3 4 5
| add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
|
9.2 限制 PHP 执行
编辑 PHP-FPM 配置文件:
1 2 3 4 5
|
php_admin_value[open_basedir] = /var/www/example.com/public_html:/tmp
php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
|
9.3 MariaDB 安全加固
1 2 3
| sudo mysql -u root -p -e "INSTALL SONAME 'server_audit';" sudo mysql -u root -p -e "INSTALL SONAME 'simple_password_check';"
|
注意:这些插件需在 MariaDB 10.1+ 版本可用。
十、故障排查
10.1 常见问题速查
| 问题现象 | 可能原因 | 排查命令/方法 |
| Nginx 无法启动 | 配置语法错误或端口被占用 | sudo nginx -t 测试配置
sudo lsof -i:80 检查端口 |
| PHP 文件显示空白 | PHP-FPM 未运行或 Socket 路径错误 | sudo systemctl status php8.1-fpm 检查 fastcgi_pass 指向的 Socket 路径 |
| PHP 文件被下载 | Nginx 未配置 PHP 处理规则 | 检查 location ~ \.php$ 配置块 |
| 502 Bad Gateway | PHP-FPM 进程耗尽或服务未运行 | sudo systemctl restart php8.1-fpm 检查 pm.max_children 是否过小 |
| 504 Gateway Timeout | PHP 执行超时 | 增大 max_execution_time 和 fastcgi_read_timeout |
| 数据库连接失败 | MariaDB 未启动或用户权限错误 | sudo systemctl status mariadb 检查 GRANT 权限是否正确 |
| 上传文件过大失败 | Nginx 或 PHP 上传限制 | 同步调大 client_max_body_size 和 upload_max_filesize |
| 页面加载极慢 | PHP-FPM 进程不足或数据库查询慢 | top 查看资源占用 开启慢查询日志 |
10.2 查看日志
1 2 3 4 5 6 7 8 9 10 11
| sudo tail -f /var/log/nginx/access.log
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.1-fpm.log
sudo tail -f /var/log/mysql/error.log
|
十一、一键部署脚本
以下脚本可快速完成 LEMP 环境的搭建:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #!/bin/bash
set -e
echo "=== 更新系统包 ===" sudo apt update && sudo apt upgrade -y
echo "=== 安装 Nginx ===" sudo apt install nginx -y
echo "=== 安装 MariaDB ===" sudo apt install mariadb-server mariadb-client -y
echo "=== 安装 PHP 8.1 及扩展 ===" sudo apt install php-fpm php-mysql php-cli php-curl php-gd php-mbstring php-xml php-zip php-bcmath php-intl php-opcache -y
echo "=== 配置 Nginx PHP 支持 ===" sudo tee /etc/nginx/sites-available/default > /dev/null << 'EOF' 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$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } } EOF
sudo nginx -t && sudo systemctl reload nginx
echo "=== 创建 PHP 测试文件 ===" echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
echo "" echo "=== LEMP 环境搭建完成 ===" echo "请在浏览器中访问 http://$(curl -s ifconfig.me)/info.php 验证" echo "验证后请执行: sudo rm /var/www/html/info.php" echo "数据库安全配置请执行: sudo mysql_secure_installation"
|
保存为 install-lemp.sh 后执行:
1 2
| chmod +x install-lemp.sh sudo ./install-lemp.sh
|
总结
本文详细介绍了在 Ubuntu 22.04 上搭建 LEMP 环境的完整流程,包括 Nginx 安装配置、MariaDB 数据库部署、PHP-FPM 集成、虚拟主机配置、性能优化和安全加固。LEMP 栈以其高性能、低资源消耗和灵活的配置方式,已成为现代 Web 应用部署的主流选择。
完成环境搭建后,你可以在此基础上部署 WordPress、Laravel、Symfony 等主流 PHP 应用,也可以结合 Redis、Elasticsearch 等组件构建更复杂的 Web 服务。
本文由AI辅助生成,内容仅供参考