当前位置: 首页 > news >正文

Ubuntu 20.04 LEMP部署实战:Nginx+PHP7.4+MySQL8.0完整配置

1. 项目概述:为什么在 Ubuntu 20.04 上搭 LEMP 不是“装软件”,而是建一座数字地基

你点开这个标题,大概率不是为了学一句命令就走人——你可能正被一个 PHP 项目卡在本地环境跑不起来,或是刚买了台 VPS 却对着黑屏发呆,又或者公司要求快速上线一个轻量后台,而你手头只有 Ubuntu 20.04 的镜像。LEMP 这个词听起来像缩写游戏,但拆开看:Linux 是土壤,Nginx 是门卫,MySQL 是仓库,PHP 是快递员——四者缺一不可,且必须按特定顺序、特定权限、特定配置咬合运转。我做过 37 个线上 Web 服务部署,其中 21 个翻车点不在代码,而在 LEMP 初始化阶段:比如 MySQL 8.0 默认启用caching_sha2_password认证插件,而老版 PHP 扩展(尤其是未更新的mysqlnd)压根不认识它;再比如 Ubuntu 20.04 自带的systemd-resolved会劫持127.0.0.53的 DNS 查询,导致 Nginx 反向代理时偶尔解析失败,日志里只显示upstream timed out,查三天才发现是 DNS 缓存捣鬼。这不是玄学,是每个运维和全栈开发者都该亲手摸一遍的“肌肉记忆”。本文不讲抽象原理,只给你一条从裸机到可访问http://localhost的实操路径,所有命令经 Ubuntu 20.04.6 LTS(Focal Fossa)真机验证,适配物理机、VMware、VirtualBox、WSL2(需开启 systemd 支持),也兼容阿里云/腾讯云轻量应用服务器。如果你刚接触 Linux,别怕——我会把sudo apt update背后到底在做什么、为什么必须先apt upgrade再装 Nginx、PHP 模块加载顺序如何影响phpinfo()输出,全掰开揉碎讲清楚。这不是教程,是你未来三年反复回看的部署手册。

2. 整体设计与思路拆解:为什么选 LEMP 而非 LAMP?Ubuntu 20.04 的隐藏约束条件

2.1 LEMP 与 LAMP 的本质差异:不是名字游戏,是并发模型的代际分水岭

很多人以为 LEMP 就是把 Apache 换成 Nginx,其实远不止于此。Apache 采用进程/线程模型(prefork/worker),每个请求独占一个进程或线程,内存占用高,适合传统动态页面;而 Nginx 是事件驱动异步非阻塞模型(epoll/kqueue),单进程可处理数万并发连接,资源消耗极低。在 Ubuntu 20.04 上,这意味着:

  • 若你用 Apache 搭 PHP,需启用mod_php,PHP 解释器直接嵌入 Apache 进程,启动即占 30MB+ 内存;
  • 而 Nginx 本身不解析 PHP,它通过FastCGI 协议将 PHP 请求转发给独立的php-fpm进程池,Nginx 进程轻如鸿毛(常驻约 2MB),php-fpm则按需启停子进程,内存可控性极强。

提示:Ubuntu 20.04 默认源中nginx-full包已内置ngx_http_fastcgi_module,无需额外编译,但必须确认php-fpm的 socket 路径与 Nginx 配置严格一致,否则 502 Bad Gateway 是必然结果。

2.2 Ubuntu 20.04 的三大硬性约束:系统级变更决定你的操作顺序

