LEMP 环境搭建完全指南(Nginx + MariaDB + PHP)

LEMP 环境搭建完全指南(Nginx + MariaDB + PHP)

Someone Lv5

前言

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 版本
nginx -v

# 检查 Nginx 服务状态
sudo systemctl status nginx

如果一切正常,你应该能在浏览器中通过服务器 IP 地址看到 Nginx 的默认欢迎页面。

2.3 Nginx 配置文件结构

1
2
3
4
5
6
7
/etc/nginx/
├── nginx.conf # 主配置文件
├── sites-available/ # 可用站点配置(类似 Apache 的 sites-available)
├── sites-enabled/ # 已启用的站点(符号链接到 sites-available)
├── 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
# 检查 MariaDB 服务状态
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 安装

1
2
php -v
php -m # 列出已安装的模块

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;
}

# PHP-FPM 处理 .php 文件
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

# 禁止访问 .htaccess 文件
location ~ /\.ht {
deny all;
}
}

5.2 测试配置并重启

1
2
3
4
5
# 测试 Nginx 配置语法
sudo nginx -t

# 重启 Nginx 使配置生效
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 压缩
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

# 重启 Nginx
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 优化
innodb_buffer_pool_size = 1G # 设置为可用内存的 60-70%
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; # 设为 CPU 核心数
worker_rlimit_nofile 65535; # 文件描述符限制

events {
worker_connections 4096; # 每个 worker 的最大连接数
use epoll; # Linux 高并发 IO 模型
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 压缩
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;

# 隐藏 Nginx 版本号
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
; 进程管理方式:dynamic / static / ondemand
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
# 安装 PHP OPcache(通常已内置)
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
# 在 server 块中添加
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
; 在 /etc/php/8.1/fpm/pool.d/www.conf 中
; 限制 php 只能执行在网站目录下
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 GatewayPHP-FPM 进程耗尽或服务未运行sudo systemctl restart php8.1-fpm
检查 pm.max_children 是否过小
504 Gateway TimeoutPHP 执行超时增大 max_execution_timefastcgi_read_timeout
数据库连接失败MariaDB 未启动或用户权限错误sudo systemctl status mariadb
检查 GRANT 权限是否正确
上传文件过大失败Nginx 或 PHP 上传限制同步调大 client_max_body_sizeupload_max_filesize
页面加载极慢PHP-FPM 进程不足或数据库查询慢top 查看资源占用
开启慢查询日志

10.2 查看日志

1
2
3
4
5
6
7
8
9
10
11
# Nginx 访问日志
sudo tail -f /var/log/nginx/access.log

# Nginx 错误日志
sudo tail -f /var/log/nginx/error.log

# PHP-FPM 日志
sudo tail -f /var/log/php8.1-fpm.log

# MariaDB 日志
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
# LEMP Stack 自动安装脚本 (Ubuntu 22.04)
# 使用方法: sudo bash install-lemp.sh

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辅助生成,内容仅供参考

  • 标题: LEMP 环境搭建完全指南(Nginx + MariaDB + PHP)
  • 作者: Someone
  • 创建于 : 2026-06-09 17:28:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-09-lemp-stack-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。