Windows 环境下 NGINX & 批处理服务自启动配置指南

本指南介绍如何使用开源工具 WinSW (Windows Service Wrapper) 将 Windows 版的 NGINX 以及自定义 .bat 脚本注册为系统原生服务,实现开机无需登录、后台静默自启动。


🛠️ 核心准备工具


📝 场景一:将 NGINX 注册为系统服务

1. 文件放置

将下载好的 WinSW-x64.exe 复制到你的 NGINX 根目录(例如 C:\nginx),并重命名为:

nginx-service.exe

2. 创建配置文件

在同级目录下新建一个文本文件,命名为 nginx-service.xml必须与 .exe 文件名完全一致),写入以下配置:

<service>
  <id>nginx</id>
  <name>NGINX Service</name>
  <description>NGINX HTTP Server Reverse Proxy</description>

  <logpath>C:\nginx\logs</logpath>
  <log mode="roll"></log>

  <executable>C:\nginx\nginx.exe</executable>
  <startarguments></startarguments>

  <stopexecutable>C:\nginx\nginx.exe</stopexecutable>
  <stoparguments>-s stop</stoparguments>

  <onfailure action="restart" delay="10sec"/>
</service>

⚠️ 注意:若 NGINX 安装在其他盘符或路径(如 D:\nginx),请将上面所有 C:\nginx 替换为实际的绝对路径。


📝 场景二:将 .bat 批处理脚本注册为系统服务

⚠️ 前提条件:如果脚本内部含有 PAUSEset /p 等人工交互命令,必须先修改脚本移除交互(例如改为 timeout /t 3 /nobreak 自动延迟),否则后台服务会永久卡死。

1. 文件放置

WinSW-x64.exe 复制到脚本所在目录(例如 D:\xiaomiqiu),并重命名为:

xiaomiqiu-service.exe

2. 创建配置文件

在同级目录下新建 xiaomiqiu-service.xml,写入以下配置:

<service>
  <id>xiaomiqiu_bat</id>
  <name>小米球穿透服务</name>
  <description>后台自动调用 D 盘的小米球批处理脚本</description>

  <executable>cmd.exe</executable>

  <arguments>/c "D:\xiaomiqiu\小米球一键启动工具.bat"</arguments>

  <workingdirectory>D:\xiaomiqiu</workingdirectory>

  <logpath>D:\xiaomiqiu\logs</logpath>
  <log mode="roll"></log>
  <onfailure action="restart" delay="10sec"/>
</service>

💻 ⚖️ 服务管理命令(通用)

配置完成后,必须以 管理员身份 打开命令行(CMD 或 PowerShell),进入对应的程序目录执行以下命令:

功能 命令指令
进入目录 cd /d C:\nginxcd /d D:\xiaomiqiu
安装服务 .\nginx-service.exe install
启动服务 .\nginx-service.exe start
重启服务 .\nginx-service.exe restart
停止服务 .\nginx-service.exe stop
卸载服务 .\nginx-service.exe uninstall

💡 提示:安装成功后,也可以按下 Win + R 输入 services.msc 打开 Windows 运行服务列表,找到对应服务将"启动类型"修改为"自动"。


❌ 常见故障排查(FAQ)

1. 报错 flag provided but not defined: -p

  • 原因:在新版 WinSW 的 <arguments> 标签中误传了不支持的 -p 参数。
  • 解决:检查 XML 文件,删掉 -p 相关的参数定义,直接使用标准的绝对路径指定即可。

2. 服务启动了,但网页/穿透没有生效

  • 原因 1:端口被占用(如 80 端口被 IIS 或本地其他软件占用)。
  • 原因 2:未配置 <workingdirectory>,导致脚本找不到同级目录下的 .exe 核心程序。
  • 解决:检查 WinSW 生成的 logs 目录下的 .err.log 日志文件,查看具体报错。