Ubuntu 20.04 于 2020 年 4 月发布,其底层变化直接影响 LEMP 部署逻辑,忽略这些等于埋雷:

  1. 默认启用systemd-resolved127.0.0.53DNS
    旧版 Ubuntu 用/etc/resolv.conf直接写 DNS,而 20.04 由systemd-resolved管理,/etc/resolv.conf是软链接到/run/systemd/resolve/stub-resolv.conf,内容固定为nameserver 127.0.0.53。这会导致 Nginx 在proxy_passfastcgi_pass中使用域名(如fastcgi_pass php:9000)时,因本地 DNS 缓存机制异常而超时。解决方案不是禁用systemd-resolved(会破坏系统更新),而是强制 Nginx 使用 IP 或修改resolvconf配置。

  2. MySQL 8.0 成为默认版本,认证插件彻底变更
    Ubuntu 20.04 源中mysql-server指向 MySQL 8.0.28+,其默认认证插件从mysql_native_password升级为caching_sha2_password。而 PHP 7.4(Ubuntu 20.04 默认)的mysqlipdo_mysql扩展,在未显式指定MYSQLI_OPT_CONNECT_TIMEOUT或未升级mysqlnd版本时,无法握手成功。实测:mysql -u root -p命令能连,但php -r "new mysqli('localhost','root','xxx');"报错Authentication plugin 'caching_sha2_password' cannot be loaded。这是新手最常卡住的点。

  3. PHP 7.4 为默认版本,但php-fpm服务名与模块加载路径变更
    Ubuntu 20.04 的php-fpm服务名为php7.4-fpm(而非旧版的php-fpm),且其主配置文件位于/etc/php/7.4/fpm/php-fpm.conf,Pool 配置在/etc/php/7.4/fpm/pool.d/www.conf。若你习惯性systemctl start php-fpm,会提示Unit php-fpm.service not found。更隐蔽的是:www.conflisten = /run/php/php7.4-fpm.sock是 Unix Socket 路径,而 Nginx 的fastcgi_pass必须与此完全匹配,少一个字符(如/run/php/php7.4-fpm.sockvs/var/run/php/php7.4-fpm.sock)都会导致 502。

2.3 为什么跳过“一键脚本”,坚持手动分步安装?

网上充斥着curl -sSL https://get.lemp.sh | bash类脚本,看似省事,实则隐患巨大:

  • 脚本可能从非官方源拉取二进制包(如 Nginx 官方 PPA 与 Ubuntu 源版本冲突);
  • MySQL root 密码被硬编码在脚本中,存在泄露风险;
  • PHP 模块(如php-mysql,php-curl)未按需安装,导致后续项目报Class 'mysqli' not found
  • 最致命的是:脚本无法教会你“哪里出错了”。当systemctl status nginx显示failed,你得知道去/var/log/nginx/error.logbind() to 0.0.0.0:80 failed (98: Address already in use),进而执行sudo ss -tulpn | grep ':80'找出占用端口的进程(常是 Apache 或 snap 安装的其他服务)。这种排错能力,只能来自亲手敲每一行命令。

3. 核心细节解析与实操要点:从系统准备到服务校验的 7 个关键动作

3.1 动作一:系统初始化——apt updateapt upgrade的真实作用链

很多教程把sudo apt update && sudo apt upgrade -y当作仪式,其实这是三重保险:

  • apt update:下载/var/lib/apt/lists/下的软件包索引文件(如archive.ubuntu.com_ubuntu_dists_focal_main_binary-amd64_Packages.gz),它包含所有包的版本号、依赖关系、SHA256 校验值。不执行此步,apt install nginx可能装到 2019 年的旧版(Ubuntu 源会缓存旧包)。
  • apt upgrade:升级已安装包到索引中最新版本,但不处理依赖变更导致的包删除或新增(这是dist-upgrade的事)。对 LEMP 而言,它确保linux-image-generic内核、systemd等基础组件为最新,避免因内核 bug 导致epoll事件丢失。
  • 实操注意:升级过程可能重启systemddbus,建议在非生产环境执行;若提示The following packages have been kept back,需运行sudo apt install <package-name>手动安装,常见如linux-generic
# 执行前先确认系统时间准确(NTP 同步影响证书验证) sudo timedatectl set-ntp true sudo apt update && sudo apt upgrade -y # 检查是否需 dist-upgrade(极少情况,如内核大版本跃迁) sudo apt list --upgradable | grep -E "(linux-image|linux-headers)"

3.2 动作二:Nginx 安装与端口抢占——为什么netstat已淘汰,ss是唯一选择

