Lokve

一破敲代码的网工

文章

16

标签

18

评论

4

文章目录

数据统计

成立

372天

文章

16篇

评论

4条

标签

18个

最近文章

Ubuntu22.04 部署LNMP环境实验

前言

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

按照提示完成以下操作:

  1. 输入 root 密码
  2. 启用密码强度验证(推荐)
  3. 修改 root 密码(若之前设置的密码强度不够)
  4. 禁用匿名用户
  5. 禁止 root 本地以外的登录(生产环境建议)
  6. 删除 test 数据库
  7. 刷新权限表

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环境实验

发布于

November 24, 2025

分类

Linux运维

版权协议

MIT

#Ubuntu
评论
😀

感谢支持!

微信二维码

请使用微信扫描二维码打赏。

支付宝二维码

请使用支付宝扫描二维码打赏。

渝公网安备50010502504517号