Linux服务器LNMP环境从零搭建:Nginx+PHP-FPM+MySQL完整进阶指南
发布时间:2026/10/15 9:36:40 锦皓数字建站

LNMP 这套组合说白了就是 Linux 服务器上跑 Nginx 当门卫、MySQL 当仓库、PHP 当车间各管一摊又互相配合。我最早接触它的时候还在用 Apache后来被高并发场景逼着换了 Nginx才发现这套架构的巧劲——静态请求 Nginx 直接秒回动态请求转给 PHP 处理数据库查询再单独走 MySQL链路清晰排查问题也省心。这篇文章我就拿一套最常用的部署方案把从零搭建到联调测试的完整过程拆开揉碎讲清楚新手照着做能跑通老手也能看看有没有踩过我没注意的坑。我假设你手头有一台干净的 Linux 服务器我这边用的是 CentOS 7 系的系统命令基本通用并且有 root 或 sudo 权限。如果你用的是 Ubuntu/Debian包管理器换成 apt 就行思路完全一样。下面每一步我都会说明为什么要这么做而不是光甩命令。1. LNMP 架构整体思路与组件分工LNMP 不是三个软件随便装在一起就完事它是一套请求处理流水线。理解这条流水线后面配置时你才不会被各种报错绕晕。1.1 一次请求的完整旅程用户在浏览器输入网址请求先到 Nginx监听 80 或 443 端口。Nginx 看一眼请求的是什么如果是图片、CSS、JS 这类静态文件它直接从磁盘捞出来返回这一手极其快吞吐量能轻松跑满带宽。如果是需要计算的动态请求比如登录、查询订单Nginx 自己干不了这活儿它就把请求转交给后端的 PHP-FPM 进程去处理。PHP-FPM 是 PHP 的进程管理器它收到请求后开始执行 PHP 脚本。脚本里如果涉及数据存取PHP 就会用 MySQL 的协议连上数据库执行 SQL 语句拿到结果拼成 HTML 返回给 NginxNginx 再把这个响应回给用户。整个过程从用户视角看就是一眨眼的事儿但背后是三个组件各司其职的接力赛。1.2 为什么是 Nginx 而不是 Apache很多人问过我这个问题。Apache 的 .htaccess 和模块加载机制确实方便但它在高并发下的资源占用是个硬伤——每个请求都要占一个进程连接一多内存就吃紧。Nginx 是基于事件驱动的异步架构一个进程能同时处理成千上万个连接静态文件处理能力又强所以现在新项目基本都默认用 Nginx 做 Web 服务器。PHP 这边也经历了从 mod_phpApache 模块方式到 PHP-FPM 的演进。PHP-FPM 把 PHP 解释器独立成服务Nginx 通过 FastCGI 协议跟它通信这样 PHP 进程挂了不会拖垮 Nginx还能单独调整 PHP 的进程数量灵活性和稳定性都更好。1.3 这套架构适合什么场景如果你要部署一个典型的 Web 应用——不管是 WordPress、ThinkPHP、Laravel、还是自己写的 PHP 项目——LNMP 都是久经考验的底子。小型项目一台服务器全搞定流量长大了还能把 MySQL 单独迁移到独立机器Nginx 做负载均衡架构平滑升级不会推倒重来。这也是我推荐新手直接学 LNMP 的原因它是理解 Web 部署的最佳入门组合学完这一套以后接触任何语言的后端部署都会觉得眼熟。2. 环境准备与版本选型别小看这一步版本选错了后面能折腾你一整天。我见太多人在 PHP 7 和 PHP 8 的兼容性上浪费时间或者 MySQL 8 的认证插件跟老 PHP 连不上。2.1 系统基础配置拿到一台干净服务器我习惯先做三件事更新系统、装常用工具、关掉防火墙干扰测试环境先用最简单的配置。# 更新系统所有包 yum update -y # 安装常用工具 yum install -y vim wget curl net-tools # 测试环境直接关防火墙生产环境请按需放行端口 systemctl stop firewalld systemctl disable firewalld setenforce 0这里解释一下为什么要临时关防火墙和 SELinux。LNMP 搭建过程中Nginx 要连 PHP-FPM默认走 9000 端口PHP 要连 MySQL默认 3306 端口防火墙策略没放行这些端口你本地测试时就会“莫名其妙连不上”。SELinux 更是坑中之坑它甚至能限制 Nginx 读取网站目录的文件报错日志里什么都不写就是 Permission denied。测试阶段先关掉跑通后再按需开启并配置规则这是最省时间的路径。2.2 版本选择建议我的建议组合是Nginx 1.24、PHP 8.2、MySQL 5.7 或 8.0。具体理由如下Nginx 1.24 是稳定版主流的 HTTP/2、gzip、反向代理、负载均衡特性全都有没必要追新尝鲜。PHP 8.2 是当前生态兼容性最好的版本主流框架和 CMS 都已经全面支持性能比 PHP 7 系列提升明显JIT 加持而且 PhpMyAdmin、WordPress 这类常用软件都不再有兼容警告。MySQL 这边我建议新手用 5.7更保守资料多坑少如果是新项目且没有老代码包袱直接上 8.0性能更好窗口函数和 JSON 支持更强。但要注意 MySQL 8 默认的认证插件是 caching_sha2_password如果用老版本的 PHP 扩展比如 PHP 5.6 的 mysqlnd连库时会直接报认证失败。PHP 7.4 之后的 mysqlnd 已经支持这个插件所以 PHP 8.2 MySQL 8.0 这对组合没问题。2.3 目录规划与约定我这篇文章统一使用以下目录约定方便你对照操作项目路径Nginx 安装目录/etc/nginxNginx 网站根目录/usr/share/nginx/html (软链到 /var/www/html)PHP-FPM 配置目录/etc/php-fpm.dPHP 扩展配置目录/etc/php.dMySQL 数据目录/var/lib/mysql网站日志目录/var/log/nginx你也可以用 /usr/local 下自定义目录编译安装但那套适合需要对 Nginx 做深度定制的场景。用发行版自带的 RPM 包部署好处是 systemd 管理成熟、配置文件规范、yum 能自动处理依赖对绝大多数场景足够了。我这次就用 yum 方式带你过一遍完整流程。3. Nginx 安装与基础配置Nginx 是整套架构的流量入口先把这里稳住后面才有得玩。3.1 通过 Yum 安装 NginxCentOS 7 自带的 yum 源里其实有 nginx但是版本一般比较老。我建议先添加官方源安装的版本更靠谱。# 创建 nginx 官方源以 CentOS 7 为例 cat /etc/yum.repos.d/nginx.repo EOF [nginx-stable] namenginx stable repo baseurlhttps://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck1 enabled1 gpgkeyhttps://nginx.org/keys/nginx_signing.key module_hotfixestrue EOF # 安装 yum install -y nginx # 查看安装版本 nginx -v安装完成后nginx 命令会自动注册为系统服务。3.2 启动与开机自启systemctl start nginx systemctl enable nginx systemctl status nginx这时候你要是直接在浏览器访问服务器 IP应该能看到 Nginx 的默认欢迎页。如果看不到多半是防火墙没放行 80 端口——刚才我们直接把 firewalld 关了所以本地测试场景不会有这个问题生产环境记得放行。3.3 核心配置文件解读Nginx 的配置文件结构是主配置 /etc/nginx/nginx.conf 负责全局设置然后通过 include 语句引入 /etc/nginx/conf.d/ 下的所有 .conf 文件。每个站点一个独立配置文件这是最佳实践别把所有站点配置都塞进主配置文件里。看一眼主配置的关键部分user nginx; worker_processes auto; # 自动匹配 CPU 核数 error_log /var/log/nginx/error.log warn; pid /run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /etc/nginx/conf.d/*.conf; }关键优化点worker_processes auto 会让 Nginx 按 CPU 核数启动对应数量的 worker 进程。如果服务器是 4 核就启动 4 个 worker各占一个核互不争抢。worker_connections 1024 表示每个 worker 最多同时保持 1024 个连接。这个值不需要拍脑袋改大连接数上来了你该关注的是文件描述符限制ulimit和内核参数调优光调这里意义不大。3.4 虚拟主机配置模板在 conf.d 下创建一个站点配置命名规范我一般用域名或者项目名命名vim /etc/nginx/conf.d/mysite.confserver { listen 80; server_name _; # 正式环境换成你的域名 root /usr/share/nginx/html; index index.php index.html index.htm; access_log /var/log/nginx/mysite_access.log; error_log /var/log/nginx/mysite_error.log; location / { try_files $uri $uri/ /index.php?$query_string; } # 静态文件直接返回并设置缓存头 location ~ \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { expires 7d; access_log off; add_header Cache-Control public; } # PHP 请求转发给 PHP-FPM location ~ \.php$ { root /usr/share/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # 禁止访问隐藏文件 location ~ /\\. { deny all; } }这里面有个关键点location ~ .php$ 这段。fastcgi_param SCRIPT_FILENAME 这行定义了 PHP-FPM 要去执行哪个文件$document_root 会解析成 root 指令里的路径$fastcgi_script_name 是请求的 PHP 文件路径。如果这里配错PHP-FPM 会报“File not found”——这个问题出现了无数次很多人以为 PHP 装坏了其实只是路径拼接不对。try_files 那行的意思是先找对应文件找不到就找对应目录再找不到就把请求重写到 index.php。这是为伪静态也就是常见的“去掉 URL 里的 index.php”重写规则准备的你以后部署 ThinkPHP 或 Laravel 时就懂它的价值了。4. PHP 与 PHP-FPM 安装配置Nginx 只负责接客真正干活的是 PHP。PHP 装不好Nginx 配得再漂亮所有动态请求也全都会变成 502 或 404。4.1 安装 PHP 与常用扩展CentOS 7 默认的 yum 源里 PHP 版本太老5.4什么都干不了。我习惯用软件集合源版本选择余地大更新也及时。# 安装 Remi 源和 EPEL 源 yum install -y epel-release rpm -Uvh http://rpms.remirepo.net/enterprise/remi-release-7.rpm # 启用 PHP 8.2 的 yum 源 yum-config-manager --enable remi-php82 # 安装 PHP 及常用扩展 yum install -y php php-fpm php-cli php-mysqlnd php-gd php-mbstring php-xml php-json php-zip php-curl php-bcmath php-intl php-redis php-opcache扩展这里解释几个必装的php-mysqlnd让 PHP 能连接 MySQL 数据库的核心扩展。注意是 mysqlnd 而不是 mysqlmysqlnd 是 PHP 官方维护的驱动性能和使用体验都更好。php-fpmPHP-FPM 进程管理器Nginx 跟 PHP 通信全靠它。php-opcachePHP 字节码缓存启用后 PHP 脚本第一次编译结果会被缓存后续请求直接执行缓存能提升 30%-50% 的响应速度。这个默认就装好并启用别关。php-redis如果你以后项目里要用 Redis 做缓存或队列提前装上省得后面编译扩展。装完后验证版本php -v4.2 PHP-FPM 运行方式与配置PHP-FPM 有两种对外通信方式TCP 和 Unix Socket。TCP 是监听 127.0.0.1:9000Unix Socket 是监听一個本地管道文件比如 /run/php-fpm/www.sock。这里我明确说Unix Socket 性能更好TCP 兼容性更好。Socket 方式省去了 TCP 协议栈的开销进程间通信是纯内存拷贝吞吐量能提升 10%-20%。但它的缺点是如果 Nginx 和 PHP-FPM 不在同一台机器上比如你要把 PHP 独立部署就只能用 TCP。另外有些 PHP 函数比如某些网络函数在 Socket 模式下会有怪异表现。我的建议是单机部署用 Socket分布式部署用 TCP。为了演示方便这篇文章我用 TCP 方式127.0.0.1:9000因为新手排查问题更简单直观。如果你要改成 Socket只需要修改两处第一处编辑 PHP-FPM 的进程池配置vim /etc/php-fpm.d/www.conf# 找到这行改成 Socket 路径TCP 方式就忽略这步 listen 127.0.0.1:9000 # 改成 listen /run/php-fpm/www.sock # 同时设置 Socket 文件的属主和权限 listen.owner nginx listen.group nginx listen.mode 0660第二处修改 Nginx 配置里的 fastcgi_passfastcgi_pass 127.0.0.1:9000; # 改成 fastcgi_pass unix:/run/php-fpm/www.sock;注意 PHP-FPMwww.conf 里默认的进程运行用户是 apache如果 Nginx 的 user 是 nginx两者权限不一致会导致 Nginx 无法读取 PHP-FPM 处理的结果。所以务必把 PHP-FPM 的 user 和 group 改成 nginx这个细节我在下面配置里会写。4.3 修改 PHP-FPM 进程池配置打开 /etc/php-fpm.d/www.conf有几个关键参数需要调user nginx group nginx listen 127.0.0.1:9000 pm dynamic pm.max_children 50 pm.start_servers 10 pm.min_spare_servers 5 pm.max_spare_servers 20 pm.max_requests 500简单说下 pm 配置逻辑pm dynamic 表示 PHP-FPM 会动态调整进程数量空闲时减少繁忙时增加。pm.max_children 是 PHP-FPM 最多同时维持的进程数这个值决定了 PHP 能同时处理多少个并发请求。你可以在服务器内存充足的情况下粗略估算每个 PHP 进程默认占用约 30-50MB 内存具体看你的业务假设服务器 2GB 内存扣掉 Nginx 和 MySQL 占用的留给 PHP 的预算大概 1.2GB那么 max_children 设 30-40 比较稳妥。设得太大高峰期内存溢出直接 OOM。pm.max_requests 表示一个 PHP 进程处理完 500 个请求后自动重启。这是为了应对 PHP 脚本可能存在的内存泄漏——如果不设这个值进程长期运行内存越占越多最终系统触发 OOM Killer。设了之后进程到期自动回收内存这是很多运维会忽略但又极其重要的参数。改完后启动 PHP-FPMsystemctl start php-fpm systemctl enable php-fpm ss -lnt | grep 9000 # 确认 9000 端口已经监听看到 127.0.0.1:9000 处于 LISTEN 状态说明 PHP-FPM 已经就绪。4.4 验证 PHP 与 Nginx 是否打通在网站根目录创建一个测试脚本vim /usr/share/nginx/html/info.php?php phpinfo();然后浏览器访问http://你的IP/info.php。如果能看到 PHP 的配置信息页面说明 Nginx 到 PHP-FPM 这条链路已经完全打通。如果报 502 Bad Gateway基本就是 Nginx 连不上 PHP-FPM。排查三步先确认 9000 端口在监听再看 PHP-FPM 日志/var/log/php-fpm/error.log最后看 Nginx 的错误日志/var/log/nginx/error.log。这三个日志是定位问题的三件套以后遇到任何联调问题先翻日志别瞎猜。5. MySQL 安装与配置MySQL 是三件套里最容易被人敷衍的部分但这块一旦出了性能问题前面 Nginx 和 PHP 优化得再猛也白搭。5.1 安装 MySQL 5.7含 8.0 选择说明CentOS 7 默认源没有 MySQL可以用 MySQL 官方源装。这里提醒一下你也可以装 MariaDBCentOS 自带的那个MariaDB 是 MySQL 的分支API 完全兼容但如果你后续要用 MySQL 8 的某些新特性或者项目要求原生 MySQL建议直接装官方版。# 添加 MySQL 5.7 源 rpm -Uvh https://repo.mysql.com/mysql57-community-release-el7.rpm # 安装 MySQL 服务端和客户端 yum install -y mysql-community-server mysql-community-client # 启动 MySQL systemctl start mysqld systemctl enable mysqld第一次启动 MySQL 后它会生成一个临时 root 密码记在日志文件里grep temporary password /var/log/mysqld.log如果找不到临时密码或日志为空可能是权限问题直接 cat 整个文件看看。拿到密码后用它登录mysql -u root -p5.2 初始安全配置MySQL 5.7 默认自带一个安全配置向导我感觉还是手动改更直观。登录后依次执行-- 修改 root 密码MySQL 默认要求强密码大小写字母数字特殊符号 ALTER USER rootlocalhost IDENTIFIED BY YourStrongPassword!2024; -- 创建一个应用用账号不要用 root 跑业务 CREATE USER app_userlocalhost IDENTIFIED BY AppPassw0rd!; -- 给应用账号创建数据库并授权 CREATE DATABASE IF NOT EXISTS app_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL PRIVILEGES ON app_db.* TO app_userlocalhost; FLUSH PRIVILEGES;这里解释几个关键点为什么数据库字符集用 utf8mb4 而不是 utf8因为 MySQL 的 utf8 实际上最多只支持 3 字节而用户输入的表情符号emoji需要 4 字节用 utf8 存这些字符就会报错或变成乱码。utf8mb4 才是真正的“全 Unicode”支持现在所有新项目都应该默认 utf8mb4。为什么不让 PHP 用 root 账号连数据库安全考虑是第一位的——Web 应用一旦被 SQL 注入攻击者拿到的权限就被限制在一个数据库里而不会直接拿到整个服务器的数据库管理权。另外从职责解耦角度应用账号单独授权即使密码泄露处置影响面也可控。注意 MySQL 修改密码是有“密码策略”的MySQL 5.7 默认要求密码包含大写、小写、数字和特殊字符长度至少 8 位。你要是不想用这么变态的策略可以降低 validate_password_policy但新手阶段建议先顺应默认规则以后你在生产环境也能保持这个好习惯。5.3 MySQL 关键配置优化MySQL 的配置文件在 /etc/my.cnf这里挑几个适合单机小站的核心参数说[mysqld] # 默认字符集 character-set-serverutf8mb4 collation-serverutf8mb4_general_ci # InnoDB 缓冲池大小这是最重要的内存参数 # 经验值物理内存的 50%-70% innodb_buffer_pool_size 512M # 连接数 max_connections 200 # 慢查询日志彻底排查 SQL 性能问题 slow_query_log 1 slow_query_log_file /var/log/mysql-slow.log long_query_time 2innodb_buffer_pool_size 是 InnoDB 引擎的“数据缓存区”MySQL 会把最常用的表数据页和索引页放在这个区域里读写都先走内存。这个值设太小MySQL 就会频繁做磁盘 I/O性能直线下降设太大又会跟 PHP-FPM 抢内存。一台 2GB 内存的服务器我建议 512M 到 1G 之间。你可以用 MySQL 自带的性能监控命令看命中率再微调SHOW GLOBAL STATUS LIKE Innodb_buffer_pool_read%;配置改完重启 MySQLsystemctl restart mysqld5.4 验证 MySQL 是否可用mysql -u app_user -p -h 127.0.0.1 app_db -e SELECT 1;能返回 1 就说明账号、数据库、权限配置都正常。这里顺便说一句PHP 远程连接 MySQL 时用的主机名建议写 127.0.0.1 而不是 localhost因为 PHP 的 mysqlnd 驱动对 localhost 的处理有时会走 socket写 IP 更明确也让排查问题少一个变量。6. 三者联动安装测试与联调排查前面三步都是单点安装真正让 LNMP 成为一个完整系统的是联调这一步。这里我会做一个完整的测试用例并带你把常见问题全过一遍。6.1 删除默认欢迎页部署一个测试站点先清理 Nginx 默认的 index.html然后创建我们自己的测试入口rm -f /usr/share/nginx/html/index.html创建一个 info.php用 phpinfo和一个 index.php连接数据库这样一次访问就能同时验证 Nginx、PHP-FPM、MySQL 三条链路。创建 index.phpvim /usr/share/nginx/html/index.php?php // 数据库连接测试 $host 127.0.0.1; $user app_user; $pass AppPassw0rd!; $db app_db; try { $pdo new PDO(mysql:host$host;dbname$db;charsetutf8mb4, $user, $pass); $stmt $pdo-query(SELECT LNMP 数据库连接成功 AS result); $row $stmt-fetch(PDO::FETCH_ASSOC); echo h1 . $row[result] . /h1; echo pPHP 版本: . phpversion() . /p; } catch (PDOException $e) { echo 数据库连接失败: . $e-getMessage(); }修改 Nginx 的 index 顺序让它默认优先找 index.phpindex index.php index.html index.htm;然后重载 Nginxnginx -t systemctl reload nginx浏览器访问http://你的IP/如果一切正常你会看到“LNMP 数据库连接成功”和 PHP 版本号。6.2 完整测试清单建议按以下顺序逐步验证每一步都代表一个层级测试内容预期结果验证的层级curl http://127.0.0.1/返回 HTML 内容Nginx 状态curl -I http://127.0.0.1/返回 200 和 Nginx 版本Nginx 响应http://IP/info.php显示 phpinfo 页面Nginx → PHP-FPMhttp://IP/显示数据库连接成功Nginx → PHP-FPM → MySQL6.3 常见报错快查表我在实际部署和帮别人排查时收集了下面这些高频问题你以后十有八九也会撞见现象可能原因排查与解决方案浏览器访问 IP 打不开服务器安全组/防火墙未放行 80 端口云控制台安全组规则放行 TCP 80本地用systemctl status firewalld确认防火墙状态502 Bad GatewayPHP-FPM 未启动、9000 端口未监听、或 fastcgi_pass 配置错误依次检查ss -lnt | grep 9000、PHP-FPM 日志、Nginx error.log404 File not foundfastcgi_param SCRIPT_FILENAME 路径拼错确认 root 路径和 $document_root 一致检查目录是否存在、权限是否放行PHP 页面能显示 HTML 但 php 代码被当文本输出Nginx 没有加载 PHP 的 location 规则检查配置里是否有location ~ \\.php$块reload nginx访问显示空白页白屏PHP 脚本有语法错误或 error_reporting 被关闭查看 PHP-FPM 日志php -l 文件名做语法检查临时开启 display_errors数据库连接 Access denied账号密码错误、主机限制不匹配、密码策略用命令行试连mysql -u app_user -p -h 127.0.0.1 app_db检查账号的 host 授权是 localhost 还是 %PDO 驱动不存在PHP 没装 pdo_mysql 扩展php -m | grep pdo_mysql没有就yum install -y php-mysqlnd中文乱码数据库/表/连接字符集不一致统一为 utf8mb4建库时、连接时都指定charsetutf8mb46.4 日志是唯一信源排查 LNMP 问题最忌讳的就是瞎猜。你要坚信所有线索都在日志里。三套组件的日志分开看Nginx 日志/var/log/nginx/error.log、/var/log/nginx/access.logPHP-FPM 日志/var/log/php-fpm/error.log、/var/log/php-fpm/www-error.logMySQL 日志/var/log/mysqld.log、/var/log/mysql-slow.log以“502 Bad Gateway”为例我排查的顺序是先看 Nginx 的 error.log里面会写明连接 PHP-FPM 失败的原因再看 PHP-FPM 的 error.log里面会写明 PHP 进程为何异常退出。两步基本能定位 90% 的问题。你如果按这个套路来做会发现那些看起来很吓人的报错其实都是小问题。7. 进阶调优与长期维护心得LNMP 跑通只是第一步让它稳定、安全、高效地跑才是正经事。这里分享几个我长期维护中沉淀下来的经验。7.1 一点权限控制的经验网站根目录的权限最容易被搞坏。我看到很多人在服务器上图省事直接chmod -R 777 /usr/share/nginx/html这等于把你的网站目录权限全部开放给所有用户——一旦被上传了恶意文件攻击者就有机会直接执行任意代码。正确的做法是目录权限设 755文件权限设 644即程序和目录可读、可执行但只有拥有者可写。网站代码的拥有者设为 nginx 用户这样 PHP-FPM 读写起来最顺。如果是运行一个需要写文件的应用比如上传图片只把需要写的子目录比如 uploads设为 755 并授予 nginx 用户写权限其他目录保持只读。7.2 别忘了给 PHP-FPM 和 MySQL 也做开机自启Nginx 开机自启我们已经设置过了。PHP-FPM 和 MySQL 也要同样操作systemctl enable php-fpm systemctl enable mysqld然后重启一次服务器确认三个服务在重启后都能自动拉起。这一步很多人漏掉结果服务器一重启网站直接 502排查半天才发现 PHP-FPM 根本没起来。7.3 SSL 证书配置现在被主流浏览器标记为“不安全”的纯 HTTP 网站已经越来越不受待见。LNMP 架构上配置 SSL 非常顺推荐签发免费的证书步骤如下确保域名已经解析到服务器 IPSSL 证书必须绑定域名不能用 IP。用包管理器安装客户端软件certbot。执行签发命令证书会自动部署到 Nginx 配置里。配置自动续期证书有效期通常只有 90 天记好定时续期任务。证书装好后Nginx 的 server 块里会多出 listen 443 ssl 和相关证书路径。这里友情提醒启用 SSL 后记得把原来的 80 端口配置改成一个 301 跳转把所有 HTTP 请求重定向到 HTTPS这也是 SEO 规范要求的标准做法。7.4 个人运维习惯记录最后分享几个让我少熬夜的运维习惯勤打快照在云控制台为服务器做定期磁盘快照。LNMP 部署的每一步操作前打个快照出问题了秒回滚比什么救命秘籍都管用。监控端口把 80、443、3306、9000 四个端口的状态加到你常用的监控工具里端口掉了就是服务挂了第一时间能收到告警。定期清理日志Nginx 和 MySQL 的日志默认可能无限增长时间长了会占满磁盘。建议配置 logrotate 定时轮转保留最近 30 天日志就足够。记录变更每次改动配置前先 cp 一份备份文件比如 nginx.conf.bak_20240101。别问我为什么等你改坏过配置又手忙脚乱恢复时就会感谢这个习惯了。我个人经历里印象最深的坑是一次调完 PHP 扩展后忘了重启 PHP-FPM结果新配置完全没生效。PHP 的配置加载机制和 Nginx 一样是启动时一次性读取改完必须 restartreload 对某些扩展可能也不生效。从那以后我养成了一个习惯改配置后只认 systemctl restart不认心理上的“应该生效了”。这虽然听起来很基础但就是这些细节决定了你是在享受技术还是在被技术折磨。LNMP 这套架构搭建一次之后你会越来越熟练从默认配置调优到写各种重写规则、负载均衡策略都是在这个底子上长出来的能力。愿你部署顺利有问题时记得对照这篇文章的排查表稳扎稳打你一定能把每个组件都驯服得服服帖帖。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。