Ubuntu 系统部署 LNMP 环境详细教程(附shell脚本一键部署↓) - 指南
LNMP 是一个流行的开源软件栈,用于构建高性能的动态网站和 Web 应用程序。它由以下四个核心组件组成,每个组件的首字母组合成 "LNMP":
1. L - Linux
- 作用:操作系统,作为整个软件栈的基础。
- 常见发行版:Ubuntu、CentOS、Debian 等。
- 特点:开源、稳定、安全,支持高并发和自定义配置。
2. N - Nginx
- 作用:高性能的 Web 服务器和反向代理服务器。
- 特点:
- 轻量级、高并发处理能力(适合处理大量静态文件或反向代理)。
- 低内存占用,支持异步事件驱动模型。
- 常用于替代 Apache(LAMP 栈中的 A)以提升性能。
- 典型配置:处理静态文件(如 HTML、CSS、JS),将动态请求(如 PHP)转发给后端处理器。
3. M - MySQL/MariaDB
- 作用:关系型数据库管理系统(RDBMS),用于存储和管理网站数据。
- 常见版本:
- MySQL:最流行的开源数据库,被 Oracle 收购后部分用户转向 MariaDB。
- MariaDB:MySQL 的分支,完全兼容 MySQL,由开源社区维护。
- 特点:
- 支持 ACID 事务、存储过程、触发器等。
- 通过 SQL 语句进行数据操作。
4. P - PHP
- 作用:服务器端脚本语言,用于生成动态网页内容。
- 特点:
- 嵌入 HTML 中执行,适合快速开发 Web 应用。
- 广泛支持框架(如 Laravel、Symfony)和 CMS(如 WordPress、Drupal)。
- 运行模式:
- 通过 PHP-FPM(FastCGI Process Manager)与 Nginx 集成,处理动态请求。
LNMP 的工作流程
- 用户请求:浏览器发送 HTTP 请求到服务器。
- Nginx 处理:
- 如果是静态文件(如图片、CSS),直接返回给用户。
- 如果是动态请求(如
.php
文件),通过 FastCGI 协议转发给 PHP-FPM。
- PHP 处理:
- PHP-FPM 执行 PHP 脚本,可能涉及数据库查询。
- MySQL 查询:
- PHP 通过 MySQL 客户端连接数据库,执行 SQL 查询并获取结果。
- 返回响应:
- PHP 生成动态内容(如 HTML),通过 Nginx 返回给用户。
LNMP 的优势
- 高性能:Nginx + PHP-FPM 的组合比传统 LAMP(Apache + PHP)更高效。
- 轻量级:适合中小型网站和高并发场景。
- 灵活性:各组件可独立替换或扩展(如用 PostgreSQL 替代 MySQL)。
- 开源免费:降低企业成本。
对比 LAMP
维度 | LAMP(Apache) | LNMP(Nginx) |
---|---|---|
核心优势 | 功能全,适合复杂动态请求(如 CMS) | 并发高,适合静态资源+API(如网站、接口) |
性能瓶颈 | 高并发(>1000)易卡顿 | 轻松支持 10,000+ 并发 |
内存占用 | 高(每个连接 10-30MB) | 低(每个连接 2-5MB) |
PHP 处理 | 直接嵌入 Apache(延迟低) | 通过 PHP-FPM(延迟略高但可优化) |
适用场景 | 小流量传统网站、企业内网应用 | 高流量网站、移动端 API、低成本服务器 |
一、准备工作
1. 更新系统并安装基础依赖
sudo apt update
sudo apt install -y build-essential wget curl libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev openssl libreadline-dev libncurses5-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev libfreetype6-dev libxml2-dev libzip-dev libonig-dev libnuma1 pkg-config libsqlite3-dev
2. 创建专用用户和目录
# 创建 nginx 运行用户
sudo groupadd nginx
sudo useradd -g nginx -s /sbin/nologin nginx
# 创建日志目录
sudo mkdir -p /var/log/nginx
sudo chown -R nginx:nginx /var/log/nginx
二、编译安装 Nginx
1. 下载并解压 Nginx
wget http://nginx.org/download/nginx-1.26.2.tar.gz
tar -zxvf nginx-1.26.2.tar.gz
cd nginx-1.26.2
2. 编译配置
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-compat \
--with-debug
3. 编译并安装
make && sudo make install
4. 创建软链接并配置 systemd 服务
sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
创建 systemd 服务文件:
sudo tee /etc/systemd/system/nginx.service << 'EOF'
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
启用服务:
sudo systemctl daemon-reload
sudo systemctl start nginx.service
sudo systemctl enable nginx.service
三、安装 MySQL 8
1. 下载 MySQL 二进制包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz
sudo tar -xvJf mysql-8.0.39-linux-glibc2.12-x86_64.tar.xz -C /usr/local/
sudo ln -s /usr/local/mysql-8.0.39-linux-glibc2.12-x86_64 /usr/local/mysql
2. 创建数据目录和用户
sudo groupadd mysql
sudo useradd -r -g mysql -s /bin/false mysql
sudo mkdir -p /usr/local/mysql/{logs,tmp}
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /usr/local/mysql
3. 配置 my.cnf
sudo tee /etc/my.cnf << EOF
[client]
socket = /usr/local/mysql/tmp/mysql.sock
port = 3306
default-character-set = utf8mb4
[mysqld]
user = mysql
pid-file = /usr/local/mysql/tmp/mysqld.pid
socket = /usr/local/mysql/tmp/mysql.sock
datadir = /data/mysql
log-error = /usr/local/mysql/logs/mysqld.log
bind-address = 0.0.0.0
port = 3306
log-bin = mysql-bin
server_id = 1
binlog_format = mixed
skip_symbolic_links = 1
max_connections = 500
connect_timeout = 10
wait_timeout = 600
character_set_server = utf8mb4
collation_server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp = 1 # As the parameter is deprecated, set it to 1 to avoid warnings
sql_mode = STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE
[mysqldump]
quick
quote-names
max_allowed_packet = 64M
EOF
4. 初始化数据库
sudo /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
获取临时密码:
sudo cat /usr/local/mysql/logs/mysqld.log | grep 'temporary password'
记住临时密码:<0hMZssF3Awe
5. 创建 systemd 服务并启用服务
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
sudo systemctl daemon-reload
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
6. 配置MySQL环境变量
echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
source /etc/profile
四、编译安装 PHP 8.2
1. 下载并解压 PHP
wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -zxvf php-8.2.12.tar.gz
cd php-8.2.12
2. 编译配置
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib \
--with-curl \
--with-gd \
--with-freetype \
--with-jpeg \
--enable-mbstring \
--enable-sockets \
--enable-pcntl \
--enable-soap \
--enable-bcmath \
--enable-zip \
--with-openssl \
--with-pear \
--enable-opcache \
--with-libxml \
--with-xmlrpc \
--enable-exif \
--enable-intl
3. 编译安装
make && sudo make install
4. 配置文件
sudo cp php.ini-production /usr/local/php/etc/php.ini
sudo cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
sudo cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
5. 创建软链接
sudo ln -s /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm
sudo ln -s /usr/local/php/bin/php /usr/local/bin/php
6. 指定 PHP-FPM 处理 Web 请求时使用的操作系统用户和组
sudo vim /usr/local/php/etc/php-fpm.d/www.conf
user = nginx
group = nginx
7. 创建PHP-FPM运行所需的进程和日志目录
sudo mkdir -p /usr/local/php/var/{run,log}
8. 配置 systemd 服务
sudo tee /etc/systemd/system/php-fpm.service << 'EOF'
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
User=nginx
Group=nginx
[Install]
WantedBy=multi-user.target
EOF
9. 启用服务
sudo systemctl daemon-reload
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
五、配置 Nginx 与 PHP-FPM 联动
1. 修改 Nginx 配置支持 PHP
sudo mkdir -p /usr/local/nginx/conf/conf.d # 创建 conf.d 目录
sudo tee /usr/local/nginx/conf/conf.d/default.conf << 'EOF'
server {
listen 80;
server_name localhost;
root /usr/local/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
EOF
2. 在 Nginx 主配置中引入
编辑 /usr/local/nginx/conf/nginx.conf
,在 http
块中添加:
include /usr/local/nginx/conf/conf.d/*.conf;
3. 创建测试页
echo "" | sudo tee /usr/local/nginx/html/index.php
4. 重载 nginx
sudo systemctl reload nginx.service
5. 打开浏览器访问服务器IP
六、Shell脚本自动安装
#!/bin/bash
# Ubuntu 部署 LNMP 环境 一键脚本
# 作者:LoneEon
# 时间:2025年9月18日
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
}
# 检查是否以 root 用户运行
if [ "$EUID" -ne 0 ]; then
error "请使用 sudo 或 root 用户运行此脚本。"
exit 1
fi
# 定义软件版本和下载链接
NGINX_VERSION="1.26.2"
NGINX_URL="http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz"
MYSQL_VERSION="8.0.39"
MYSQL_URL="https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-${MYSQL_VERSION}-linux-glibc2.12-x86_64.tar.xz"
PHP_VERSION="8.2.12"
PHP_URL="https://www.php.net/distributions/php-${PHP_VERSION}.tar.gz"
# 1. 准备工作
log "开始准备工作..."
# 更新系统
log "更新系统软件包..."
apt update -y
# 安装基础依赖
log "安装编译所需的基础依赖..."
apt install -y build-essential wget curl libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev openssl \
libreadline-dev libncurses5-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev \
libfreetype6-dev libxml2-dev libzip-dev libonig-dev libnuma1 pkg-config libsqlite3-dev
# 创建 nginx 运行用户
log "创建 nginx 用户和目录..."
groupadd nginx 2>/dev/null || warn "nginx 组可能已存在"
useradd -g nginx -s /sbin/nologin nginx 2>/dev/null || warn "nginx 用户可能已存在"
mkdir -p /var/log/nginx
chown -R nginx:nginx /var/log/nginx
# 2. 编译安装 Nginx
log "开始编译安装 Nginx ${NGINX_VERSION}..."
# 下载并解压
wget -q --show-progress "$NGINX_URL"
tar -zxvf "nginx-${NGINX_VERSION}.tar.gz"
cd "nginx-${NGINX_VERSION}"
# 编译配置
log "配置 Nginx 编译选项..."
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-threads \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-mail \
--with-mail_ssl_module \
--with-compat \
--with-debug
# 编译并安装
log "编译并安装 Nginx..."
make -j$(nproc) && make install
# 创建软链接
ln -sf /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
# 创建 systemd 服务文件
log "配置 Nginx systemd 服务..."
cat > /etc/systemd/system/nginx.service /dev/null || warn "mysql 组可能已存在"
useradd -r -g mysql -s /bin/false mysql 2>/dev/null || warn "mysql 用户可能已存在"
mkdir -p /usr/local/mysql/logs
mkdir -p /usr/local/mysql/tmp
mkdir -p /data/mysql
chown -R mysql:mysql /usr/local/mysql*
# 配置 my.cnf
log "配置 MySQL..."
cat > /etc/my.cnf /etc/profile.d/mysql.sh
chmod +x /etc/profile.d/mysql.sh
. /etc/profile.d/mysql.sh
log "MySQL 安装并启动成功。"
# 4. 编译安装 PHP 8.2
log "开始编译安装 PHP ${PHP_VERSION}..."
# 下载并解压
wget -q --show-progress "$PHP_URL"
tar -zxvf "php-${PHP_VERSION}.tar.gz"
cd "php-${PHP_VERSION}"
# 编译配置
log "配置 PHP 编译选项..."
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=www \
--with-fpm-group=www \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-zlib \
--with-curl \
--with-gd \
--with-freetype \
--with-jpeg \
--enable-mbstring \
--enable-sockets \
--enable-pcntl \
--enable-soap \
--enable-bcmath \
--enable-zip \
--with-openssl \
--with-pear \
--enable-opcache \
--with-libxml \
--with-xmlrpc \
--enable-exif \
--enable-intl
# 编译安装
log "编译并安装 PHP..."
make -j$(nproc) && make install
# 复制配置文件
cp php.ini-production /usr/local/php/etc/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
# 创建软链接
ln -sf /usr/local/php/sbin/php-fpm /usr/local/bin/php-fpm
ln -sf /usr/local/php/bin/php /usr/local/bin/php
# 修改 www.conf 用户组为 nginx
log "配置 PHP-FPM 使用 nginx 用户..."
sed -i 's/^user = www$/user = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
sed -i 's/^group = www$/group = nginx/' /usr/local/php/etc/php-fpm.d/www.conf
# 创建运行目录
mkdir -p /usr/local/php/var/log
mkdir -p /usr/local/php/var/run
# 授权
sudo chown -R nginx:nginx /usr/local/php*
# 创建 systemd 服务
log "配置 PHP-FPM systemd 服务..."
cat > /etc/systemd/system/php-fpm.service /usr/local/nginx/conf/conf.d/default.conf " > /usr/local/nginx/html/index.php
# 重载 Nginx
systemctl reload nginx.service
log "Nginx 与 PHP-FPM 联动配置完成。"
# 完成
log "LNMP 环境部署完成!"
log "您可以访问服务器的 IP 地址来查看 Nginx 欢迎页。"
log "访问 http:///index.php 可以查看 PHP 信息页。"
log "MySQL 临时 root 密码: ${TEMP_PASS}"
log "所有组件安装在 /usr/local/ 目录下。"
# 安全提示
warn "强烈建议您立即使用 'mysql_secure_installation' 或手动登录 MySQL 来修改 root 密码并进行安全配置。"
本文提供了一套企业级 LNMP 源码部署方案,所有组件安装在 /usr/local
,便于统一管理、升级和迁移。配合自动化脚本,可快速部署多台服务器,适用于中小型项目或开发环境。