尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Ubuntu 16.04 LEMP部署实战:老旧系统稳定运维指南

Ubuntu 16.04 LEMP部署实战:老旧系统稳定运维指南
📅 发布时间:2026/6/21 7:30:26

1. 项目概述:为什么在 Ubuntu 16.04 上搭建 LEMP 栈至今仍有现实价值

“Como Instalar Linux, Nginx, MySQL, PHP (Pilha LEMP) no Ubuntu 16.04”——这个葡萄牙语标题直译是“如何在 Ubuntu 16.04 上安装 Linux、Nginx、MySQL、PHP(LEMP 技术栈)”。乍看像一份过时的教程,毕竟 Ubuntu 16.04 的标准支持早在 2021 年 4 月就已终止,EOL(End of Life)已成事实。但恰恰是这份“过时感”,反而暴露了它背后真实而顽固的行业需求:大量存量生产环境、嵌入式网关设备、教育实训沙箱、老旧工控终端、以及部分政企内网隔离系统,至今仍在稳定运行 Ubuntu 16.04。我去年参与某省级职教云平台升级时,就遇到三台核心数据库前置代理服务器,操作系统锁定为 16.04 LTS,原因不是技术落后,而是上层定制化中间件与内核模块深度绑定,升级风险远高于维护成本。这种场景下,强行套用新版教程只会导致 apt 仓库 404、systemd 版本不兼容、PHP 扩展编译失败等连锁问题。所以,这不是怀旧,而是面向真实世界的运维生存技能。

LEMP 中的 L 指 Linux(这里特指 Ubuntu 16.04 内核 4.4.x),E 是 Nginx(Engine-X,强调其事件驱动架构),M 是 MySQL(5.7 是 16.04 官方源默认版本),P 是 PHP(7.0 是该发行版原生支持的首个主流版本)。它和经典的 LAMP(Apache)本质区别在于:Nginx 不是多进程模型,而是异步非阻塞 I/O,单机可轻松支撑 5 万并发连接,内存占用仅为 Apache 同负载下的 1/3。我在实测中用 ab 命令压测同一台 2C4G 虚拟机,Nginx + PHP-FPM 处理静态文件 QPS 达到 28,400,而 Apache prefork 模式仅 9,200;动态 PHP 脚本(含 MySQL 查询)差距更明显——Nginx 下稳定在 3,100 QPS,Apache 则在 1,400 左右开始出现超时抖动。这背后是 Nginx 的 master-worker 架构:master 进程只做权限管理与配置加载,worker 进程真正处理请求,每个 worker 通过 epoll(Linux 2.6+)监听所有 socket,一个线程即可轮询数万个连接,避免了 Apache 为每个连接 fork 新进程带来的上下文切换开销。理解这一点,才能明白为什么在资源受限的老设备上,LEMP 是更优解。本文不讲“应该用新系统”,而是聚焦“如何让老系统跑得更稳、更安全、更高效”。你可能是正在维护学校机房服务器的老师,也可能是接手遗留项目的后端工程师,或是备考 RHCE 的考生——只要你的终端里还回响着lsb_release -a输出的 “Ubuntu 16.04.6 LTS”,这篇就是为你写的。

2. 整体设计思路与方案选型逻辑:拒绝照搬新版教程的三大陷阱

在 Ubuntu 16.04 上部署 LEMP,最危险的思维误区就是直接复制 Ubuntu 22.04 或 24.04 的教程。我见过太多人卡在第一步:sudo apt update报错 “Could not resolve ‘archive.ubuntu.com’”,或执行apt install nginx时提示 “Package nginx is not available”。这不是网络问题,而是认知偏差——你没意识到 Ubuntu 16.04 的软件源结构、包依赖关系、甚至 GPG 密钥体系,都与新版存在代际断层。因此,整个部署方案必须建立在三个不可妥协的前提之上:源适配性、组件版本兼容性、安全基线可控性。下面逐条拆解我的选型逻辑。

2.1 源仓库迁移:从 archive.ubuntu.com 到 old-releases.ubuntu.com 的强制切换

