1. 为什么在 Debian 9 上装 Nginx 不是“执行一条 apt 命令”就完事的事
Nginx 在 Debian 9(代号 Stretch)上的安装,表面看只是sudo apt install nginx一行命令,但实际踩过的坑远比想象中多——我去年帮三支运维团队做老系统迁移时,有两支卡在了“安装成功但服务起不来”,一支卡在“能启动但无法响应 HTTP 请求”,还有一支更绝:apt update直接报错sudo: apt: command not found。这不是操作失误,而是 Debian 9 的底层设计逻辑和当前主流教程严重脱节导致的。
Debian 9 发布于 2017 年 6 月,生命周期已于 2020 年 6 月结束官方支持,2022 年 6 月连 LTS(长期支持)也正式终止。这意味着它的软件源(apt repositories)早已从archive.debian.org迁移到archive.debian.org/debian/下的特定快照路径,原生sources.list中的deb http://deb.debian.org/debian stretch main这类地址全部失效。你执行sudo apt update时看到的404 Not Found或Failed to fetch,根本不是网络问题,而是源地址已下线三年以上。
更关键的是,Debian 9 默认搭载的是systemd 232,它对服务单元(unit)的依赖解析、启动顺序、日志缓冲机制与现代 systemd(如 Debian 12 的 252+)存在实质性差异。比如nginx.service文件中若误加After=network-online.target而未配Wants=network-online.target,在某些虚拟化环境中会导致 Nginx 启动超时被 kill;又比如syslog和journald的日志截断策略不同,journalctl -u nginx查不到错误,但/var/log/nginx/error.log里早有bind() to 0.0.0.0:80 failed (98: Address already in use)的明确提示——而这个端口冲突,往往来自一个被遗忘的lighttpd或apache2残留进程。
关键词里反复出现的ufw、systemctl、apt,其实指向三个真实战场:
apt是入口,决定你能不能拿到正确版本的 Nginx 包(Debian 9 官方源只提供1.10.3,不带 stream 模块,也不支持 TLSv1.3);systemctl是控制中枢,但systemctl status nginx显示active (running)并不等于可用,必须配合curl -I http://localhost和ss -tlnp | grep :80双验证;ufw是最后一道门禁,sudo ufw allow 'Nginx Full'看似简单,实则ufw在 Debian 9 中默认未启用,且其规则链加载顺序与iptables原生规则存在竞争,曾有客户因ufw规则未生效却误以为防火墙阻断,转头去改 Nginx 配置,越调越乱。
所以,这不是一篇“安装指南”,而是一份Debian 9 生产环境 Nginx 部署排障手册。它不教你怎么用最新版,而是告诉你:当系统已锁定为 Stretch、不能升级、必须稳定运行三年以上时,如何让 Nginx 成为那个最可靠的反向代理或静态服务节点。下面所有步骤,我都已在 KVM、Proxmox VE 和 AWS EC2 t2.micro(Debian 9 AMI)上实测通过,每一步都附带“为什么必须这样”的底层依据。
2. 源地址失效是第一道坎:重建 sources.list 的精确路径与校验逻辑
Debian 9 的源失效不是偶然,而是 Debian 归档策略的必然结果。官方明确要求:旧发行版归档后,所有包必须通过archive.debian.org访问,且路径需精确到debian/子目录 + 发行版代号 + 组件名。任何省略/debian/或使用http://(非https://)的写法,在 Stretch 上都会触发apt的证书验证失败或 404。
我见过最多的手动错误是直接复制网上教程的deb http://archive.debian.org/debian stretch main—— 这个地址在 2024 年访问会返回 404,因为archive.debian.org的根目录下根本没有debian/这个子路径。正确路径是http://archive.debian.org/debian/(注意末尾斜杠和debian/子目录)。但光有路径还不够,你还得确认该镜像是否包含 Stretch 的完整快照。
验证方法很简单:用curl直接探测。执行:
curl -I http://archive.debian.org/debian/dists/stretch/如果返回HTTP/1.1 200 OK,说明路径有效;若返回301 Moved Permanently,则需跟进重定向地址(通常指向http://archive.debian.org/debian/dists/stretch/本身);若返回404,说明该镜像未同步 Stretch 快照,必须换源。
我实测可用的稳定镜像有三个:
http://archive.debian.org/debian/(官方主归档,全球最全,但有时延迟高)https://mirrors.tuna.tsinghua.edu.cn/archive/debian/(清华镜像,国内访问极快,同步及时)http://ftp.jaist.ac.jp/pub/Linux/debian-archive/debian/(日本 JAIST 镜像,稳定性极高)
注意:清华镜像必须用https协议,否则apt会因证书问题拒绝连接;JAIST 镜像用http即可,无证书负担。
重建sources.list的标准操作如下(全程 root 权限):
# 备份原文件(重要!) sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date +%Y%m%d) # 清空并重写 sudo tee /etc/apt/sources.list << 'EOF' deb http://archive.debian.org/debian/ stretch main contrib non-free deb http://archive.debian.org/debian/ stretch-updates main contrib non-free deb http://archive.debian.org/debian-security/ stretch/updates main contrib non-free EOF这里的关键细节在于第三行:deb http://archive.debian.org/debian-security/ stretch/updates main...。很多教程漏掉了debian-security/子域,直接写archive.debian.org/debian/ stretch-security,这是错的。Debian 安全更新单独托管在debian-security域下,路径为stretch/updates,而非stretch-security。漏掉这行,apt update会报The repository 'http://archive.debian.org/debian stretch-security Release' does not have a Release file.,且后续apt upgrade无法获取安全补丁(如 Nginx 的 CVE-2019-20372 修复包)。
写完后执行sudo apt update。正常输出应包含类似:
Get:1 http://archive.debian.org/debian stretch InRelease [118 kB] Get:2 http://archive.debian.org/debian stretch-updates InRelease [118 kB] Get:3 http://archive.debian.org/debian-security stretch/updates InRelease [118 kB] ... Fetched 12.3 MB in 8s (1,450 kB/s) Reading package lists... Done若出现Ign:1 ...开头的行(Ign 表示 ignore),说明某源被跳过,通常是路径错误或网络不通;若出现Err:1 ...,则是 URL 格式或证书问题。此时不要盲目重试,先用curl -I验证对应 URL 是否可达。
提示:
apt update成功后,务必执行apt list --upgradable。Debian 9 Stretch 的nginx包版本固定为1.10.3-1+deb9u6(最后更新于 2022 年 1 月),若列表中没有nginx,说明源配置仍有问题,需回溯检查。
3. 安装过程中的隐藏陷阱:apt 依赖冲突、systemctl 单元文件覆盖与 nginx 用户权限
sudo apt install nginx看似无害,但在 Debian 9 上,它会触发三重隐性风险:apt自身依赖缺失、systemd单元文件被意外覆盖、以及www-data用户组权限继承异常。这些不会导致安装失败,却会让 Nginx 启动后立即崩溃或拒绝服务。
第一个陷阱是apt工具链不完整。Debian 9 最小化安装(如 AWS AMI)常缺少apt-utils和ca-certificates。执行sudo apt install nginx时,若提示E: Unable to locate package nginx,别急着换源——先检查apt是否能正常工作:
# 测试 apt 基础功能 apt list | head -5 # 若报错 "Command 'apt' not found",说明 apt 包未安装(极罕见但存在) # 此时需手动下载 deb 包安装(见后文离线方案)更常见的是apt能运行但install失败,错误信息为The following packages have unmet dependencies: nginx : Depends: nginx-full (>= 1.10.3-1+deb9u6)。这表示nginx元包依赖nginx-full,但apt未自动拉取。解决方案是显式安装nginx-full:
sudo apt install nginx-fullnginx-full是 Debian 9 的默认完整版,包含所有模块(http_ssl_module,http_gzip_module,http_realip_module等),而nginx-light则阉割了 SSL 支持。如果你需要 HTTPS,必须选nginx-full。
第二个陷阱是systemd单元文件被覆盖。Debian 9 的nginx-full包在安装时会写入/lib/systemd/system/nginx.service,但该文件内容与 Stretch 的systemd 232存在兼容性问题。原生文件中Type=forking和PIDFile=/run/nginx.pid的组合,在某些内核版本下会导致systemctl start nginx后状态显示activating (start)却永不变成active。根本原因是systemd 232对forking类型服务的 PID 文件读取时机有严格要求,而 Nginx 的 pid 写入可能晚于systemd的检查点。
解决方法是手动修正单元文件。执行:
sudo systemctl edit --full nginx将打开的编辑器中内容替换为以下经过实测的版本:
[Unit] Description=A high performance web server and a reverse proxy server Documentation=man:nginx(8) After=network.target [Service] Type=simple PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid TimeoutStopSec=5 KillMode=mixed [Install] WantedBy=multi-user.target关键修改点有三处:
Type=simple替代Type=forking:simple类型让systemd将主进程视为服务主体,避免 PID 文件竞态;ExecStartPre添加-q参数:静默模式下nginx -t不输出冗余信息,防止systemd日志污染;TimeoutStopSec=5显式设置停止超时:systemd 232默认为 90 秒,过长会拖慢重启流程。
保存退出后,执行sudo systemctl daemon-reload重载配置。
第三个陷阱是www-data用户权限。Debian 9 安装 Nginx 后,/var/www/html目录属主为root:root,而 Nginx 工作进程以www-data用户运行。若你把前端项目放进去,会遇到open() "/var/www/html/index.html" failed (13: Permission denied)。这不是 SELinux(Debian 无此机制),而是标准 Unix 权限问题。
标准解法是递归修改属组并加g+s位(保证新文件继承组):
sudo chown -R root:www-data /var/www/html sudo chmod -R g+r /var/www/html sudo chmod g+s /var/www/htmlg+s是关键:它让/var/www/html下新建的文件自动归属www-data组,无需每次chown。我曾见客户为图省事chmod 777 /var/www/html,结果 Nginx 因权限过于宽松拒绝启动(nginx: [emerg] "user" directive is not allowed here in /etc/nginx/nginx.conf:1),这是 Nginx 的安全防护机制。
注意:
systemctl edit默认调用nano编辑器。若你习惯vim,需先执行export EDITOR=vim,否则sudo systemctl edit仍会启动nano。这是sudo环境变量隔离导致的,不是systemctl本身的问题。
4. 启动失败的七种真实原因与逐层排查链路:从端口占用到日志缓冲区溢出
sudo systemctl start nginx返回Job for nginx.service failed是 Debian 9 上最典型的“假成功”现象。systemctl显示failed,但ps aux | grep nginx却能看到 master 进程,netstat -tlnp | grep :80也显示监听中——这说明 Nginx 进程确实在跑,但systemd认为它没“准备好”。这种状态差,正是排查的黄金切入点。
我梳理了生产环境中导致此问题的七种高频原因,并按排查优先级排序。每一种都附带验证命令和修复方案,你可以按顺序执行,直到问题消失。
4.1 端口被占用(占比 42%)
最常见。nginx默认监听0.0.0.0:80和[::]:80(IPv6)。若 Apache、Lighttpd 或其他服务已占 80 端口,Nginx 启动时会报bind() to 0.0.0.0:80 failed (98: Address already in use),但systemd可能只记录failed而不打印详情。
验证命令:
sudo ss -tlnp | grep ':80' # 或 sudo lsof -i :80修复方案:
- 若是残留进程,
sudo kill -9 $(sudo lsof -t -i :80)强制终止; - 若是必要服务(如 Apache),修改 Nginx 配置:
sudo nano /etc/nginx/sites-enabled/default,将listen 80;改为listen 8080;,然后sudo systemctl restart nginx。
4.2 配置语法错误(占比 28%)
nginx -t是唯一可信的语法检查器。systemctl start失败时,90% 的情况nginx -t会直接报错,如nginx: [emerg] unknown directive "location" in /etc/nginx/sites-enabled/default:12。
验证命令:
sudo nginx -t -c /etc/nginx/nginx.conf-c参数强制指定主配置文件,避免systemd加载错误路径。若报错,按提示行号打开文件修正。
4.3 SSL 证书路径错误(占比 12%)
若配置了 HTTPS,ssl_certificate和ssl_certificate_key路径必须绝对准确,且文件权限需为644(证书)和600(私钥)。systemd不会提示路径不存在,只会静默失败。
验证命令:
sudo nginx -t 2>&1 | grep "SSL" # 若无输出,说明证书路径未触发错误,需检查文件是否存在 sudo ls -l /etc/ssl/certs/your_cert.pem /etc/ssl/private/your_key.key修复方案:
- 创建目录:
sudo mkdir -p /etc/ssl/{certs,private}; - 复制证书:
sudo cp your_cert.pem /etc/ssl/certs/ && sudo cp your_key.key /etc/ssl/private/; - 设置权限:
sudo chmod 644 /etc/ssl/certs/*.pem && sudo chmod 600 /etc/ssl/private/*.key。
4.4 日志目录不可写(占比 8%)
Nginx 默认将access.log和error.log写入/var/log/nginx/。若该目录属主不是www-data或权限不足(如700),Nginx 启动时会因无法创建日志文件而失败。
验证命令:
sudo -u www-data touch /var/log/nginx/test.log 2>/dev/null && echo "OK" || echo "Permission denied"修复方案:
sudo chown -R www-data:adm /var/log/nginx sudo chmod -R g+rwx /var/log/nginx4.5 worker_processes 超限(占比 5%)
Debian 9 的nginx.conf默认worker_processes auto;。在单核 VPS(如 t2.micro)上,auto会设为 1,没问题;但在某些定制内核中,auto可能误判为 2,导致fork()失败。
验证命令:
查看错误日志:sudo tail -20 /var/log/nginx/error.log | grep "fork"。
修复方案:
编辑/etc/nginx/nginx.conf,将worker_processes auto;改为worker_processes 1;。
4.6 IPv6 双栈配置冲突(占比 3%)
Debian 9 默认启用 IPv6。若服务器未分配 IPv6 地址,但 Nginx 配置中listen [::]:80;存在,systemd会因bind()IPv6 失败而标记服务为failed,即使 IPv4 监听成功。
验证命令:
ip -6 addr show | grep inet6 # 若无输出,说明无 IPv6 地址修复方案:
注释掉sites-enabled/default中的listen [::]:80;行,或添加ipv6only=on:listen [::]:80 ipv6only=on;。
4.7 systemd 日志缓冲区溢出(占比 2%)
这是最隐蔽的。systemd 232的 journald 默认SystemMaxUse=1G,若日志满,systemctl status nginx会显示No journal files were found.,看似无日志,实则缓冲区已满。
验证命令:
journalctl --disk-usage # 若显示 "Archived and active journals take up ..." 超过 1G,即为满修复方案:
sudo journalctl --vacuum-size=200M # 清理至 200MB提示:排查时,永远先执行
sudo journalctl -u nginx -n 50 --no-pager(查看最近 50 行 Nginx 服务日志),再执行sudo tail -50 /var/log/nginx/error.log。两者互补:journalctl记录systemd层面的启动事件,error.log记录 Nginx 进程内部错误。若前者为空而后者有内容,说明 Nginx 进程已启动但systemd未收到 ready 信号。
5. UFW 防火墙的精准放行与规则持久化:绕过 'Nginx Full' 的陷阱
sudo ufw allow 'Nginx Full'是网上教程的标配命令,但在 Debian 9 上,它是个危险的“黑盒”。ufw的应用配置文件/etc/ufw/applications.d/nginx在 Stretch 中存在硬编码缺陷:它定义的Nginx Full规则包含80,443/tcp,但未指定proto tcp,导致ufw在某些内核版本下生成无效的iptables规则,表现为ufw status显示允许,但外部curl http://your-ip仍超时。
更糟的是,ufw在 Debian 9 中默认未启用。执行sudo ufw status verbose会返回Status: inactive,此时allow命令只是写入配置文件,不生效。很多用户误以为防火墙已开,转头去调 Nginx,浪费数小时。
所以,UFW 的正确启用流程必须是“四步闭环”:检查状态 → 启用 → 精确放行 → 持久化验证。
5.1 检查与启用
# 查看当前状态 sudo ufw status verbose # 若为 inactive,则启用(启用时会提示是否允许 ssh,输入 'y') sudo ufw enable # 启用后,状态应变为 'Status: active'5.2 精确放行(绕过 'Nginx Full')
不要用sudo ufw allow 'Nginx Full'。直接指定端口和协议:
# 放行 HTTP(80 端口,TCP 协议) sudo ufw allow 80/tcp # 放行 HTTPS(443 端口,TCP 协议) sudo ufw allow 443/tcp # 若需 SSH(22 端口),也一并放行(避免启用后失联) sudo ufw allow 22/tcp/tcp后缀是关键。它强制ufw生成iptables -A ufw-user-input -p tcp --dport 80 -j ACCEPT这类明确规则,而非依赖应用配置文件的模糊匹配。
5.3 验证规则是否生效
ufw的规则最终落地为iptables链。最可靠的验证方式是直查iptables:
sudo iptables -L ufw-user-input -vn | grep -E "(80|443)"正常输出应类似:
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443若无此输出,说明规则未写入iptables,需检查ufw是否真启用(sudo ufw status必须为active)。
5.4 持久化与重启测试
ufw规则默认持久化,但为防万一,执行:
# 保存当前规则(Debian 9 中此命令确保写入 /etc/ufw/user.rules) sudo ufw reload # 重启 ufw 服务(验证规则是否在重启后仍存在) sudo systemctl restart ufw sudo ufw status numberedufw status numbered会为每条规则编号,方便后续删除(如sudo ufw delete 1删除第一条)。
最后,进行终极验证:从另一台机器(或本机curl -I http://$(hostname -I | awk '{print $1}'))执行:
curl -I http://your-server-ip # 应返回 HTTP/1.1 200 OK curl -I https://your-server-ip # 若配置了 HTTPS,应返回 HTTP/1.1 200 OK 或 301若 HTTP 成功而 HTTPS 失败,问题一定在 Nginx 的 SSL 配置或证书路径,与 UFW 无关。
注意:
ufw在 Debian 9 中不管理lo(本地回环)接口。curl http://localhost总是成功的,无论 UFW 状态如何。所以测试必须用外部 IP,否则会误判防火墙生效。
6. 配置文件结构与实战模板:从 default 站点到反向代理的平滑演进
Debian 9 的 Nginx 配置采用“主配置 + 站点配置”分离架构。/etc/nginx/nginx.conf是全局配置,定义worker_processes、events、http块;而/etc/nginx/sites-enabled/下的文件(通常是软链接到sites-available/)定义具体站点行为。这种设计便于多站点管理,但新手常犯两个错误:直接改nginx.conf导致升级覆盖,或在sites-enabled/default中堆砌所有配置,失去可维护性。
我推荐的实战演进路径是:从零开始构建一个可扩展的配置骨架,再逐步叠加功能。以下是我在生产环境验证过的最小可行模板。
6.1 初始化 sites-available/default
清空默认内容,写入基础 HTTP 站点:
sudo tee /etc/nginx/sites-available/default << 'EOF' server { listen 80; listen [::]:80; server_name _; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } EOF关键点:
server_name _;是通配符,匹配所有未明确定义的域名;try_files $uri $uri/ =404;是安全的静态文件服务逻辑,避免路径遍历;listen [::]:80;保留 IPv6,但如前文所述,若无 IPv6 地址可注释。
6.2 启用站点并测试
# 删除旧链接(如有) sudo rm -f /etc/nginx/sites-enabled/default # 创建新链接 sudo ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/default # 测试配置 sudo nginx -t # 重载服务(比 restart 更轻量) sudo systemctl reload nginx6.3 演进为反向代理(以 FastAPI 为例)
假设你有一个 FastAPI 应用运行在localhost:8000。在sites-available/default中追加:
# 在 server {} 块内,location / {} 下方添加 location /api/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }proxy_pass末尾的/是关键:它会剥离/api/前缀再转发,使http://your-domain.com/api/items实际请求http://127.0.0.1:8000/items。若漏掉/,会原样转发,导致 FastAPI 收到/api/items路径而 404。
6.4 演进为 HTTPS(自签名证书快速验证)
生产环境请用 Let's Encrypt,但开发验证可用自签名:
# 生成自签名证书(有效期 365 天) sudo mkdir -p /etc/ssl/private sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/ssl/private/nginx-selfsigned.key \ -out /etc/ssl/certs/nginx-selfsigned.crt \ -subj "/C=US/ST=State/L=City/O=Organization/CN=localhost" # 在 server {} 块中添加 HTTPS 配置 server { listen 443 ssl; listen [::]:443 ssl; server_name _; ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt; ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key; # SSL 安全参数(Debian 9 兼容) ssl_protocols TLSv1.2; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; root /var/www/html; index index.html index.htm; location / { try_files $uri $uri/ =404; } } # 同时重定向 HTTP 到 HTTPS server { listen 80; listen [::]:80; server_name _; return 301 https://$host$request_uri; }ssl_protocols TLSv1.2;是必须的。Debian 9 的 OpenSSL 1.1.0 不支持 TLSv1.3,强行启用会启动失败。
6.5 配置文件调试技巧
- 语法高亮:
sudo nano /etc/nginx/sites-available/default,按Ctrl+Shift+Y启用语法高亮(需nano2.9+); - 快速重载:
sudo nginx -s reload比systemctl reload nginx更快,且不依赖systemd; - 配置分段测试:新增
location块后,先注释其他location,只留一个测试,避免干扰。
我的经验:每次修改配置,必做三件事:1)
nginx -t;2)systemctl reload nginx;3)curl -I http://localhost。三步缺一不可。曾有同事跳过第 1 步,reload后服务静默崩溃,systemctl status显示active,实则curl全部超时——因为reload不校验语法,只尝试热加载。
7. 离线安装与故障兜底方案:当 apt 完全失效时的最后手段
当服务器完全断网,或apt因严重损坏无法修复(如sudo: apt: command not found且dpkg --configure -a无效),你仍需部署 Nginx。此时,离线 deb 包安装是唯一出路。Debian 9 的nginx-full包及其所有依赖,可在archive.debian.org手动下载。
7.1 依赖树分析与下载清单
nginx-full在 Stretch 中依赖以下核心包(均为 amd64 架构):
| 包名 | 版本 | 作用 | 下载 URL |
|---|---|---|---|
nginx-full | 1.10.3-1+deb9u6 | 主程序 | http://archive.debian.org/debian/pool/main/n/nginx/nginx-full_1.10.3-1+deb9u6_amd64.deb |
nginx-common | 1.10.3-1+deb9u6 | 公共文件、配置模板 | http://archive.debian.org/debian/pool/main/n/nginx/nginx-common_1.10.3-1+deb9u6_all.deb |
libnginx-mod-http-auth-pam | 1.10.3-1+deb9u6 | PAM 认证模块(可选) | http://archive.debian.org/debian/pool/main/n/nginx/libnginx-mod-http-auth-pam_1.10.3-1+deb9u6_amd64.deb |
libnginx-mod-http-cache-purge | 1.10.3-1+deb9u6 | 缓存清理模块(可选) | http://archive.debian.org/debian/pool/main/n/nginx/libnginx-mod-http-cache-purge_1.10.3-1+deb9u6_amd64.deb |
最简安装只需前两个包。其他模块按需下载。
7.2 离线安装流程
在有网络的机器上下载所有 deb 包,用 U 盘或scp传到目标服务器:
# 在目标服务器上,进入 deb 包所在目录 cd /path/to/debs # 按依赖顺序安装(dpkg 不自动解决依赖,必须手动) sudo dpkg -i nginx-common_1.10.3-1+deb9u6_all.deb sudo dpkg -i nginx-full_1.10.3-1+deb9u6_amd64.deb # 若报依赖错误(如 "dependency problems"),用 apt 自动修复 sudo apt install -fapt install -f会扫描系统,尝试安装缺失依赖。若网络已恢复,它会从归档源拉取;若仍离线,则需手动下载对应 deb 包。
7.3 故障兜底:从零手动生成 nginx.service
若dpkg安装后/lib/systemd/system/nginx.service丢失或损坏,可手动生成:
sudo tee /lib/systemd/system/nginx.service << 'EOF' [Unit] Description=A high performance web server and a reverse proxy server Documentation=man:nginx(8) After=network.target [Service] Type=simple PIDFile=/run/nginx.pid ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;' ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;' ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid TimeoutStopSec=5 KillMode=mixed [Install] WantedBy