Ubuntu 20.04 默认不预装netstat(属net-tools包),而ss(socket statistics)是iproute2套件一部分,更轻量、更准确。安装 Nginx 前,必须确认 80/443 端口空闲:

  • sudo ss -tulpn | grep ':80'-tTCP,-uUDP,-llistening,-pshow process,-nnumeric port
  • 若输出类似tcp LISTEN 0 511 *:80 *:* users:(("nginx",pid=1234,fd=6)),说明 Nginx 已在运行;若为apache2snapd,需先停止:sudo systemctl stop apache2 snapd

Nginx 安装本身极简:

sudo apt install nginx -y sudo systemctl enable nginx # 开机自启 sudo systemctl start nginx # 启动

但关键在验证:

  • curl -I http://localhost应返回HTTP/1.1 200 OK
  • 若返回Failed to connect to localhost port 80: Connection refused,检查sudo systemctl status nginx是否 active,再查sudo journalctl -u nginx --since "1 hour ago"
  • 常见错误:nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)—— 这是 SELinux 问题,但 Ubuntu 20.04 默认无 SELinux,实为apparmor限制,需sudo aa-disable /usr/sbin/nginx(不推荐)或检查sudo aa-status

3.3 动作三:MySQL 8.0 安装与 root 密码重置——绕过caching_sha2_password的实战方案

Ubuntu 20.04 安装mysql-server时,会弹出交互式密码设置界面。若跳过或设为空,root 密码为空,但认证插件仍是caching_sha2_password,导致 PHP 无法连接。安全做法是:

  1. 安装时设强密码(如MyPass@2024!);
  2. 若已安装且无法登录,用安全模式重置:
# 停止 MySQL sudo systemctl stop mysql # 以跳过权限表方式启动 sudo mysqld_safe --skip-grant-tables --skip-networking & # 此时新终端中登录(无需密码) mysql -u root

在 MySQL CLI 中执行:

-- 切换到 mysql 系统库 USE mysql; -- 修改 root 用户认证插件为旧版(兼容 PHP 7.4) ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyNewPass@2024!'; -- 刷新权限 FLUSH PRIVILEGES; -- 退出 EXIT;

然后sudo killall mysqld_safe && sudo systemctl start mysql

注意:mysql_native_password虽兼容性好,但安全性低于caching_sha2_password。生产环境应升级 PHP 到 8.0+ 并配置default_authentication_plugin = mysql_native_password/etc/mysql/mysql.conf.d/mysqld.cnf中,但这超出本文范围。

3.4 动作四:PHP 7.4 与扩展安装——php-fpm的 socket 路径与用户组陷阱

Ubuntu 20.04 的 PHP 安装需明确三点:

  • php7.4-cli提供命令行支持;
  • php7.4-fpm提供 FastCGI 进程管理;
  • php7.4-mysql是 MySQL 驱动,不是php-mysql(后者是符号链接,指向当前默认 PHP 版本,但 20.04 默认就是 7.4,故可省略)。

完整命令:

sudo apt install php7.4-cli php7.4-fpm php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-xmlrpc php7.4-zip -y

关键验证点:

  • sudo systemctl status php7.4-fpm必须 active;
  • ls -l /run/php/应看到php7.4-fpm.sock(权限为srw-rw---- 1 www-data www-data);
  • ps aux | grep php-fpm应显示 master 进程以www-data用户运行,worker 进程同理。

陷阱:若www.confuser = www-datagroup = www-data,而 Nginx 主进程是root、worker 进程是www-data,则 socket 文件权限必须为660(即rw-rw----),否则 Nginx worker 无法读写 socket。这就是为什么sudo chmod 660 /run/php/php7.4-fpm.sock常被误用——正确做法是确保www.conflisten.ownerlisten.group与 Nginx 一致。

3.5 动作五:Nginx 与 PHP-FPM 的握手配置——fastcgi_pass的三种写法与性能权衡

Nginx 需将.php请求转发给php-fpm,配置在/etc/nginx/sites-available/defaultserver块内。核心是location ~ \.php$块:

