如果你在服务器上敲下systemctl restart nginx迎面却撞见一行红字Failed to restart nginx.service: Unit nginx.service not found别急着怀疑人生。这个报错十有八九不是 nginx 本身坏了而是 systemd 根本找不到名为nginx.service的服务单元。你可能已经用service nginx restart验证过nginx 明明能正常重启那为什么systemctl不认账这正是我们这次要解决的问题。这个报错在刚装好的新机器、从脚本或源码编译安装过 nginx 的机器、以及从旧版本系统迁移上来的机器上特别常见。不管你是第一次接触 systemd 的新人运维还是被这个问题绊过的老手下面这套从报错原理到手动修复、再到防患于未然的完整思路都可以直接照抄。1. 先搞清楚报错背后的逻辑1.1 systemd 与 init.d 的区别为什么找不到服务Linux 下管理服务的方式经历过一次大换代。早期主流是 SysV init启动脚本放在/etc/init.d/目录下用service nginx start或/etc/init.d/nginx start来操作。后来 CentOS 6、Ubuntu 14.04 等一批系统普遍采用这种模式很多老运维的习惯就是从这里养成的。现在绝大多数发行版换成了 systemd管理方式完全不同。systemd 把服务定义成一个个“单元文件”Unit File扩展名是.service描述这个服务怎么启动、怎么停止、依赖什么东西。你执行systemctl restart nginx时systemd 会在几个固定的目录里搜索nginx.service这个文件/etc/systemd/system//run/systemd/system//usr/lib/systemd/system//lib/systemd/system/只要这些目录里不存在名为nginx.service的文件systemd 就会直接丢出一句Unit nginx.service not found。这里的关键点在于nginx 二进制文件装没装是一回事systemd 有没有对应的 unit 文件是另一回事。很多新手在这两个层面混淆明明nginx -v能输出版本号但systemctl就是不认原因就在于此。老系统的/etc/init.d/nginx脚本和 systemd 的nginx.service文件是两种不同的东西。service命令会去查找/etc/init.d/下的脚本而systemctl只认 unit 文件。如果你在一个同时有两套机制的系统中用了不同的命令看到的结果就可能不一样——这就是“service 能重启systemctl 却报 not found”的常见根源之一。1.2 服务名不匹配是最常见诱因很多场景下nginx 确实装了unit 文件也存在但报错照样出现。为什么因为服务名对不上。systemctl restart nginx中的nginx是一个服务名systemd 会严格地用这个名字去找.service文件。如果你通过第三方仓库、宝塔面板、OpenResty 或自己编译的方式安装生成的服务可能叫openresty.servicebt-nginx.servicenginx-master.servicenginx_custom.service甚至某些瘦身版的镜像里服务名直接叫nginx-light.service。这时候你敲systemctl restart nginx等于拿着一把错误的钥匙去开锁自然会提示 not found。另外注意systemd 对服务名是区分大小写的。Systemctl restart Nginx、systemctl restart NGINX都不会识别为nginx。这看起来像个低级错误但在我处理过的问题里因为大小写、尾部多空格、记错服务名而被卡住的人真的不少。遇到这种问题第一步不要盲目重装系统先查一下当前系统里到底有哪些 nginx 相关的服务单元systemctl list-unit-files | grep -i nginx或者查看当前加载的 Unitsystemctl list-units --all | grep -i nginx这两条命令的输出会直接告诉你systemd 认识的 nginx 服务到底叫什么名字。如果列出的是nginx.service但你 restart 仍然报 not found则是文件搜索路径或 daemon-reload 的问题如果列出的名字根本不是你输入的那个服务名那就好办了要么改用列出的名字要么后面手动补一个标准命名的 unit 文件。2. 五步定位“Unit not found”的根因2.1 确认 nginx 是否真的已经安装排查要分层进行先从最基础的一步开始确认 nginx 是不是真的装上了。直接执行which nginx nginx -v如果输出command not found说明 nginx 可能根本没安装或者安装路径不在 PATH 里。很多发行版的 nginx 装在/usr/sbin/nginx但当前用户的 PATH 不一定包含/usr/sbin特别是用普通用户切到 root 时有时会误判为未安装。再深入一点用包管理器确认安装记录# Debian / Ubuntu dpkg -l | grep nginx # CentOS / RHEL / Rocky rpm -qa | grep nginx如果包管理器里查不到任何 nginx 包但你明明记得安装过那极有可能是源码编译安装二进制放在了/usr/local/nginx/sbin/nginx。这种安装方式不会注册到 dpkg/rpm但确实存在。可以用下面命令直接找find / -name nginx -type f 2/dev/null找到二进制路径后执行/usr/local/nginx/sbin/nginx -V看编译参数确认版本和模块情况。注意确认了“nginx确实装了”只是迈出了第一步它和“systemd认识nginx”之间还有一段路要走。2.2 检查服务单元文件是否存在nginx 装好了接下来就要看 systemd 这边有没有对应的 unit 文件。常见的路径和优先级如下ls -l /etc/systemd/system/nginx.service ls -l /usr/lib/systemd/system/nginx.service ls -l /lib/systemd/system/nginx.service如果其中某一个路径下存在nginx.service但systemctl restart nginx仍然报 not found可以先用系统自带的 unit 检查工具看看文件有没有语法问题systemd-analyze verify /etc/systemd/system/nginx.service这条命令会扫描文件里的指令、路径、依赖关系如果 unit 文件写得不规范它会输出具体提示。还有一个非常容易被忽略的点新添加或修改 unit 文件后必须执行systemctl daemon-reload。systemd 不会实时扫描磁盘上的 unit 文件尤其是新增文件不重载的话它可能根本不知道你这个 unit 的存在。看到 not found 时先做一次重载往往就能解决systemctl daemon-reload systemctl restart nginx如果文件不存在那就要判断是“没装服务脚本”还是“被误删除”。前者很常见特别是源码编译安装的方式后者通常是手滑删错了文件。不管哪种情况手工写一份 unit 文件是最稳妥的解决方案我放在后面第 3 章详细讲。2.3 查看当前 init 系统在动手改之前确认一下你的系统到底跑的是不是 systemd。有些系统虽然预装了systemctl命令但 PID 1 并不是 systemd执行起来自然各种不顺畅。ps -p 1 -o comm输出systemd说明当前是 systemd init可以用systemctl管理服务。输出init或upstart说明还是 SysV 时代的老系统比如 CentOS 6、Ubuntu 14.04。这种情况下你执行systemctl restart nginx报 not found 太正常了因为根本没有 systemd 在管理服务你应该使用service nginx restart另外容器场景也要单独拎出来说。很多 Docker 基础镜像里 PID 1 是 nginx 或其他业务进程根本没有 systemd甚至systemctl命令都不存在。此时在容器里执行systemctl restart nginx会得到 not found 或类似提示。正确的做法是直接用 nginx 自己的信号控制机制nginx -s reload或者由宿主机 Docker 守护进程来管理容器生命周期而不是在容器内折腾 systemd。2.4 包管理器安装的 nginx 可能不自带 systemd 单元很多人习惯用apt install nginx或yum install nginx以为这样安装完应该万事俱备。实际上不同发行版、不同仓库的 nginx 包对 systemd 单元文件的处理并不一致。Debian/Ubuntu 官方仓库里的 nginx 包一般会带上nginx.service但如果你安装的是nginx-light、nginx-extras、nginx-full服务名通常还是nginx这点倒不让人为难。真正容易踩坑的是某些第三方仓库、OpenResty 官方 RPM、或者通过源码编译安装的 nginx这些安装方式基本不会往/usr/lib/systemd/system/里放服务文件。你可以用包管理器反查一下 nginx 到底有没有带 service 文件# Debian / Ubuntu dpkg -L nginx | grep service # CentOS / RHEL rpm -ql nginx | grep service如果有输出说明包里带了 unit 文件但 systemd 找不到多半是路径问题或 daemon-reload 问题。如果没有输出说明这个千真万确没带 systemd 服务文件那就别犹豫了手动补上。补充一点有些镜像或脚本安装后会把 nginx 的可执行文件改到非标准路径比如/opt/nginx/sbin/nginx。这样即使有 unit 文件里面的 ExecStart 路径若还指向/usr/sbin/nginx启动时也会报另一个错误ExecStart... No such file or directory。这个报错虽然和 not found 不是同一个但同为“systemd 与 nginx 之间缺乏正确桥梁”的典型症状排查思路可以一并参考。2.5 多实例、非默认位置导致服务识别不了一台机器上同时存在多个 nginx 的情况并不少见。你可能先通过系统包管理器装了一个 nginx后来又从官网下载源码编译了一个新版安装到了/usr/local/nginx/。两个二进制文件互相独立配置文件也不一样。当你执行systemctl restart nginx时systemd 按 unit 文件里的 ExecStart 路径去启动它只管路径对应的那个实例。如果这个单位文件不存在就会报 not found如果存在但路径指向的配置文件或二进制和你想操作的不一致启动结果可能莫名其妙。最好先确认你要管理的到底是哪个 nginx# 查看当前 PATH 下默认的 nginx which nginx # 查看所有可能的 nginx 二进制 whereis nginx # 查看 nginx 编译参数确认 prefix、pid 路径、配置文件路径 nginx -Vnginx -V输出中重点关注这几个参数--prefix...安装根目录--conf-path...配置文件路径--pid-path...PID 文件路径这些信息直接决定了后面 unit 文件该怎么写。如果对不上unit 文件启动的 nginx 实例可能根本不是你以为的那个。3. 手写一份靠谱的 nginx.service 单元文件3.1 单元文件结构Unit / Service / Install当系统里确实没有现成的nginx.service时最干净的办法就是自己写一份。不用担心“系统级文件不好动”放在/etc/systemd/system/下这个目录本来就是给管理员自定义 unit 文件用的优先级高于发行版自带的目录。下面是经过我多次生产环境验证的标准模板适用于绝大多数 nginx 版本[Unit] Descriptionnginx - high performance web server Documentationhttp://nginx.org/en/docs/ Afternetwork.target remote-fs.target nss-lookup.target Wantsnetwork-online.target [Service] Typeforking 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 -s reload ExecStop/usr/sbin/nginx -s quit TimeoutStopSec5 KillModemixed PrivateTmptrue LimitNOFILE65536 [Install] WantedBymulti-user.target逐块解释一下花两分钟看懂它比直接抄更有用。[Unit]部分描述服务的基本信息和依赖关系。After表示应该在网络、远程文件系统、DNS 解析等目标就绪后再启动 nginx避免开机时因为网络没起来导致 nginx 启动失败。[Service]是核心部分。Typeforking很关键。nginx 默认以 daemon 形式运行主进程 fork 出子进程后父进程退出。告诉 systemd “这个服务会 fork 成一个后台进程”它就会去 PIDFile 指定的位置读取主进程 PID进而跟踪服务状态。PIDFile/run/nginx.pid告诉 systemd 到哪里找主进程 PID。这个路径必须和 nginx 配置文件里的pid指令一致。绝大多数发行版默认是/run/nginx.pid有些是/var/run/nginx.pid而/var/run通常是指向/run的软链接所以两者一般等价。但如果你的 nginx 是编译安装PID 路径可能是/usr/local/nginx/logs/nginx.pid务必核对。ExecStartPre在正式启动前做配置语法检查。nginx -t是测试配置的命令-q安静模式-g daemon on; master_process on;显式指定以 daemon 方式运行。这样做的好处是配置写错了服务会直接被拦住不会出现“启动失败但报错信息乱七八糟”的情况。ExecStart是真正的启动命令。这里同样要带-g daemon on; master_process on;参数否则Typeforking可能不生效systemd 会认为服务没有成功启动反复拉起进程。ExecReload和ExecStop分别用nginx -s reload和nginx -s quit实现比直接 kill 进程安全得多。reload会平滑重载配置不影响现有连接quit会让 nginx 优雅退出。KillModemixed表示停止时先给主进程发 SIGTERM超时后再处理剩余子进程适合 nginx 这种父子进程结构的服务。PrivateTmptrue给服务设置独立的临时目录更安全。LimitNOFILE65536提高文件描述符上限应对高并发场景很有用。[Install]部分通过WantedBymulti-user.target指定服务在什么系统目标下被启用。multi-user.target 就是常见的多用户命令行模式一般服务器默认就是这个所以systemctl enable nginx后开机就能自动启动。3.2 自定义路径、全局配置、pid 路径的处理如果你要管理的 nginx 不是包管理器装的而是源码编译模板里的绝对路径必须改。先看编译参数/usr/local/nginx/sbin/nginx -V假设输出结果里--prefix/usr/local/nginx --conf-path/usr/local/nginx/conf/nginx.conf --pid-path/usr/local/nginx/logs/nginx.pid那 unit 文件就需要改成这样[Unit] Descriptionnginx - high performance web server Afternetwork.target remote-fs.target nss-lookup.target [Service] Typeforking PIDFile/usr/local/nginx/logs/nginx.pid ExecStartPre/usr/local/nginx/sbin/nginx -t -q -c /usr/local/nginx/conf/nginx.conf ExecStart/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload/usr/local/nginx/sbin/nginx -s reload ExecStop/usr/local/nginx/sbin/nginx -s quit TimeoutStopSec5 KillModemixed PrivateTmptrue [Install] WantedBymulti-user.target这里有一个高频坑编译安装的 nginx 配置文件不一定叫nginx.conf也不一定放在/usr/local/nginx/conf/下面。如果你自定义过--conf-path或用-c参数启动那ExecStartPre里的-c路径也必须指向同一个配置文件否则nginx -t检查的是一套配置实际启动用的又是另一套配置很容易出现“检查通过但启动失败”的诡异情况。关于 pid 路径再强调一次unit 文件里的 PIDFile 必须和 nginx 实际配置文件里的 pid 路径完全一致。如果 nginx 配置里写的是pid /run/nginx.pid;但 unit 文件里 PIDFile 指向/usr/local/nginx/logs/nginx.pidsystemd 就会找不到主进程 PIDstop 和 reload 时经常报错表现为“start 成功但 stop 超时”或“reload 没有反应”。解决办法是统一路径推荐都改成/run/nginx.pid这是 systemd 环境下的标准路径。3.3 启用和启动服务写完了 unit 文件接下来的操作顺序很重要每一条都不能省把文件保存到/etc/systemd/system/nginx.service设置权限:chmod 644 /etc/systemd/system/nginx.service重载 systemd 配置systemctl daemon-reload设置开机自启systemctl enable nginx启动服务systemctl start nginx查看状态systemctl status nginx --no-pager确认端口监听ss -lntp | grep :80如果你在步骤 5 遇到启动失败先看 journal 日志journalctl -u nginx -n 50 --no-pager比较典型的错误是bind() to 0.0.0.0:80 failed (98: Address already in use)这说明 80 端口被其他进程占用了。可以先查ss -lntp | grep :80占用端口的是 Apache、另一个 nginx 还是其他程序把它停掉或者让 nginx 换端口。如果部署了 SELinux还可能出现权限相关的 AVC 报错可以用restorecon -v /usr/sbin/nginx或者chcon -t httpd_exec_t /usr/sbin/nginx当然单元文件路径变了也要对应 restorecon。如果systemctl enable nginx提示Failed to create symlink: File exists通常是因为之前已经启用过或者存在残留的软链接。先执行systemctl disable nginx再重新 enable 一次即可。4. 实际排查案例与命令速查4.1 案例一Ubuntu 18.04 apt 安装 nginx 后却报 not found我之前处理过一个很有代表性的案例一台 Ubuntu 18.04 服务器用户通过apt install nginx安装成功但执行systemctl restart nginx时直接报Unit nginx.service not found。我们检查了 dpkg确认 nginx 包已经安装ii nginx 1.14.0-0ubuntu1 all ...再用dpkg -L nginx | grep service查看发现包内确实包含/lib/systemd/system/nginx.service。按理说不应该 not found但问题出在哪最后发现这台机器上曾经手动编译过 nginx安装到了/usr/local/nginx/并且用户为了“让新版生效”把/usr/sbin/nginx替换成了指向/usr/local/nginx/sbin/nginx的软链接。更意外的是用户之前为了调试把/lib/systemd/system/nginx.service手动删除了然后手动创建了一个/etc/systemd/system/nginx_service.service服务名带了下划线不叫nginx.service。换句话说系统是具备 unit 文件能力的只是被人为改成了其他名字。这种情况下systemctl restart nginx自然找不到nginx.service。最终解决并不复杂删掉/etc/systemd/system/nginx_service.service新建标准的/etc/systemd/system/nginx.service按照第 3 章的模板daemon-reload后一切正常。这个案例想说明两件事第一Unit not found 不一定是“没安装”或“没服务”可能是服务名被改过第二手动改动系统文件前一定要留一份备份或记录否则排查起来非常费时间。4.2 案例二CentOS 7 使用 service nginx restart 正常systemctl 却报 not found另一个高频场景出现在 CentOS 7 和部分 RHEL 系服务器上。用户习惯性地执行service nginx restart服务可以正常重启但一旦换成systemctl restart nginx就收到 not found。这类问题通常是因为 nginx 是通过网络上的某个 RPM 包安装的这个包只提供了传统的 SysV init 脚本/etc/rc.d/init.d/nginx没有提供 systemd unit 文件。CentOS 7 虽然默认使用 systemd但为了兼容老软件service命令会自动尝试执行/etc/init.d/下的脚本而 systemd 不会去管这些脚本除非有对应的 unit 文件。这种情况下你甚至不需要再去改 yum 源或换包直接创建一个/etc/systemd/system/nginx.service文件即可。注意如果/etc/init.d/nginx脚本存在并且你不想立即废弃它也可以简单写一个 unit 文件让它调用这个 init 脚本来完成启停但我不推荐这种写法。原因很简单unit 文件被设计为直接管理进程绕一层 init 脚本会让 systemd 对进程的控制能力打折扣比如无法准确判断主进程 PID、依赖关系不好定义、日志处理也不够统一。更好的做法是老老实实按照标准模板写让 systemd 直接管理 nginx 进程彻底摆脱对旧 init 脚本的依赖。4.3 案例三Docker 容器内没有 systemd容器内遇到这个报错的频率也不低。有些人把 nginx 跑在 Docker 容器里需要调整配置时习惯性地在容器里执行systemctl restart nginx然后就看到 not found。原因很直观Docker 容器默认的 PID 1 是容器里的主进程绝大多数镜像不会运行 systemd。如果你用的还是比较精简的镜像比如nginx:alpine容器里根本没有systemctl命令自然报错有些镜像带有 systemctl 客户端但 PID 1 不是 systemd它也会提示System has not been booted with systemd...。在容器里管理 nginx 服务应该用 nginx 自带的控制命令。不知道 PID 的情况下先找主进程ps aux | grep nginx然后向主进程发送信号。日常用的最多的是平滑重载nginx -s reload如果配置路径不是默认的加上-c参数nginx -s reload -c /etc/nginx/nginx.conf如果只是想验证配置nginx -t有一点要注意nginx -s reload在容器里也要求你有权限向 nginx 主进程发送信号。容器通常以 root 运行问题不大如果以非 root 用户启动需要保证该用户能访问 PID 文件或通过信号重置上下文否则一样会失败。至于容器本身的“重启”那是宿主机 Docker 层面的操作比如docker restart container_name不要在容器内部模拟 systemd。4.4 常用排查命令速查表把这篇文章涉及到的排查命令汇总成一张表方便你复制到自己的文档里命令作用systemctl list-unit-files | grep nginx查看系统里所有 nginx 相关的 unit 文件systemctl list-units --all | grep -i nginx查看已经加载或配置的 nginx 服务systemctl status nginx查看 nginx 服务状态、日志入口nginx -t测试 nginx 配置语法nginx -V查看 nginx 编译参数、路径信息which nginx/whereis nginx定位 nginx 二进制文件dpkg -l | grep nginxDebian/Ubuntu 下确认 nginx 安装包rpm -qa | grep nginxCentOS/RHEL 下确认 nginx 安装包systemd-analyze verify /etc/systemd/system/nginx.service检查 unit 文件语法问题journalctl -u nginx -n 50 --no-pager查看 systemd 记录的 nginx 日志ss -lntp | grep :80查看 80 端口监听情况ps aux | grep nginx查看 nginx 进程状态ps -p 1 -o comm查看 PID 1 是什么进程判断 init 类型这个清单基本覆盖了从确认安装到最终启动的完整链路。遇到类似问题按表格从上往下逐条执行一般 10 分钟内就能定位到根因。5. 从根源上避免 Unit not found 的运维习惯5.1 安装后立刻验证服务能否被 systemd 识别根治问题最好的方式是把“验证服务可被 systemd 管理”变成安装流程里的固定动作。无论用包管理器安装还是源码编译装完立刻执行下面三条which nginx systemctl list-unit-files | grep nginx nginx -t如果第二条没有任何输出说明 systemd 看不到 nginx 服务这时候就不能继续执行systemctl enable nginx了否则只会得到 not found。你应该马上转到第 3 章创建 unit 文件后再重跑这条命令。我习惯把这套检查写成一个简短的 shell 函数每次部署完调一下check_nginx_service() { echo nginx binary: $(which nginx) echo systemd unit: systemctl list-unit-files | grep nginx || echo no nginx.service found echo nginx config test: nginx -t }一条命令输出三行关键信息部署效率能提升不少。5.2 区分不同发行版的包管理差异Debian/Ubuntu 和 CentOS/RHEL 的包管理机制、文件布局都不一样千万不要一套经验用到死。Ubuntu/Debian 系安装命令apt-get install nginx配置文件/etc/nginx/nginx.conf站点配置/etc/nginx/sites-available/和/etc/nginx/sites-enabled/服务单元通常由包自带位于/lib/systemd/system/nginx.serviceCentOS/RHEL/Rocky 系安装命令yum install nginx或dnf install nginx配置文件/etc/nginx/nginx.conf站点配置/etc/nginx/conf.d/*.conf服务单元也可能自带但若用第三方源则可能要自己写源码编译安装安装命令./configure make make install配置文件默认在安装前缀下如/usr/local/nginx/conf/nginx.conf服务单元通常没有必须自己写明白这些差异之后遇到问题就很容易判断是哪一层出了问题。比如 Ubuntu 上 apt 安装后报 not found优先怀疑服务名或 systemd 重载CentOS 上源码编译后报 not found直接进入手写 unit 流程。5.3 使用官方源或编译时自动生成 Systemd 脚本如果条件允许优先使用发行版官方源安装 nginx这是最省心的一条路。官方源会把 unit 文件、配置文件目录、PID 路径都给你安排好基本不需要手动干预。但有些场景下必须自己编译比如需要定制模块、更新版本、或者离线部署。这时候建议在编译参数中把路径固定好减少后续配置工作量。常用参数./configure \ --prefix/usr/local/nginx \ --conf-path/etc/nginx/nginx.conf \ --pid-path/run/nginx.pid \ --http-log-path/var/log/nginx/access.log \ --error-log-path/var/log/nginx/error.log把pid-path明确指定到/run/nginx.pidunit 文件里就能统一使用一个路径。把conf-path固定到/etc/nginx/nginx.conf后续管理也更符合 rpm 系的习惯。编译完成后把手工编写的nginx.service文件纳入配置管理比如 Ansbile 的 role 或一个单独的 shell 脚本。这样在新服务器上部署时一键同步 unit 文件并daemon-reload就不会再出现 not found 这种低级错误了。5.4 注意配置文件和 pid 文件的一致性最后一个坑也是我在生产环境里真正被绊过好几次的坑pid 路径不一致。nginx 的 PID 文件路径由配置文件中的pid指令决定比如pid /run/nginx.pid;而 systemd unit 文件里的PIDFile...必须和这个路径保持一致。如果改了配置里的 pid 路径却没同步修改 unit 文件重启时 systemd 会提示找不到 PID 文件或者把错误的 PID 当作主进程导致停止、重载行为异常。检查方法很简单grep -r ^pid /etc/nginx/如果输出是pid /run/nginx.pid;那么 unit 文件里就要写PIDFile/run/nginx.pid如果是编译安装的 nginx默认 pid 路径可能在编译目录下比如/usr/local/nginx/logs/nginx.pidunit 文件就要对应写那个路径。有一个更稳妥的做法不让 nginx 自己写 pid 文件到默认目录而是显式配置到/run/下并确保该目录存在、可写。因为/run是系统运行时目录重启会自动清理非常符合 systemd 的管理习惯。修改完 pid 路径后必须完整重启一次 nginx否则旧进程还是按老路径写 pid 文件。这条我在实操中踩过重启一次就花了十几秒但那种“明明配好了却总觉得服务状态不对”的诡异感确实容易让人抓狂。这套排查思路吃透后以后再遇到Failed to restart nginx.service: Unit nginx.service not found基本就是手到擒来。我自己有个习惯遇到问题先不慌先敲一条systemctl list-unit-files | grep nginx十秒钟就能判断是 service 名字不对还是压根没有 unit 文件。写 unit 文件时先用nginx -t -c 配置文件路径手动验证一遍配置再启动服务可以绕过很多看似玄学的报错。还有个小技巧值得分享手动创建 unit 文件后如果启动失败不要反复systemctl restart先journalctl -u nginx -n 100 --no-pager看日志十次里有九次答案已经在里面了。等处理完这些问题你会发现所谓“Unit not found”只是 systemd 和 nginx 之间缺了一个“翻译官”。把这个翻译官——也就是 unit 文件——写对、写稳之后所有服务管理操作都会顺畅得多。
