在macOS和linux中使用nginx我早已经轻车熟路。突然切到windows的环境中,我反而不会用了。于是我就记一下笔记吧。
本篇写的比较冗长,精简版本见:
《windows使用nginx》
https://blog.csdn.net/lxyoucan/article/details/126900620
环境
事先说明一下我的测试是在windows 2008R2上完成的,操作系统不同可能会略有不同。
下载windows版本nginx
下载地址:
https://nginx.org/en/download.html
我下载的版本是:
下载解压放到一个你喜欢的路径中,我放到以下路径:
C:\manuli\nginx-1.20.2
环境变量(非必须)
这一步其实并不是必须的,因为我在linux中习惯了,直接打开终端输入nginx命令执行操作,这样方便一些。
计算机=》右键“属性”=》高级系统设置=》环境变量
在Path的环境变量的值,末尾增加
;C:\manuli\nginx-1.20.2
点击[确定]保存。
这时候重新开启一个命令行或者powershell
示例
启动服务
不要直接双击nginx.exe,要在命令行开户服务。
#切换到解压的目录
cd C:\manuli\nginx-1.20.2
start nginx
查看运行情况
tasklist /fi "imagename eq nginx.exe"
如果查不到进程,说明没有成功启动。
到nginx-1.20.2\logs\error.log
查看报错日志。
报错0.0.0.0:80 failed
因为nginx 默认使得80端口。
报错如下:
2022/09/16 22:23:12 [emerg] 3536#2524: bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions)
可能的原因:
- 没有使用80端口的权限,可以尝试用管理员权限启动试试。
- 有可能是80端口已经被占用了。
解决办法:
- 把nginx换成其他端口不要用80端口。
- 把占用80端口的程序,关掉。
查看占用80端口的进程
netstat -aon|findstr "80"
执行结果如下:
PS C:\manuli\nginx-1.20.2> netstat -aon|findstr "80"
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:49154 0.0.0.0:0 LISTENING 780
TCP 192.168.3.136:49218 114.118.11.52:80 CLOSE_WAIT 2428
TCP 192.168.3.136:49288 180.163.242.46:443 ESTABLISHED 3904
TCP 192.168.3.136:59742 111.13.66.65:80 ESTABLISHED 844
TCP 192.168.3.136:59753 180.163.252.201:80 ESTABLISHED 844
TCP 192.168.3.136:59780 180.163.251.24:443 CLOSE_WAIT 3904
TCP [::]:80 [::]:0 LISTENING 4
TCP [::]:49154 [::]:0 LISTENING 780
查pid=4的进程
tasklist | findstr "4"
我的查询结果是:
PS C:\manuli\nginx-1.20.2> tasklist | findstr "4"
System Idle Process 0 Services 0 24 K
System 4 Services 0 364 K
smss.exe 224 Services 0 1,016 K
System
是系统进程。
最终我在这篇文章中找到解决办法:
https://stackoverflow.com/questions/1430141/port-80-is-being-used-by-system-pid-4-what-is-that
只要执行以下命令就可以结束占用80端口的http服务。
NET stop HTTP
执行结果如下:
PS C:\manuli\nginx-1.20.2> NET stop HTTP
下面的服务依赖于 HTTP 服务。
停止 HTTP 服务也会停止这些服务。
Windows Remote Management (WS-Management)
World Wide Web Publishing Service
Print Spooler
Function Discovery Provider Host
您想继续此操作吗? (Y/N) [N]: Y
Windows Remote Management (WS-Management) 服务正在停止.
Windows Remote Management (WS-Management) 服务已成功停止。
World Wide Web Publishing Service 服务正在停止.
World Wide Web Publishing Service 服务已成功停止。
Print Spooler 服务正在停止.
Print Spooler 服务已成功停止。
Function Discovery Provider Host 服务正在停止.
Function Discovery Provider Host 服务已成功停止。
HTTP 服务已成功停止。
并且把SQL Server Reporting Services
停止
以上两步操作完成,发现可以正常在80端口启动nginx了。
使用NET stop HTTP
确实可以解决80端口被System
占用的问题。但是每次重新启动电脑。都要先执行一次这个命令显的很麻烦。
根据经验我猜测可能是Windows自带的iis占用了80端口。
禁用iis服务
其实我本想把iis开机自启禁用掉,按网上的说明把IIS Admin Services
禁用掉就行了,可是我没有找到这个服务啊。难道windows 2008R2中不叫这个服务名?
后来发现服务名叫World Wide Web Publishing Service
防火墙允许80端口
假如搞完发现其他电脑无妨访问,则有可能是因为防火墙没允许80端口。设置方法如下:
-
点击开始->控制面板->Windows防火墙
-
单击 Windows 防火墙左侧面板中的“高级设置”
-
点击高级设置左侧面板中的“入站规则”
-
单击右侧“操作”面板中的“新建规则…”
-
选择“端口”并单击“下一步>”
-
选择“TCP”,然后选择“特定本地端口:”(应该已经选择)
-
在框中输入 80(只是数字),然后单击“下一步>”
-
选择“允许连接”并单击“下一步>”
-
选中所有配置文件,然后单击“下一步>”
-
输入名称并单击“完成”。
参考
- 《nginx for Windows》
https://nginx.org/en/docs/windows.html