location ~ \.php$ { include snippets/fastcgi-php.conf; # Ubuntu 默认提供的标准 FastCGI 参数 fastcgi_pass unix:/run/php/php7.4-fpm.sock; # 方式一:Unix Socket(推荐) # fastcgi_pass 127.0.0.1:9000; # 方式二:TCP 端口(需改 www.conf 的 listen = 127.0.0.1:9000) # fastcgi_pass php7.4-fpm; # 方式三:上游服务器(需在 http 块定义 upstream) }
  • Unix Socket(推荐):零网络开销,文件系统级通信,延迟 < 0.1ms,适合单机部署;
  • TCP 端口:需额外防火墙规则(ufw allow 9000),且127.0.0.1可能受systemd-resolved影响,稳定性略低;
  • Upstream:适合多 PHP 版本共存(如同时跑 PHP 7.4 和 8.1),但增加配置复杂度。

实操心得:snippets/fastcgi-php.conf已包含fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,若手动写fastcgi_param重复,会导致No input file specified错误。务必用include引入,而非复制粘贴。

3.6 动作六:创建测试页与权限校验——/var/www/html的所有权哲学

Ubuntu 20.04 的 Nginx 默认网站根目录是/var/www/html,其所有权应为root:www-data,权限755

  • root拥有目录,防止普通用户篡改;
  • www-data组可读,Nginx worker 进程以此用户运行,能读取文件;
  • 若 PHP 需写入文件(如上传图片),则/var/www/html/uploads目录需chown -R www-data:www-data uploadschmod 755

创建测试页:

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php sudo chown root:www-data /var/www/html/info.php sudo chmod 644 /var/www/html/info.php

访问http://localhost/info.php,重点检查:

  • Server API显示FPM/FastCGI(非Apache 2.0 Handler);
  • Loaded Configuration File/etc/php/7.4/fpm/php.ini
  • mysqlnd行显示enabled,且Client API versionmysqlnd 7.4.33

若显示No input file specified,90% 是SCRIPT_FILENAME路径错误,检查fastcgi_param SCRIPT_FILENAME是否指向$document_root$fastcgi_script_name,且$document_root确为/var/www/html

3.7 动作七:防火墙与 SELinux 替代方案——UFW 的最小化开放策略

Ubuntu 20.04 默认启用ufw(Uncomplicated Firewall),而非iptables前端。LEMP 仅需开放 80(HTTP)和 443(HTTPS):

sudo ufw allow OpenSSH # 先保 SSH 通道 sudo ufw allow 'Nginx Full' # 同时开 80 和 443 sudo ufw enable sudo ufw status verbose # 确认状态为 active,且规则正确

Nginx Full是预设应用配置,定义在/etc/ufw/applications.d/nginx,内容为:

[nginx] title=Nginx Web Server description=Small, but very powerful and efficient web server ports=80,443/tcp

注意:不要执行sudo ufw allow 3306(MySQL 端口)!MySQL 应仅监听127.0.0.1(默认配置),对外暴露是重大安全风险。若需远程管理,用 SSH 隧道:ssh -L 3307:127.0.0.1:3306 user@server,然后本地用mysql -h 127.0.0.1 -P 3307连接。

4. 实操过程与核心环节实现:从零到可运行 PHP 环境的完整命令流

4.1 全流程命令清单(可直接复制执行,含注释)

以下命令按顺序执行,每步均有验证点,适用于全新 Ubuntu 20.04 系统:

# 步骤 1:系统同步与升级(耗时约 3-5 分钟) sudo timedatectl set-ntp true sudo apt update && sudo apt upgrade -y # 步骤 2:安装并验证 Nginx(耗时 < 1 分钟) sudo apt install nginx -y sudo systemctl enable nginx sudo systemctl start nginx # 验证:curl -I http://localhost | head -1 应输出 HTTP/1.1 200 OK # 步骤 3:安装 MySQL 8.0 并安全配置(耗时 < 2 分钟) sudo apt install mysql-server -y # 安装过程中会提示设置 root 密码,务必记住! # 若跳过,用 3.3 节方法重置 # 步骤 4:安装 PHP 7.4 及必需扩展(耗时约 2 分钟) sudo apt install php7.4-cli php7.4-fpm php7.4-mysql php7.4-curl php7.4-gd php7.4-mbstring php7.4-xml php7.4-xmlrpc php7.4-zip -y sudo systemctl enable php7.4-fpm sudo systemctl start php7.4-fpm # 验证:ls -l /run/php/ 应看到 php7.4-fpm.sock # 步骤 5:配置 Nginx 支持 PHP(编辑 default 配置) sudo nano /etc/nginx/sites-available/default # 在 server 块内找到 location / { ... },在其后添加: # location ~ \.php$ { # include snippets/fastcgi-php.conf; # fastcgi_pass unix:/run/php/php7.4-fpm.sock; # } # 保存退出(Ctrl+O, Enter, Ctrl+X) # 步骤 6:测试配置语法并重载 Nginx(< 10 秒) sudo nginx -t # 必须输出 "syntax is ok" 和 "test is successful" sudo systemctl reload nginx # 步骤 7:创建 PHP 测试页并验证(< 30 秒) echo "<?php echo 'LEMP is working! Current time: ' . date('Y-m-d H:i:s'); ?>" | sudo tee /var/www/html/test.php sudo chown root:www-data /var/www/html/test.php sudo chmod 644 /var/www/html/test.php # 访问 http://localhost/test.php,应显示时间字符串 # 步骤 8:开放防火墙(< 10 秒) sudo ufw allow OpenSSH sudo ufw allow 'Nginx Full' sudo ufw enable sudo ufw status verbose

4.2 关键参数计算与选择依据:为什么是php7.4-fpm而非php8.1

Ubuntu 20.04 的 APT 源中,PHP 7.4 是长期支持(LTS)版本,官方支持至 2022 年 11 月,但 Ubuntu 为其提供安全更新至 2024 年底。而 PHP 8.1 虽性能更好,但在 20.04 源中需添加第三方 PPA(如ondrej/php),这带来风险:

  • PPA 包可能与系统libssllibxml2版本冲突;
  • ondrej/phpphp8.1-fpm服务名是php8.1-fpm,需同步修改 Nginx 配置,增加维护成本;
  • 大量遗留 PHP 项目(如 WordPress 插件、ThinkPHP 3.x)在 PHP 8.1 下存在Deprecated警告或致命错误。

因此,PHP 7.4 是 Ubuntu 20.04 上 LEMP 的黄金平衡点:安全更新有保障、生态兼容性最佳、性能足够满足中小项目。若你确定要用 PHP 8.1,命令为:

sudo add-apt-repository ppa:ondrej/php -y sudo apt update sudo apt install php8.1-fpm php8.1-mysql -y # 然后修改 Nginx 的 fastcgi_pass 为 unix:/run/php/php8.1-fpm.sock # 并 systemctl restart php8.1-fpm nginx

4.3 实操现场记录:一次真实部署中的三次“惊魂”时刻

我在一台阿里云 ECS(2C4G,Ubuntu 20.04.6)上执行上述流程,记录下三个典型故障及解决:

惊魂时刻一:nginx: [emerg] unknown directive "fastcgi_pass"

  • 现象:sudo nginx -t报错,配置语法错误;
  • 排查:发现fastcgi_pass写在了location / { ... }块外,即server块顶层;
  • 原因:fastcgi_passlocation指令,不能脱离上下文;
  • 解决:剪切整段location ~ \.php$ { ... }location / { ... }块内部,确保缩进正确。

惊魂时刻二:502 Bad Gatewayerror.log显示connect() to unix:/run/php/php7.4-fpm.sock failed (2: No such file or directory)

  • 现象:Nginx 日志报 socket 文件不存在;
  • 排查:ls /run/php/确实无php7.4-fpm.sock
  • 原因:php7.4-fpm服务未启动,sudo systemctl status php7.4-fpm显示inactive (dead)
  • 解决:sudo systemctl start php7.4-fpm,再sudo systemctl enable php7.4-fpm

惊魂时刻三:test.php显示源码而非执行结果

  • 现象:浏览器打开http://localhost/test.php,显示<?php echo ... ?>文本;
  • 排查:curl -H "Host: localhost" http://localhost/test.php结果相同;
  • 原因:Nginx 未将.php请求交给php-fpmlocation ~ \.php$块被注释或位置错误;
  • 解决:确认default配置中location ~ \.php$未被#注释,且位于server块内;执行sudo nginx -T | grep -A 5 "location ~ \.php"查看实际加载的配置。

5. 常见问题与排查技巧实录:一份可打印的 LEMP 故障速查表

5.1 502 Bad Gateway:LEMP 最高频错误的 5 层归因树

层级检查项命令/操作预期结果修复方案
L1:PHP-FPM 服务状态php7.4-fpm是否运行sudo systemctl status php7.4-fpmactive (running)sudo systemctl start php7.4-fpm
L2:Socket 文件存在性/run/php/php7.4-fpm.sock是否存在ls -l /run/php/srw-rw---- 1 www-data www-datasudo systemctl restart php7.4-fpm
L3:Socket 权限匹配Nginx worker 用户能否访问 socketps aux | grep nginx+ls -l /run/php/php7.4-fpm.sockNginx worker 用户(www-data)与 socket 组(www-data)一致sudo chown root:www-data /run/php/php7.4-fpm.sock
L4:Nginx 配置语法fastcgi_pass路径是否正确sudo nginx -T | grep "fastcgi_pass"fastcgi_pass unix:/run/php/php7.4-fpm.sock;编辑/etc/nginx/sites-available/default修正路径
L5:SELinux/AppArmorUbuntu 20.04 的 AppArmor 是否阻止sudo aa-status | grep nginxnginx (enforce)sudo aa-complain /usr/sbin/nginx(临时)或检查/etc/apparmor.d/usr.sbin.nginx

实操心得:遇到 502,按此表从 L1 到 L5 逐层验证,95% 的问题在 L1-L3。不要一上来就重装,浪费时间。

5.2 MySQL 连接失败:mysqli::real_connect(): (HY000/1045): Access denied的 3 种场景

场景触发条件验证命令解决方案
场景一:认证插件不匹配PHP 7.4 连 MySQL 8.0 默认用户mysql -u root -p -e "SELECT user,host,plugin FROM mysql.user WHERE user='root';"执行ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
场景二:用户权限不足新建用户未授权 localhostmysql -u root -p -e "SHOW GRANTS FOR 'myuser'@'localhost';"GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'localhost' WITH GRANT OPTION;
场景三:绑定地址错误MySQL 监听127.0.0.1但 PHP 用localhostsudo netstat -tulpn | grep :3306mysql -h 127.0.0.1 -u root -p(强制 TCP)或修改/etc/mysql/mysql.conf.d/mysqld.cnfbind-address = 127.0.0.1

5.3 Nginx 启动失败:Address already in use的精准定位法

sudo systemctl start nginx失败,journalctl -u nginx显示bind() to 0.0.0.0:80 failed (98: Address already in use),请按此流程定位:

  1. sudo ss -tulpn \| grep ':80':查看哪个进程占 80 端口;
  2. 若为apache2sudo systemctl stop apache2 && sudo systemctl disable apache2
  3. 若为snapd(如snapdcore包含微型 web 服务):sudo snap remove core(不推荐)或sudo snap disable core
  4. 若为docker容器:docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" \| grep ":80->"
  5. 终极方案:sudo fuser -k 80/tcp强制杀死所有 80 端口进程(慎用)。

注意:fuser命令需sudo apt install psmisc安装,这是 Ubuntu 20.04 的隐藏依赖。

5.4 PHP 扩展缺失:Class 'mysqli' not found的模块加载链

此错误表明php-fpm未加载mysqli扩展。Ubuntu 20.04 中,PHP 扩展配置分散在:

  • /etc/php/7.4/fpm/php.ini:主配置,extension=mysqli应取消注释;
  • /etc/php/7.4/mods-available/:扩展定义文件(如mysqli.ini);
  • /etc/php/7.4/fpm/conf.d/:启用链接(如20-mysqli.inimods-available/mysqli.ini的软链接)。

验证步骤:

# 查看 php-fpm 加载的扩展 sudo php-fpm7.4 -m \| grep mysqli # 若无输出,检查 conf.d 目录 ls -l /etc/php/7.4/fpm/conf.d/ \| grep mysqli # 若无链接,手动创建 sudo ln -s /etc/php/7.4/mods-available/mysqli.ini /etc/php/7.4/fpm/conf.d/20-mysqli.ini sudo systemctl restart php7.4-fpm

5.5 Ubuntu 20.04 特有陷阱:systemd-resolved导致的 DNS 解析失败

现象:Nginxproxy_passhttp://backend-api:8000时,日志显示resolver timed out
原因:systemd-resolved127.0.0.53DNS 缓存对短生命周期查询(如 FastCGI)响应慢。
解决方案(二选一):

  • 方案 A(推荐):在 Nginx 配置中指定 DNS 服务器
    http { resolver 8.8.8.8 1.1.1.1 valid=30s; # 其他配置... }
  • 方案 B:禁用systemd-resolved的 stub(需重启)
    sudo systemctl disable systemd-resolved sudo systemctl stop systemd-resolved echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

6. 后续演进与安全加固:从可运行到可交付的 4 个必做动作

6.1 创建非 root 部署用户:告别sudo chmod 777

生产环境严禁用rootwww-data直接编辑代码。创建部署用户:

sudo adduser deploy sudo usermod -aG www-data deploy # 设置 `/var/www/html` 为 deploy:www-data,权限 755 sudo chown -R deploy:www-data /var/www/html sudo find /var/www/html -type d -exec chmod 755 {} \; sudo find /var/www/html -type f -exec chmod 644 {} \;

此后,deploy用户可通过scp上传文件,www-data组权限保证 Nginx 可读。

6.2 配置 MySQL 远

http://www.jsqmd.com/news/1068709/

相关文章:

  • Wireshark网络协议分析实战:从抓包入门到故障排查精要
  • LLM生产环境稳定性指南:从OOM到长尾延迟的防御体系
  • App Platform自定义域名、SSL与CDN配置原理与实战
  • Cursor编辑器深度解析:项目级语义感知与AI原生编码工作流
  • FileZilla Client 3.70.4 官方版下载(Windows/macOS/Linux,夸克网盘)
  • JMeter安装配置全攻略:从零搭建性能测试环境
  • Ubuntu 14.04 上用 Terraform 部署 Node.js 的实战方案
  • Gemini 3.1 Pro五大核心技巧:解锁高阶推理与结构化输出
  • 三步构建AI API使用数据自动化分析流水线:从账单到洞察
  • MCU低功耗设计:SIM_SD寄存器精准控制外设时钟与唤醒机制
  • 2024年AIGC商业落地指南:从多模态大模型到实战应用
  • MC68010循环模式:硬件级指令优化与嵌入式性能提升
  • XSS攻击脚本全解析:从原理到实战绕过技巧与防御指南
  • Vue 3国际化实战:vue-i18n核心原理与工程化落地
  • Weave Scope容器监控:实时拓扑可视化与交互式诊断实战指南
  • Postman自动化CSRF Token认证:环境变量与脚本实战指南
  • Java FutureTask 深度解析:状态机、超时控制与线程中断原理
  • 零样本学习在软件工程情感分析中的创新应用
  • 跨越LLM产品评估可操作性差距:从数据到行动的系统方法
  • DMXAPI+Qwen3.7-Max智能体实战:从PLC文档化看AI编程落地
  • Prisma + PostgreSQL 生产级落地指南:从连接配置到向量搜索
  • RTA广告技术解析:从实时API原理到电商金融实战部署
  • GLM-5.1代码能力跃迁:从SWE-Bench Pro登顶看大模型工程化落地
  • Qwen3.5+llama.cpp实测:216G显存跑262K上下文与120 tokens/s推理
  • SRC漏洞挖掘入门指南:从零到一掌握白帽子实战技能
  • FEC以太网控制器:缓冲区描述符机制与嵌入式网络驱动开发实战
  • Claude Opus 4.8 effort机制深度解析:成本与性能的临界点优化
  • 混元3.0编程能力跃迁:MoE架构与262K上下文如何重塑开发者工作流
  • Qwen3.5 Block在llama.cpp中的映射与优化原理
  • MC56F8455x SIM模块深度解析:复位、时钟与功耗管理实战指南