前言
LNMP 作为 Linux + Nginx + MySQL + PHP 的经典 Web 架构组合,凭借轻量、高效、稳定的特性,成为中小企业及个人开发者搭建 Web 服务的首选方案。
本文将基于 Ubuntu 22.04 LTS 系统,从环境准备、组件编译安装、配置优化、安全加固到项目部署,提供一套生产级别的 LNMP 部署教程,全程附详细代码及专业配置说明。
环境准备
系统初始化
首先确保系统处于最新状态,同时安装部署所需的依赖工具:
# 更新系统软件包索引
sudo apt update -y
# 升级已安装软件包(避免依赖冲突)
sudo apt upgrade -y
# 安装基础依赖工具(编译、依赖库、网络工具等)
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \
libssl-dev openssl wget curl vim git unzip zip libxml2-dev libcurl4-openssl-dev \
libjpeg-dev libpng-dev libfreetype6-dev libzip-dev libonig-dev
关闭不必要服务(优化系统资源)
# 停止并禁用 avahi-daemon(局域网服务发现,生产环境无用)
sudo systemctl stop avahi-daemon
sudo systemctl disable avahi-daemon
# 停止并禁用 cups(打印机服务)
sudo systemctl stop cups
sudo systemctl disable cups
# 查看系统运行状态
sudo systemctl status
配置防火墙(UFW)
仅开放 80(HTTP)、443(HTTPS)、22(SSH)端口,增强系统安全性:
# 启用 UFW 防火墙
sudo ufw enable
# 允许 SSH 连接(远程管理必备)
sudo ufw allow 22/tcp
# 允许 HTTP/HTTPS 服务
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 查看防火墙规则
sudo ufw status numbered
编译安装Nginx1.26.2
采用编译安装方式,可自定义模块(如 SSL、Gzip 等),相比 apt 安装更灵活可控。
下载并解压 Nginx 源码
# 创建源码存放目录
sudo mkdir -p /usr/local/src/nginx
cd /usr/local/src/nginx
# 下载 Nginx 稳定版(当前最新稳定版 1.26.2)
sudo wget https://nginx.org/download/nginx-1.26.2.tar.gz
# 解压源码包
sudo tar -zxvf nginx-1.26.2.tar.gz
cd nginx-1.26.2
配置编译参数(启用核心模块)
# 创建 Nginx 运行用户和组(避免使用 root 运行)
sudo groupadd -r nginx
sudo useradd -r -g nginx -s /sbin/nologin nginx
# 配置编译选项(启用 SSL、Gzip、Rewrite 等核心模块)
sudo ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-http_v2_module
# 编译并安装(-j4 表示使用 4 线程编译,根据 CPU 核心数调整)
sudo make -j4 && sudo make install
配置 Nginx 系统服务(systemd)
方便通过 systemctl 管理 Nginx 启停:
# 创建服务配置文件
sudo vim /usr/lib/systemd/system/nginx.service
写入以下内容:
[Unit]
Description=Nginx High Performance Web Server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Nginx 基础配置优化
# 备份默认配置文件
sudo cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
# 编辑主配置文件
sudo vim /usr/local/nginx/conf/nginx.conf
替换为以下优化后的配置:
user nginx nginx;
worker_processes auto; # 自动匹配 CPU 核心数
worker_cpu_affinity auto; # CPU 亲和性绑定
error_log /var/log/nginx/error.log warn;
pid /usr/local/nginx/logs/nginx.pid;
# 事件模块配置
events {
worker_connections 10240; # 每个 worker 最大连接数
use epoll; # 使用 epoll 事件驱动模型(Linux 高性能首选)
multi_accept on; # 允许一个 worker 同时接受多个连接
}
# HTTP 核心配置
http {
include mime.types;
default_type application/octet-stream;
# 日志格式(添加 $request_time 记录请求耗时)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$request_time"';
access_log /var/log/nginx/access.log main;
# 性能优化参数
sendfile on; # 启用零拷贝发送文件
tcp_nopush on; # 合并 TCP 数据包,减少网络开销
tcp_nodelay on; # 禁用 Nagle 算法,降低延迟
keepalive_timeout 65; # 长连接超时时间
types_hash_max_size 2048; # 类型哈希表大小
client_header_buffer_size 4k; # 客户端请求头缓冲区大小
large_client_header_buffers 4 16k; # 大请求头缓冲区
# Gzip 压缩(减少传输带宽)
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_disable "MSIE [1-6]\."; # 兼容 IE 低版本
# 虚拟主机配置(后续项目部署用)
include /usr/local/nginx/conf/conf.d/*.conf;
}
启动并验证 Nginx
# 创建 Nginx 日志目录并授权
sudo mkdir -p /var/log/nginx
sudo chown -R nginx:nginx /var/log/nginx
# 重载 systemd 配置
sudo systemctl daemon-reload
# 启动 Nginx 并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx
# 验证 Nginx 状态
sudo systemctl status nginx
# 测试 Nginx 配置是否正确
/usr/local/nginx/sbin/nginx -t
# 访问测试(本地或远程浏览器访问服务器 IP)
curl http://localhost
若出现 Welcome to nginx! 页面,说明 Nginx 安装配置成功。
编译安装Mysql8.0
MySQL 8.0 相比 5.7 性能提升显著,支持 JSON 增强、窗口函数等新特性,此处采用编译安装保证稳定性。
安装依赖与系统配置
# 安装 MySQL 依赖
sudo apt install -y cmake libncurses5-dev libncursesw5-dev libaio-dev
# 创建 MySQL 数据目录和运行用户
sudo groupadd -r mysql
sudo useradd -r -g mysql -s /sbin/nologin mysql
sudo mkdir -p /data/mysql
sudo chown -R mysql:mysql /data/mysql
# 关闭 SELinux(Ubuntu 默认未启用,若启用则执行)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config
下载并编译 MySQL 源码
# 进入源码目录
cd /usr/local/src
sudo wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.39.tar.gz
sudo tar -zxvf mysql-8.0.39.tar.gz
cd mysql-8.0.39
# 创建编译目录
sudo mkdir build && cd build
# CMake 配置编译参数
sudo cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DENABLED_LOCAL_INFILE=1 \
-DFORCE_INSOURCE_BUILD=1
# 编译安装(-j4 线程数根据 CPU 调整,编译时间较长)
sudo make -j4 && sudo make install
初始化 MySQL 数据库
# 授权安装目录
sudo chown -R mysql:mysql /usr/local/mysql
# 初始化数据库(生成临时 root 密码,记录在日志中)
sudo /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql --basedir=/usr/local/mysql
# 查看临时密码(关键!后续登录需要)
sudo grep 'temporary password' /var/log/mysqld.log
配置 MySQL 系统服务
# 复制服务脚本
sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
sudo chmod +x /etc/init.d/mysqld
# 配置 systemd 服务
sudo vim /usr/lib/systemd/system/mysqld.service
写入以下内容:
[Unit]
Description=MySQL Server
After=network.target
[Service]
Type=forking
ExecStart=/etc/init.d/mysqld start
ExecStop=/etc/init.d/mysqld stop
ExecReload=/etc/init.d/mysqld restart
PIDFile=/data/mysql/localhost.localdomain.pid
User=mysql
Group=mysql
Restart=on-failure
[Install]
WantedBy=multi-user.target
MySQL 配置优化(my.cnf)
# 创建 MySQL 配置文件
sudo vim /etc/my.cnf
写入以下优化配置(适配 4GB 内存服务器,可根据实际调整):
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql
socket = /tmp/mysql.sock
pid-file = /data/mysql/localhost.localdomain.pid
user = mysql
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 性能优化参数
max_connections = 1000
max_user_connections = 800
wait_timeout = 600
interactive_timeout = 600
table_open_cache = 2048
table_definition_cache = 2048
sort_buffer_size = 2M
join_buffer_size = 2M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
key_buffer_size = 64M
innodb_buffer_pool_size = 2G # 建议设置为物理内存的 50%-70%
innodb_log_file_size = 512M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table = 1
innodb_flush_method = O_DIRECT
# 安全参数
skip-name-resolve # 禁用 DNS 解析,加快连接速度
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
[mysqld_safe]
log-error = /var/log/mysqld.log
pid-file = /data/mysql/localhost.localdomain.pid
[mysql]
default-character-set = utf8mb4
启动 MySQL 并初始化配置
# 启动 MySQL 并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start mysqld
sudo systemctl enable mysqld
# 验证 MySQL 状态
sudo systemctl status mysqld
# 登录 MySQL(使用之前记录的临时密码)
/usr/local/mysql/bin/mysql -u root -p
# 登录后修改 root 密码(必须包含大小写字母、数字、特殊字符)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
# 授权 root 远程访问(生产环境建议限制 IP,此处为演示)
CREATE USER 'root'@'%' IDENTIFIED BY 'YourStrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 退出 MySQL
exit
编译安装PHP8.3
PHP 8.3 是当前稳定版,性能较 7.x 提升 30%+,支持 JIT 编译,此处编译安装并启用常用扩展(MySQL、Redis、GD 等)。
下载并解压 PHP 源码
cd /usr/local/src
sudo wget https://www.php.net/distributions/php-8.3.11.tar.gz
sudo tar -zxvf php-8.3.11.tar.gz
cd php-8.3.11
配置编译参数(启用核心扩展)
# 配置编译选项
sudo ./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--with-config-file-scan-dir=/usr/local/php/etc/php.d \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-openssl \
--with-zlib \
--with-curl \
--with-gd \
--with-jpeg \
--with-png \
--with-freetype \
--with-iconv \
--with-mhash \
--with-libxml-dir \
--with-zip \
--with-onig \
--enable-mbstring \
--enable-fpm \
--enable-cli \
--enable-gd \
--enable-xml \
--enable-session \
--enable-opcache \
--enable-pcntl \
--enable-exif \
--disable-debug
# 编译安装
sudo make -j4 && sudo make install
配置 PHP-FPM
# 复制配置文件模板
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
# 编辑 PHP 核心配置(php.ini)
sudo vim /usr/local/php/etc/php.ini
修改以下关键参数:
# 时区配置
date.timezone = Asia/Shanghai
# 内存限制
memory_limit = 512M
# 上传文件大小限制
upload_max_filesize = 100M
post_max_size = 100M
# 脚本执行时间限制
max_execution_time = 300
# 错误日志
error_log = /var/log/php/error.log
log_errors = On
display_errors = Off # 生产环境禁用错误显示
# OPCache 优化(开启 JIT 编译)
[opcache]
zend_extension=opcache.so
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.jit=1255
opcache.jit_buffer_size=64M
配置 PHP-FPM 系统服务
sudo vim /usr/lib/systemd/system/php-fpm.service
写入以下内容:
[Unit]
Description=PHP FastCGI Process Manager
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/php/var/run/php-fpm.pid
ExecStart=/usr/local/php/sbin/php-fpm
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID
User=nginx
Group=nginx
PrivateTmp=true
[Install]
WantedBy=multi-user.target
启动 PHP-FPM 并验证
# 创建 PHP 日志目录并授权
sudo mkdir -p /var/log/php
sudo chown -R nginx:nginx /var/log/php
# 启动 PHP-FPM 并设置开机自启
sudo systemctl daemon-reload
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
# 验证 PHP-FPM 状态
sudo systemctl status php-fpm
# 查看 PHP 版本及扩展
/usr/local/php/bin/php -v
/usr/local/php/bin/php -m | grep -E 'mysqli|pdo_mysql|gd|curl|zip'
若输出 PHP 版本(8.3.11)及相关扩展名称,说明 PHP 安装成功。
安全加固
MySQL 安全加固
# 运行 MySQL 安全脚本
/usr/local/mysql/bin/mysql_secure_installation
按照提示完成以下操作:
- 输入 root 密码
- 启用密码强度验证(推荐)
- 修改 root 密码(若之前设置的密码强度不够)
- 禁用匿名用户
- 禁止 root 本地以外的登录(生产环境建议)
- 删除 test 数据库
- 刷新权限表
PHP 安全加固
sudo vim /usr/local/php/etc/php.ini
添加 / 修改以下参数:
# 禁用危险函数
disable_functions = eval,assert,popen,passthru,exec,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
# 禁止暴露 PHP 版本
expose_php = Off
# 限制 PHP 可访问的目录
open_basedir = /var/www/:/tmp/:/var/tmp/
# 禁用远程代码执行
allow_url_fopen = Off
allow_url_include = Off
Nginx 安全加固
sudo vim /usr/local/nginx/conf/nginx.conf
在 http 块中添加以下安全头:
# 防止 XSS 攻击
add_header X-XSS-Protection "1; mode=block";
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# 限制 MIME 类型嗅探
add_header X-Content-Type-Options "nosniff";
# 启用 HSTS(强制 HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
配置 HTTPS(Let's Encrypt 免费证书)
# 安装 Certbot
sudo apt install -y certbot python3-certbot-nginx
# 申请免费 SSL 证书(替换为你的域名)
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
按照提示完成证书申请,Certbot 会自动修改 Nginx 配置,启用 HTTPS。
总结
本文基于 Ubuntu 22.04 LTS 系统,通过编译安装方式部署了 Nginx 1.26 + MySQL 8.0 + PHP 8.3 的高性能 LNMP 环境,包含了详细的编译参数、配置优化和安全加固步骤。
相比 apt 一键安装,编译安装更灵活可控,可根据业务需求自定义模块和优化参数,适用于生产环境。
后续可根据实际业务需求,扩展 Redis 缓存、Elasticsearch 搜索引擎等组件,进一步提升架构性能和扩展性。
Ubuntu22.04 部署LNMP环境实验