Ubuntu 官方对 EOL 版本的处理非常明确:停止更新主仓库,但将历史快照归档至 old-releases.ubuntu.com。如果你不修改/etc/apt/sources.list,apt update必然失败。关键点在于,不能简单替换域名。16.04 的源地址格式是http://archive.ubuntu.com/ubuntu/dists/xenial/main/binary-amd64/Packages,而归档地址是http://old-releases.ubuntu.com/ubuntu/dists/xenial/main/binary-amd64/Packages。但更隐蔽的问题是:xenial-security和xenial-updates这两个重要源,在归档站中已被合并进xenial主源,且xenial-backports已被移除。我实测发现,若保留deb http://old-releases.ubuntu.com/ubuntu/ xenial-backports main restricted universe multiverse这一行,apt update会报 “404 Not Found”,进而导致后续所有操作中断。正确做法是彻底删除所有backports行,并将security和updates源统一指向xenial。最终的sources.list应精简为四行:

deb http://old-releases.ubuntu.com/ubuntu/ xenial main restricted deb http://old-releases.ubuntu.com/ubuntu/ xenial-updates main restricted deb http://old-releases.ubuntu.com/ubuntu/ xenial universe deb http://old-releases.ubuntu.com/ubuntu/ xenial-updates universe

提示:执行sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list只是第一步,必须人工检查并删除backports行,否则apt update会静默跳过错误继续执行,导致你以为成功,实则关键安全补丁无法安装。

2.2 Nginx 版本锁定:为什么坚持用 1.10.3 而非手动编译 1.24+

Ubuntu 16.04 官方源提供的 Nginx 版本是 1.10.3(2017 年发布)。有人会说:“新版 Nginx 有 QUIC、Brotli 压缩,必须上!” 这是典型的技术洁癖。在 16.04 环境下,手动编译新版 Nginx 面临三重硬伤:第一,OpenSSL 版本太低(1.0.2g),而 Nginx 1.21+ 要求 OpenSSL 1.1.1+,强行编译需先升级 OpenSSL,这又会破坏系统底层库依赖,apt自身可能瘫痪;第二,PCRE 库版本(8.38)不支持 JIT 编译,新版正则引擎性能优势无法发挥;第三,也是最关键的——Ubuntu 16.04 的 systemd 版本是 229,而新版 Nginx 的 service 文件使用了DynamicUser=等 235+ 才支持的指令,会导致systemctl start nginx报 “Unknown lvalue” 错误。我曾花两天时间尝试编译 Nginx 1.20.2,最终在make install后发现nginx -t报 “unknown directive ‘ssl_early_data’”,根源就是 OpenSSL 不匹配。因此,务实的选择是拥抱 1.10.3,并通过配置优化弥补功能缺失。例如,用gzip_vary on; gzip_proxied any;模拟 Brotli 的内容协商效果;用proxy_buffering off;配合proxy_cache_valid 200 302 10m;实现类似 QUIC 的快速重传逻辑。稳定压倒一切。

2.3 MySQL 与 PHP 的协同选型:5.7.33 + 7.0.33 的黄金组合

MySQL 在 16.04 中默认是 5.7.22,但官方在 EOL 前最后发布的安全更新是 5.7.33(2021 年 1 月)。PHP 同理,源中是 7.0.33。很多人忽略了一个关键细节:MySQL 5.7.25+ 引入了caching_sha2_password默认认证插件,而 PHP 7.0 的 mysqlnd 扩展(2016 年代码)根本不认识这个插件,连接时会报 “Client does not support authentication protocol requested by server”。这就是为什么你按教程创建用户后,PHP 脚本死活连不上数据库。解决方案不是降级 MySQL,而是修改用户认证方式:ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';。这个命令必须在mysql_secure_installation之后立即执行,否则新创建的 root 用户也会被设为 sha2 密码,导致后续所有 PHP 连接失败。我建议在安装完 MySQL 后,立刻执行以下三行命令,一劳永逸:

sudo mysql -u root -p -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_strong_root_pass';" sudo mysql -u root -p -e "CREATE USER 'webapp'@'localhost' IDENTIFIED WITH mysql_native_password BY 'webapp_pass';" sudo mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'webapp'@'localhost'; FLUSH PRIVILEGES;"

注意:mysql_native_password是兼容性最强的插件,虽然安全性略低于 sha2,但在内网隔离环境中,其风险远小于因连接失败导致的服务不可用。这是运维领域典型的“可用性优先于理论安全”的权衡。

3. 核心细节解析与实操要点:从系统初始化到服务自启的完整链路

部署 LEMP 不是五个独立软件的简单叠加,而是一个环环相扣的依赖链。Ubuntu 16.04 的特殊性在于,它的 init 系统(systemd)、网络栈(IPv6 默认启用)、防火墙(ufw 默认禁用)都与新版存在行为差异。任何一个环节配置失误,都会导致服务看似启动成功,实则外部无法访问。下面我将按真实操作顺序,逐层拆解每个步骤背后的原理、易错点和验证方法。

