不像Linux
,Nginx
在Windows
上执行,可以多次启动,每次启动都会生成基于配置文件中工作进程数+主进程(1)
个数量的进程,不会有任何报错提示,在nginx.exe
的配置文件conf
配置目录下nginx.conf
工作进程数配置如下,标识工作进程数为1,实际启动进程为两个,一个工作进程一个主进程
# user root;
worker_processes 1;
启动命令后配置无效,对于刚刚接触Nginx
来说的朋友,当真是热锅上的蚂蚁,团团转
,本章主要是讲解作为新手在·Windows
上使用Nginx
,遇到此问题改如何排查和解决,此处为[官方链接]http://nginx.org/en/download.html,如果访问不到网站可联系笔者,获取Nginx
高版本压缩包
问题场景
起初配置好以后是可以正常使用,修改了配置文件,重新启动发现,自己配置的相关内容,并没有生效,反复启动,依然无效
,所谓的无效
就是访问对应服务以及端口,自己最后一次配置的相关处理都好像没有配置一般,服务正常,配置无效
,执行重启指令后,服务配置无效
,停止服务再启动也无效
常见可能
服务多次启动
服务启动多次,会造成出第一次启动的服务能够正常生效外,其余都只是一个无用的子进程,推测为多次启动时,由于读取的是同一配置文件和监听的是统一服务端口号,造成后续启动的nginx.exe
进程无法执行,只能等待,类似挂起状态,没有任何操作和响应,而Nginx for Windows
每次启动都会将配置文件内容读取出来缓存在内存中,并不会应为配置变更,Nginx
就重新加载配置内容,新的进程如果只是加载新的配置,并未正常执行,新的配置自然无效,问题复现
原始配置
原始配置此处以下载的Nginx for Windows
软件包,解压之后的状态为例,所以本地配置文件仅仅只有一个80
端口被作为服务监听端口
......省略.......
http {
......省略.......
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
......省略.......
}
}
第一次启动nginx
修改端口为7080
并保存
......省略.......
http {
......省略.......
server {
listen 7080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
......省略.......
}
}
启动cmd
切换到nginx.exe
所在目录下,执行指令start nginx
,有一个黑框一闪而过
>start nginx
>tasklist /FI "IMAGENAME eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 23456 Console 1 9,816 K
nginx.exe 58692 Console 1 10,348 K
请求浏览器请求http://localhost:7080
,结果如下:
配置变更
此时增加nginx.conf
中改server
下的location
匹配规则
......省略.......
http {
......省略.......
server {
listen 7080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
#增加规则
location /test/ {
alias html/;
index index.html index.htm;
}
......省略.......
}
}
第二次启动nginx
>start nginx
>tasklist /FI "IMAGENAME eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 23456 Console 1 9,784 K
nginx.exe 58692 Console 1 10,308 K
nginx.exe 54800 Console 1 9,828 K
nginx.exe 38372 Console 1 10,352 K
这是时候,发现进程数量为四,与启动次数成正比,如果是查看nginx.exe
同级目录下的logs
文件夹下,可以发现一个nginx.pid
文件,文件内容为54800
,表示第二次启动时,写入的主进程id
号,其实第一次启动时,也同样会写入该次启动时的主进程id
,每次启动都会覆盖上一次启动的进程id
,停止时会移除nginx.pid
理论上,此时请求http://localhost:7080/test
能够同样访问到第一次启动时的页面,可是实际返回结果如下:
查看logs
下的错误日志error.log
内容为:
[error] 34444#57956: *1 "解压路径\nginx-1.21.1/html/test/index.html" is not found (3: The system cannot find the path specified)
确实没有这个路径,可是修改的配置是将test
指向别名路径html
文件夹,默认文件也是index.htm
或者index.html
,当前第二次配置文件内容无效
停止服务
执行-s stop
指令,查看进程可以知道,第二次启动的进程已经结束,第一次的进程还存在,此时访问服务可以发现第一次的端口服务是正常的
>nginx -s stop
>tasklist /FI "IMAGENAME eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 23456 Console 1 9,776 K
nginx.exe 58692 Console 1 10,304 K
执行停止指令或重启,发现已经无法启动,同时提示如下错误:
>nginx -s stop
nginx: [error] CreateFile() "./logs/nginx.pid" failed (2: The system cannot find the file specified)
>nginx -s reload
nginx: [error] CreateFile() "./logs/nginx.pid" failed (2: The system cannot find the file specified)
解决办法
查看该目录发现,改文件已经不存在,所有才会提示上述错误,意思就是不能够通过普通方式进行服务退出,这时候可以考虑直接执行taskkill
指令进行处理,执行成功后,再查看对应进程nginx.exe
,发现本地已经不存在对应镜像名称的进程了
>taskkill /F /IM nginx.exe /T
成功: 已终止 PID 50792 (属于 PID 58692 子进程)的进程。
成功: 已终止 PID 58692 (属于 PID 23456 子进程)的进程。
成功: 已终止 PID 23456 (属于 PID 57764 子进程)的进程。
>tasklist /FI "IMAGENAME eq nginx.exe"
信息: 没有运行的任务匹配指定标准。
再次执行start nginx
启动,就能够访问对应修改之后的配置内容
最近一次配置异常
条件:下次服务重启前,不查看错误日志,无法发现问题
服务已经运行,页面能够正常访问到地址http://localhost:7080/
,nginx.conf
配置如下:
......省略.......
http {
......省略.......
server {
listen 7080;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
......省略.......
}
}
最近一次修改时,造成配置疏忽:
......省略.......
http {
......省略.......
server {
listen 7080;
server_name localhost;
location / {
root html;
# 假定配置错误少些分号;结尾
index index.html index.htm
}
......省略.......
}
}
再次手误启动,无任何提示,运行时访问http://localhost:7080/
,也是正常响应
>start nginx
查看nginx.exe
中进程数也是正常的
>tasklist /FI "IMAGENAME eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 61380 Console 1 1,280 K
nginx.exe 59796 Console 1 2,164 K
直到,哪天nginx.exe
结束了程序再次重启,结果就是完了,服务不能用了,查看日志才发现,实际配置文件已经报错,当时在服务配置错误时,未查看系统中是否已经存在nginx
服务前,就再次启动nginx
服务,实际由于异常配置,实际服务并未启动,而是正常情况时的服务并未退出,造成的服务正常的假象
解决办法
善用nginx
常规指令和良好的服务检测习惯
启动服务前,先核查本地是否已经启动服务
>tasklist /FI "IMAGENAME eq nginx.exe"
输出信息: 没有运行的任务匹配指定标准。
,表示不存在对应镜像名称的进程存在服务时,过存在则会输出对应的进程列表清单,
已经存在进程时,对配置进行修改后,可以考虑先使用-t [confpath]
对目标配置文件进行内容检测,不添加参数,默认为nginx.conf
,以下为配置正常时的输出结果,配置异常时,会显示对应的异常配置位置大概位置,便于用户排查
>nginx -t
nginx: the configuration file 解压路径\nginx-1.21.1/conf/nginx.conf syntax is ok
nginx: configuration file 解压路径\nginx-1.21.1/conf/nginx.conf test is successful
确认配置无误后,使用-s reload
进行服务重启,重启后的进程id和之前老的进程id
是不一样的,可以规避对应的服务存存在假象,同时可以多看看异常日志,一般如果配置异常,日志中,有对应的异常日志输出
重启前
>tasklist /fi "imagename eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 38452 Console 1 17,472 K
nginx.exe 47260 Console 1 17,824 K
重启后
>nginx -s reload
D:\Program Files\nginx-1.21.1>tasklist /fi "imagename eq nginx.exe"
映像名称 PID 会话名 会话# 内存使用
========================= ======== ================ =========== ============
nginx.exe 38452 Console 1 17,392 K
nginx.exe 22264 Console 1 17,816 K
注意
实际进程不止俩,结束进程时,关联进程列表为,主进程,工作进程以及一个其他进程,上述文章中说的俩仅仅是限定范围到当前服务范围内,不过多延伸
如果想要获取上述例子中的nginx
压缩包,可以评论留言或者私信笔者