Nginx的管理逻辑和Apache这类常驻服务不太一样,它通过一个master进程和若干worker进程协同工作。启动、停止、重载配置等操作,本质上都是向master进程发送信号,或者由nginx命令封装这些信号。刚入门时先理解这一层,后面所有命令就不会死记硬背。

一、启动Nginx:默认启动与指定配置文件
Nginx最基础的启动方式就是在命令行直接输入 nginx。前提是Nginx已经安装到系统路径中,比如通过包管理器安装后,/usr/sbin/nginx 软链到 /usr/bin/nginx,直接执行即可。启动后,Nginx会读取默认的配置文件,Linux下通常是 /usr/local/nginx/conf/nginx.conf 或 /etc/nginx/nginx.conf,具体取决于编译参数和安装方式。如果没有权限绑定80端口,启动会失败,提示 permission denied,此时可以用 sudo 提升权限,或者把监听端口改成1024以上。
有时候需要临时测试另一套配置,不希望动默认文件,可以用 -c 参数指定配置文件。比如:
# 默认启动 nginx # 指定配置文件启动 nginx -c /home/user/nginx-test/conf/nginx.conf
注意,-c 后面跟的是完整路径,不是相对路径。启动后如果看不到命令行输出,不代表失败,Nginx默认不会打印成功信息。可以用 ps -ef | grep nginx 查看进程,或者用 curl -I http://127.0.0.1 测试。Windows下命令类似,但可执行文件是 nginx.exe,路径可能类似 C:\nginx\nginx.exe,启动时直接执行该文件即可,停止时也要在相同目录或带路径执行。
还有一种情况是重复启动。如果master进程已经在运行,再次执行 nginx 可能会启动失败,因为配置文件里的 pid 文件和监听端口被占用。正确做法是先停掉旧进程,或者用 nginx -s reload 重载配置。
二、停止Nginx:快速停止与优雅退出
Nginx提供了两种停止方式,分别是快速停止 stop 和优雅退出 quit。nginx -s stop 会立即关闭所有连接,工作进程直接退出,适合紧急处理,比如服务异常需要快速重启。但它的代价是正在传输的请求会被打断,对于下载文件或者长连接场景不太友好。nginx -s quit 则要温和得多,master进程会通知worker进程处理完当前已有的请求后再退出,同时不再接收新的连接。生产环境如果需要短暂停机维护,建议优先使用 quit。
从底层看,-s 参数只是向master进程发送信号。stop 对应 TERM 信号,quit 对应 QUIT 信号。如果你知道master进程的PID,也可以直接用 kill 命令实现相同效果。master PID一般记录在 /usr/local/nginx/logs/nginx.pid 或 /var/run/nginx.pid 文件里。命令如下:
# 快速停止 nginx -s stop # 优雅退出 nginx -s quit # 用kill命令停止 kill -TERM $(cat /usr/local/nginx/logs/nginx.pid) kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)
需要特别注意,不要直接 kill -9 master进程。因为 -9 信号无法被捕获,Nginx来不及清理pid文件和释放端口,可能导致下次启动失败,或者留下孤儿worker进程。如果确实出现僵尸进程,要手动 kill 掉残留的worker进程。
另外,重载配置 nginx -s reload 也是常用操作,它不会真正停止服务,而是让master重新读取配置文件,启动新的worker进程处理新请求,旧的worker进程在处理完手头请求后退出。reload 之前建议先跑 nginx -t 检查配置语法,否则配置有误可能导致服务无法加载新配置,甚至影响现有服务。
三、配置检查与常见疑问解答
入门阶段最容易忽略的就是配置检查。修改完 nginx.conf 后直接 reload,一旦有语法错误,Nginx会拒绝加载,但已经运行的master进程通常不会退出,只会记录错误日志。如果这时你误以为配置已经生效,排查起来会很费时间。正确的顺序是每次修改配置后先执行 nginx -t,它会检查所有include进来的配置文件,并打印 syntax is ok 和 test is successful。只有看到这两行,再执行 nginx -s reload 才稳妥。
# 检查默认配置文件 nginx -t # 检查指定配置文件 nginx -t -c /home/user/nginx-test/conf/nginx.conf
常见疑问之一是“启动后浏览器访问不了”。第一步应该确认Nginx是否真的在监听端口,用 netstat -tlnp | grep :80 或 ss -tlnp | grep :80 查看80端口是否被Nginx占用。如果显示端口被其他程序占用,需要修改配置中的 listen 端口,并 reload。另一个高频问题是“明明执行了 stop,但网页还能打开”。这通常是因为浏览器缓存,或者worker进程没有被正确终止。可以用 ps -ef | grep nginx 确认是否还有nginx进程,如果还有,检查pid文件是否被删除,导致 -s 命令找不到master而失效,此时可以手动用 kill 向master发送信号。
对于Windows用户,命令基本相同,但以前台方式运行时关闭命令行窗口不会停止Nginx,需要显式执行 nginx.exe -s stop 或 quit。另外Windows下可能遇到“nginx: [error] CreateFile() ... failed”这类错误,多数是路径包含空格或没有管理员权限导致,建议把Nginx放在类似 C:\nginx 这种没有空格的目录,并用管理员身份运行命令行。