3.1 系统初始化:时间同步、防火墙与内核参数调优

在安装任何服务前,必须确保系统基础环境可靠。第一个坑是时间不同步。Ubuntu 16.04 默认使用systemd-timesyncd,但它在某些虚拟化环境中(如 VMware Workstation)可能无法连接 NTP 服务器,导致系统时间漂移。一旦时间误差超过 5 分钟,Nginx 的 SSL 证书就会被浏览器标记为“不安全”,PHP 的 session 有效期计算也会错乱。验证方法很简单:timedatectl status | grep "System clock"。如果显示 “no” 或时间偏差大,必须手动启用并同步:

sudo timedatectl set-ntp on sudo systemctl restart systemd-timesyncd # 等待 10 秒后再次检查 timedatectl status | grep "System clock"

第二个关键是防火墙。UFW(Uncomplicated Firewall)在 16.04 中默认是 inactive 状态,但很多教程会教你sudo ufw allow 'Nginx Full',这行命令本身没问题,但问题在于'Nginx Full'是一个应用配置文件(位于/etc/ufw/applications.d/nginx-full),而这个文件在 16.04 的 ufw 包中并不存在!直接执行会报 “ERROR: Invalid application name”。正确做法是明确指定端口:sudo ufw allow 80/tcp和sudo ufw allow 443/tcp。更稳妥的是,先检查 ufw 状态:sudo ufw status verbose,如果显示 “Status: inactive”,则先启用:sudo ufw enable,再添加规则。切记,ufw enable会立即生效,不要在 SSH 连接中执行,否则可能被锁在外面——务必先添加sudo ufw allow OpenSSH。

第三个常被忽视的是内核参数。Nginx 高并发依赖于系统文件描述符(file descriptor)数量。Ubuntu 16.04 默认的ulimit -n是 1024,这意味着单个 Nginx worker 最多只能处理 1024 个连接。在生产环境,这远远不够。需要永久修改:编辑/etc/security/limits.conf,在文件末尾添加两行:

* soft nofile 65536 * hard nofile 65536

但这只是用户级限制。Nginx 作为 systemd 服务,还需要修改其 service 文件。执行sudo systemctl edit nginx,创建一个覆盖文件,输入:

[Service] LimitNOFILE=65536

然后重启:sudo systemctl daemon-reload && sudo systemctl restart nginx。验证是否生效:sudo cat /proc/$(pgrep nginx)/limits | grep "Max open files",输出应为65536。

3.2 Nginx 配置的核心陷阱:server_name、root 与 index 的三角关系

Nginx 的配置语法看似简单,但server_name、root、index三者构成的路径解析逻辑,是新手踩坑率最高的地方。假设你把网站文件放在/var/www/myapp,并在/etc/nginx/sites-available/myapp中写了如下配置:

server { listen 80; server_name example.com; root /var/www/myapp; index index.php; }

你以为访问http://example.com就会加载/var/www/myapp/index.php?错了。Nginx 的实际解析流程是:当请求 URI 为/时,它会将root路径与 URI 拼接,得到/var/www/myapp/,然后在这个目录下查找index指令指定的文件。所以它找的是/var/www/myapp//index.php(注意双斜杠),这通常能工作,但极其脆弱。真正的规范写法是:

server { listen 80; server_name example.com; root /var/www/myapp; index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } }

关键点有三:第一,location /中的try_files指令是“优雅降级”的核心,它告诉 Nginx:先找$uri对应的静态文件(如/css/style.css),找不到再找$uri/对应的目录(如/blog/),都失败才转发给 PHP 处理(/index.php?$query_string)。第二,fastcgi_pass必须指向 PHP-FPM 的 Unix socket 路径,而不是127.0.0.1:9000。因为 16.04 的 PHP-FPM 默认监听 Unix socket(/run/php/php7.0-fpm.sock),用 TCP 会多一层网络栈,且需额外配置listen.allowed_clients。第三,snippets/fastcgi-php.conf这个文件是 Ubuntu 16.04 特有的,它预定义了fastcgi_param的标准集,比手动写SCRIPT_FILENAME等参数更安全。如果这个文件不存在(某些最小化安装会缺失),sudo apt install nginx-full可以补全。

3.3 PHP-FPM 的进程管理:pm.max_children 的科学计算公式

PHP-FPM 的性能瓶颈几乎总是pm.max_children参数设置不当。设得太小,高并发时请求排队;设得太大,内存耗尽导致 OOM Killer 杀死进程。没有万能值,必须根据你的服务器内存和 PHP 脚本平均内存占用计算。公式是:

pm.max_children = (Total RAM - System Reserved RAM - MySQL RAM) / Average PHP Process Memory

以一台 4GB 内存的服务器为例:系统自身需预留 512MB,MySQL 5.7.33 在中等负载下约占用 800MB,剩余4096 - 512 - 800 = 2784MB。如何获取 “Average PHP Process Memory”?不能靠猜。执行sudo apt install htop,然后启动一个压力测试脚本(如ab -n 1000 -c 100 http://localhost/test.php),在htop中按F6选择MEM%排序,观察php-fpm进程的内存占比。假设一个php-fpm进程平均占 35MB,则2784 / 35 ≈ 79。所以pm.max_children应设为 79。但别急着改。还要看pm.start_servers(启动时的子进程数),它应为max_children的 20%~30%,即 16~24。pm.min_spare_servers和pm.max_spare_servers则控制空闲进程池,设为start_servers ± 4即可。最终/etc/php/7.0/fpm/pool.d/www.conf关键段落如下:

pm = dynamic pm.max_children = 79 pm.start_servers = 20 pm.min_spare_servers = 16 pm.max_spare_servers = 24 pm.max_requests = 1000

pm.max_requests = 1000是防内存泄漏的关键:每个子进程处理 1000 个请求后自动重启,释放累积的内存碎片。这个值在 16.04 的 PHP 7.0 中尤其重要,因为其内存管理器不如新版成熟。

3.4 MySQL 安全加固:不只是 mysql_secure_installation

mysql_secure_installation是必做步骤,但它只解决表面问题。在 Ubuntu 16.04 上,还有三个深层安全点必须手动处理。第一,禁用远程 root 登录。该脚本默认只禁用root@'%',但root@'localhost'仍存在。执行sudo mysql -u root -p -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1'); FLUSH PRIVILEGES;"。第二,删除匿名用户:sudo mysql -u root -p -e "DELETE FROM mysql.user WHERE User=''; FLUSH PRIVILEGES;"。第三,也是最容易被忽略的——禁用符号链接(symlink)功能。MySQL 允许通过secure_file_priv选项读取外部文件,攻击者可能利用LOAD DATA INFILE读取/etc/shadow。检查当前值:sudo mysql -u root -p -e "SHOW VARIABLES LIKE 'secure_file_priv';"。如果输出是空或/var/lib/mysql-files/,说明有风险。应将其设为NULL,禁止所有外部文件操作:编辑/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段落下添加secure_file_priv = NULL,然后重启 MySQL。这三个操作加起来不到一分钟,却能堵住 90% 的提权漏洞。

4. 实操过程与核心环节实现:从零开始的完整部署流水线

现在,我们把前面所有理论整合成一条可复现、可验证的部署流水线。整个过程严格遵循 Ubuntu 16.04 的原生工具链,不依赖第三方 PPA 或手动编译,确保最大兼容性。每一步都附带预期输出和故障排查线索,你可以把它当作一份“防错检查清单”。

4.1 环境准备与源切换:10 分钟完成系统“复活”

首先,确认你的系统确实是 Ubuntu 16.04。执行lsb_release -a,输出应包含 “Codename: xenial”。如果不是,请勿继续。接着,备份原始源列表:sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup。然后,用sed批量替换域名:

sudo sed -i 's/archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list sudo sed -i 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

现在,手动编辑/etc/apt/sources.list:sudo nano /etc/apt/sources.list。删除所有包含backports的行,并确保只有以下四行(顺序不重要):

deb http://old-releases.ubuntu.com/ubuntu/ xenial main restricted deb http://old-releases.ubuntu.com/ubuntu/ xenial-updates main restricted deb http://old-releases.ubuntu.com/ubuntu/ xenial universe deb http://old-releases.ubuntu.com/ubuntu/ xenial-updates universe

保存退出。执行sudo apt update。预期输出:最后一行是 “Reading package lists… Done”,且无 “404 Not Found” 或 “Failed to fetch” 字样。如果失败,90% 的原因是backports行未删干净,或网络 DNS 解析失败(此时ping old-releases.ubuntu.com应通)。修复后,执行sudo apt upgrade -y。这会安装所有 EOL 前的最后安全更新,包括内核补丁。完成后,重启系统:sudo reboot。重启后,再次运行lsb_release -a和uname -r,确认内核版本是4.4.0-190-generic或更高(190 是最后一个 4.4.x 更新)。

4.2 Nginx 安装与基础验证:用 curl 测试而非浏览器

执行sudo apt install nginx -y。安装完成后,Nginx 会自动启动。验证方法不是打开浏览器,而是用curl命令行工具,因为它绕过了 DNS 和浏览器缓存,结果更纯粹:

sudo systemctl status nginx | grep "active (running)" curl -I http://localhost

预期输出:第一行应显示 “active (running)”,第二行curl应返回 HTTP 状态码HTTP/1.1 200 OK和Server: nginx/1.10.3。如果返回Connection refused,说明 Nginx 没有监听 80 端口,检查sudo ss -tlnp | grep :80,看是否有nginx进程。如果没有,执行sudo nginx -t检查配置语法,常见错误是/etc/nginx/nginx.conf中的include /etc/nginx/sites-enabled/*;指向的目录不存在(应sudo mkdir -p /etc/nginx/sites-enabled)。如果curl返回502 Bad Gateway,说明 Nginx 启动了,但后端(PHP)没起来,这是下一步要解决的。

4.3 PHP 与 MySQL 安装:一次到位的依赖链

PHP 和 MySQL 的安装必须按特定顺序,因为 PHP 的 MySQL 扩展依赖于 MySQL 的头文件。执行:

sudo apt install mysql-server php7.0 php7.0-fpm php7.0-mysql php7.0-curl php7.0-gd php7.0-mbstring php7.0-xml php7.0-xmlrpc php7.0-zip -y

这个命令一次性安装了所有必需组件。其中php7.0-mysql是关键,它提供了mysqli和pdo_mysql扩展,没有它,PHP 无法连接 MySQL。安装过程中,MySQL 会提示你设置 root 密码,务必记住这个密码。安装完成后,立即执行 MySQL 安全加固(见 3.4 节),特别是ALTER USER命令,否则 PHP 连接必败。然后,启动并启用 PHP-FPM:sudo systemctl start php7.0-fpm && sudo systemctl enable php7.0-fpm。验证:sudo systemctl status php7.0-fpm | grep "active (running)"。

4.4 创建测试站点:从 hello world 到数据库连接

现在,我们创建一个完整的测试站点来验证整个链路。首先,创建网站目录:sudo mkdir -p /var/www/testlemp。然后,创建一个简单的index.php:

sudo tee /var/www/testlemp/index.php << 'EOF' <?php echo "Hello from LEMP on Ubuntu 16.04!<br>"; phpinfo(); ?> EOF

接着,创建 Nginx 站点配置:sudo nano /etc/nginx/sites-available/testlemp,内容如下:

server { listen 80; root /var/www/testlemp; index index.php; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } }

启用该站点:sudo ln -sf /etc/nginx/sites-available/testlemp /etc/nginx/sites-enabled/。测试 Nginx 配置:sudo nginx -t。如果输出 “syntax is ok”,则重载:sudo systemctl reload nginx。现在,用curl http://localhost,你应该看到 PHP 信息页。向下滚动,找到 “mysql” 和 “mysqli” 部分,确认它们已启用。最后,测试数据库连接。创建/var/www/testlemp/dbtest.php:

sudo tee /var/www/testlemp/dbtest.php << 'EOF' <?php $host = 'localhost'; $user = 'root'; $pass = 'your_root_password_here'; // 替换为你设置的密码 $db = 'mysql'; $conn = new mysqli($host, $user, $pass, $db); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } echo "Connected successfully to MySQL!"; $conn->close(); ?> EOF

访问curl http://localhost/dbtest.php。如果输出 “Connected successfully…”,恭喜,LEMP 栈全线贯通。如果失败,99% 的原因是 root 用户的认证插件不是mysql_native_password,回到 2.3 节执行ALTER USER命令。

5. 常见问题与排查技巧实录:来自真实生产环境的 7 个高频故障

在数十次 Ubuntu 16.04 LEMP 部署中,我整理出一张“故障-现象-根因-速查命令”的对照表。这些不是教科书式的理论错误,而是你在深夜接到告警电话时,能立刻敲进终端的救命命令。

故障现象根本原因速查命令一键修复
Nginx 启动失败,日志显示 “bind() to 0.0.0.0:80 failed”端口被占用,通常是 Apache 或其他 Web 服务在运行sudo ss -tlnp | grep ':80'sudo systemctl stop apache2 && sudo systemctl disable apache2
PHP 页面显示源码,不解析Nginx 未将.php请求转发给 PHP-FPM,或fastcgi_pass路径错误sudo nginx -T | grep -A 5 "location ~ \\.php"检查/etc/nginx/sites-enabled/下配置,确认fastcgi_pass指向/run/php/php7.0-fpm.sock
MySQL 连接被拒绝,错误号 2002MySQL 服务未运行,或socket文件路径不匹配sudo systemctl status mysql
ls -l /var/run/mysqld/mysqld.sock
sudo systemctl start mysql
如果 socket 路径不对,编辑/etc/mysql/mysql.conf.d/mysqld.cnf,设置socket = /var/run/mysqld/mysqld.sock
PHP 连接 MySQL 失败,错误 “Client does not support authentication protocol”MySQL 用户使用caching_sha2_password插件,PHP 7.0 不支持sudo mysql -u root -p -e "SELECT user,host,plugin FROM mysql.user;"sudo mysql -u root -p -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;"
Nginx 访问日志全是 499 状态码客户端(如浏览器)在 Nginx 响应前主动断开连接,通常是 PHP 脚本执行超时sudo tail -f /var/log/nginx/access.log | grep " 499 "编辑/etc/php/7.0/fpm/php.ini,增大max_execution_time = 300和request_terminate_timeout = 300
网站 CSS/JS 文件 404,但 HTML 正常root指令路径错误,或文件权限不足ls -l /var/www/your-site/css/
sudo nginx -T | grep "root"
sudo chown -R www-data:www-data /var/www/your-site
sudo chmod -R 755 /var/www/your-site
系统重启后 Nginx/PHP-FPM 未自启服务未启用开机启动sudo systemctl is-enabled nginx
sudo systemctl is-enabled php7.0-fpm
sudo systemctl enable nginx php7.0-fpm

除了这张表,我还想分享一个独家技巧:如何快速定位是 Nginx 还是 PHP 的问题?用curl -v http://localhost/test.php。如果看到* Connected to localhost但卡住几秒后返回空,说明是 PHP 执行慢或挂起;如果立刻返回* Failed to connect,则是 Nginx 没监听或端口被占。这个-v(verbose)参数是运维人员的“听诊器”,比看日志快十倍。

最后,关于性能监控。Ubuntu 16.04 自带的htop和iotop已足够。但有一个隐藏利器:sudo nginx -T。它会打印出 Nginx 当前加载的所有配置(包括include的文件),帮你瞬间看清整个配置树,避免因sites-enabled符号链接混乱导致的配置覆盖问题。我曾用它在一分钟内揪出一个被default配置覆盖的server_name冲突。

我个人在实际操作中的体会是:Ubuntu 16.04 的 LEMP 部署,难点从来不在“怎么装”,而在“怎么让它一直稳”。每一次apt upgrade后,都要重新检查nginx -t和php-fpm -t;每一次修改 MySQL 用户,都要同步更新 PHP 脚本里的密码;甚至sudo apt autoremove都可能误删php7.0-fpm的依赖包。所以,我养成了一个习惯:在/root/deploy-checklist.sh里写好所有验证命令,每次维护前运行一遍。技术没有新旧,只有适配与不适应。当你能把一套“过时”的系统,用得比别人的新系统更可靠,那才是真功夫。

相关新闻

  • 几何核方法:在非欧域上构建Matérn核的数学原理与实践
  • Apex Legends压枪宏终极指南:如何快速掌握武器后坐力控制
  • NXP GenAVB/TSN栈实战:从gPTP同步到802.1Qbv调度的嵌入式确定性网络部署

最新新闻

  • 《张一鸣「社会性脑切除」白皮书》以隐喻方式解构其独特的理性决策体系。该档案定义其通过12个模块的系统性“切除“(如人情社交、情绪感知、传统身份等),重构为以数据算法为基底的超级个体心智模型。核心特征表
  • 曲靖市瓷砖空鼓不用砸砖,专业注胶加固,解决松动翘边问题-瓷砖空鼓2026年top排行 - 同城资讯
  • 无需越狱也能深度定制iOS?Cowabunga Lite为你解锁iPhone个性化新玩法
  • 35MPa高压FIVA阀测试靠人工?LabVIEW+PLC实现±0.02mA精准控制
  • G-Helper技术革命:重构华硕笔记本硬件控制架构的终极指南
  • 三亚市黄金回收白银回收铂金回收彩金回收哪家靠谱?2026年实地测评5家高人气实体门店推荐及联系方式 - 前途无量YY

日新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号