ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Nginx命令行管理实战:启动、停止、重载与日志切割全攻略

Nginx命令行管理实战:启动、停止、重载与日志切割全攻略 我用Nginx少说也有七八年了从最早的1.x版本一路用到现在的1.26、1.27期间踩过不少坑也积累了一些命令行操作的实用经验。很多刚接触Nginx的朋友总觉得它难伺候启动、关闭、重载这些基础操作都要去翻文档。其实Nginx的命令体系非常清晰核心逻辑搞懂之后日常管理就是那么几个命令反复用而已。今天就把我这些年实际使用中沉淀下来的启动、关闭、重载、日志切割等操作经验一次性整理出来希望能帮你少走点弯路。1. Nginx命令管理的核心认知先搞懂它是个多进程程序在开始敲命令之前我觉得有必要先把Nginx的进程模型讲清楚。Nginx跟普通单进程程序最大的区别在于它启动后会有一个master主进程和若干个worker工作进程。master进程负责读取配置、管理worker进程的生命周期worker进程才是真正处理客户端请求的执行者。这个模型决定了Nginx的命令操作方式必须通过master进程来协调而不是直接对worker动手。1.1 master进程与worker进程的分工逻辑用过Apache的朋友都知道Apache的进程管理相对简单粗暴直接控制主进程就行了。但Nginx不一样你在命令行里执行nginx命令它启动的是master进程master进程会根据你配置文件中worker_processes指令的值fork出对应数量的worker子进程。我见过很多新手在关闭Nginx时直接kill -9把所有worker进程都杀了然后发现master进程还在过一会儿又拉起一批新的worker场面相当尴尬。正确的做法永远是向master进程发送信号让它去协调worker进程的退出。打个比方Nginx的master进程就像是一个部门经理worker进程是底下的员工。你有事要找部门协调应该跟经理打招呼而不是直接跑到工位上把员工拽走。你直接杀worker经理发现人不够了马上又招一批进来你会陷入一个永远杀不完的死循环。1.2 四套管理入口的适用边界这么多年用下来我总结出Nginx的命令管理其实存在四套入口很多教程混着讲容易让人搞混入口类型典型命令适用场景备注二进制直接管理nginx、nginx -s stop安装后未注册为系统服务时需要nginx在PATH中或使用绝对路径信号直接管理kill -QUIT 进程号需要精确控制某个master进程时适合多实例部署场景systemd托管管理systemctl start/stop/restart nginx通过包管理器安装的Nginx最常见也最推荐编译安装的service脚本service nginx start老版本Linux发行版现在用得越来越少了这里我想特别强调一下很多人有个误解以为nginx -s stop和systemctl stop nginx是等价的两个命令。其实它们底层的机制完全相同——都是向master进程发信号——但systemd托管方式多了依赖管理和开机自启的能力。如果你的Nginx是通过yum或apt安装的我建议优先用systemctl如果是编译安装的直接用nginx -s更省事。2. 启动与停止的完整命令速查每种玩法都实测过讲完进程模型和入口类型下面进入实操环节。这一节我按使用频率排序把启动、停止、重启、优雅关闭这些高频操作逐一过一遍每个都标注适用场景和注意事项。2.1 启动Nginx的三种方式对比我最初用Nginx时只会一种启动方式nginx。后来发现启动方式其实有好几种各自适用的场景不太一样。# 方式一直接启动最基础的方式 nginx # 方式二指定配置文件启动适合测试新配置时 nginx -c /etc/nginx/nginx.conf # 方式三systemd托管启动生产环境推荐 systemctl start nginxnginx这条命令不带任何参数时会使用编译安装时默认的配置文件路径通常是/usr/local/nginx/conf/nginx.conf或/etc/nginx/nginx.conf。如果你安装Nginx时用的是包管理器默认路径一般是/etc/nginx/nginx.conf如果是源码编译安装默认路径在configure阶段指定默认是/usr/local/nginx/conf/nginx.conf。我在实际工作中遇到过这么个情况一台服务器上同时跑着两个版本的Nginx分别编译到不同目录。这时候直接敲nginx启动的可能不是你想用的那个版本。所以如果你也是多实例Nginx共存建议启动时明确指定-c参数避免启动错了实例。还有一个容易被忽略的参数是-p它指定Nginx的运行前缀目录。某些特殊场景下比如你没有root权限但又需要跑Nginx可以用-p指定一个你有写权限的目录作为prefixNginx会把pid文件和日志文件都写到这里面。我以前在为客户排查问题时就遇到过开发环境用-p /home/user/nginx方式跑的实例当时要是不知道这个参数还真不好定位问题。2.2 停止Nginx的快速关闭与优雅关闭关闭Nginx是初学者最容易踩坑的地方。直接kill -9虽然能把进程干掉但可能会留下一些后遗症——比如正在处理的请求被硬生生断开、日志文件没有正常写入完毕等。正规的关闭方式分两种# 快速停止不顾当前连接立即退出 nginx -s stop # 等价于执行kill -TERM master进程号 # 优雅停止等当前连接处理完再退出 nginx -s quit # 等价于执行kill -QUIT master进程号这两种方式的区别我用过一次就记住了。有一次线上做维护我直接用nginx -s stop停服务结果正在下载大文件的用户连接被硬生生掐断客服那边瞬间收到好几个投诉。后来学乖了做计划内维护一律用nginx -s quit让Nginx先把当前处理的请求处理完再退出worker进程。2.3 重启与重载的区别别傻傻分不清很多新手区分不开“重启”和“重载”总觉得改了配置就应该重启。其实这两个操作差异非常大用错场景会带来不必要的业务中断。# 重启完全停止再重新启动服务会有短暂中断 nginx -s stop nginx systemctl restart nginx # 重载平滑重读配置文件几乎无感知 nginx -s reload systemctl reload nginxreload的原理是这样的master进程收到重载信号后会先检查新的配置文件语法是否正确如果语法错误它会放弃重载继续用旧配置运行并把错误信息反馈给你。如果语法没问题master会启动新的worker进程用新配置去处理请求然后优雅地关闭旧的worker进程。这样一来整个过程中没有请求会被中断用户体验不到任何闪断。我个人的习惯是修改配置文件后先执行nginx -t检查语法确认无误后再执行nginx -s reload这样双保险基本不会出问题。2.4 查看Nginx运行状态的最实用命令组合确认Nginx是否在运行、跑在哪个端口、master进程号是多少这些信息对于排查问题非常重要。我常用的命令组合如下# 查看Nginx进程是否存在 ps -ef | grep nginx # 查看Nginx监听的端口 netstat -tlnp | grep nginx # 或使用ss命令新版Linux推荐 ss -tlnp | grep nginx # 查看Nginx版本号和编译参数 nginx -V nginx -v # 查看master进程号会输出到标准输出 cat /var/run/nginx.pidnginx -V这条命令值得多说一句。它不但输出版本号还会把编译时的全部参数列出来包括安装了哪些模块、prefix路径是什么、配置文件路径是什么。有一次我帮人排查为什么Nginx不支持某个功能就是用nginx -V一看发现他的Nginx编译时根本没把那个模块编译进去跟配置文件本身没有半毛钱关系。netstat -tlnp和ss -tlnp的区别在于前者在一些新版Linux发行版上已经不再默认安装后者是iproute2包里自带的工具。如果你发现自己机器上netstat报command not found别慌先试试ss命令大概率是有的。3. 配置检查与平滑重载的实战细节配置检查这个环节说大不大说小不小。很多线上事故其实不是配置写错导致的而是改完配置后忘了测试就直接reload结果reload的时候才发现语法错误。为了根治这个问题我给自己定了一条规矩每次改完配置先nginx -t再nginx -s reload两步缺一不可。3.1 nginx -t配置检查的完整输出解读# 测试配置是否正确 nginx -t # 输出结果示例 # nginx: the configuration file /etc/nginx/nginx.conf syntax is ok # nginx: configuration file /etc/nginx/nginx.conf test is successful这两行输出看着简单但有一个细节很多人没注意它会把实际使用的配置文件路径打印出来。之前我调试一个配置不生效的问题怎么看都觉得配置改对了用nginx -t一测发现它读的根本不是我改的那份文件——原来编译安装时prefix路径跟默认路径不同配置文件的真实路径和我想的不一样。这种低级错误其实很常见。另外如果你在nginx -t时看到的是下面这种输出不用慌它只是warning不是errornginx: [warn] the user directive makes sense only if the master process runs with super-user privileges nginx: [warn] conflicting server name localhost on 0.0.0.0:80, ignored第一条warning可以忽略意思是建议你用非root用户运行worker进程提高安全性。第二条warning一般是配置文件里重复定义了同一个server_name这个建议处理掉否则后面那个server块不会生效。3.2 reload失败时的回滚机制很多人担心一个问题reload执行后如果新配置里有运行时才会发现的错误比如upstream里的后端服务连不上会不会导致Nginx直接挂掉实际上Nginx的reload是有一个保护机制的。执行nginx -s reload后master进程会先对新配置做一次语法检查语法都正确后才会启动新的worker进程。假如新配置在运行时有逻辑层面的问题比如upstream的IP地址根本不通新的worker进程会不停报错但master不会因此杀掉旧的worker旧的worker会继续服务直到新的worker能正常接替。这里我想分享一个实测经验如果你reload后发现大量请求报502或504大概率是upstream配置出了问题。这时候别慌可以用nginx -s reload重新reload一次先切回之前能用的配置版本保证业务恢复再慢慢排查upstream的问题。3.3 日志切割的命令行实现方式Nginx运行时间长了access.log和error.log会膨胀得惊人。我记得有一次客户现场的一台服务器跑了半年没管过access.log居然有30多个G把磁盘直接撑满了。从那以后我养成了定期切割日志的习惯纯命令行操作不需要装任何额外工具。# 手动日志切割方式 # 第一步重命名现有日志文件 mv /var/log/nginx/access.log /var/log/nginx/access.log.20250101 # 第二步向master进程发送USR1信号让Nginx重新打开日志文件 kill -USR1 cat /var/run/nginx.pid # 或者更简洁的写法 nginx -s reopen这个操作的原理是Nginx把日志文件路径打开后会一直持有那个文件描述符。你用mv把文件改名后Nginx还在往旧文件里写。只有发USR1信号让它重新走一遍日志文件的打开流程它才会新建一个access.log继续写。如果你不发USR1信号单纯mv是没用的Nginx照样往那个已经被改名的文件句柄里写数据。生产环境建议配一个crontab定时任务每天凌晨切割一次日志。我常用的crontab写法是59 23 * * * mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date \%Y\%m\%d) kill -USR1 $(cat /var/run/nginx.pid)注意上面crontab里date命令的百分号需要转义成\%这个细节我踩过坑特此提醒。4. 信号管理的心法直接与Nginx进程对话用nginx -s系列命令虽然简单但它的本质是通过Nginx封装好的信号机制来操作进程。深入理解信号本身能让你在遇到特殊情况时不至于抓瞎尤其是多个Nginx实例共存、或者不小心把pid文件删除的场景。4.1 常用信号一览与作用信号数值作用等价命令TERM15快速停止类似nginx -s stopkill -TERM 进程号QUIT3优雅停止类似nginx -s quitkill -QUIT 进程号HUP1重载配置类似nginx -s reloadkill -HUP 进程号USR110重新打开日志文件kill -USR1 进程号USR212平滑升级可执行文件kill -USR2 进程号WINCH28优雅关闭旧worker进程kill -WINCH 进程号这里面我重点想聊一下USR2和WINCH的组合玩法。这两个信号配合可以实现Nginx的平滑升级也就是在不中断服务的情况下把Nginx二进制文件替换成新版本。这个操作在早期热升级时非常常用虽然现在已经可以用OpenResty或第三方工具做到更优雅的升级但理解这套信号流程对深入掌握Nginx运维依然有帮助。4.2 平滑升级的完整流程演示平滑升级的需求场景是这样的你的Nginx是1.20版本想升级到1.26版本但线上有大量长连接请求不能有任何中断。这时候USR2和WINCH就派上用场了。具体流程是这样的# 1. 先编译好新版本的Nginx替换旧的可执行文件先备份 mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old cp /usr/local/nginx-new/sbin/nginx /usr/local/nginx/sbin/nginx # 2. 向旧master进程发送USR2信号 kill -USR2 cat /var/run/nginx.pid # 旧master会启动一个新master进程新旧master并行运行 # 新master的pid会写入 /var/run/nginx.pid.newbin # 3. 向旧master发送WINCH信号优雅关闭旧worker进程 kill -WINCH cat /var/run/nginx.pid # 旧master的worker进程会逐渐退出但旧master本身还在 # 这时如果发现新版本有问题可以随时回滚 # 4. 向旧master发送QUIT信号彻底退出旧master kill -QUIT cat /var/run/nginx.pid整个过程就像一个接力赛先用新配置文件启动新master旧worker处理完手头的请求后自然退出新worker接管后续请求。用户全程无感知。我在曾经的客户现场做过多次平滑升级这个流程非常稳定。不过现在Nginx官方在1.26之后也给出了更友好的升级方式比如用systemd时直接systemctl reload nginx就能完成二进制替换后的重载。4.3 信号管理的常见误区pid文件丢了怎么办Nginx的pid文件默认写在/var/run/nginx.pid或/usr/local/nginx/logs/nginx.pid。如果这个文件被误删了你会发现nginx -s reload直接报错。遇到这种情况第一反应不应该是重启Nginx因为重启会造成服务中断。正确做法是用ps -ef | grep nginx找到master进程的PID然后直接用kill命令发信号kill -HUP 12345HUP信号和nginx -s reload的效果完全一样。这个方法能让你在pid文件丢失的情况下依然完成配置重载不中断服务。5. 多实例管理场景下的命令切换策略前面讲的命令都是针对单实例Nginx的。但实际工作中一台服务器上部署多个Nginx实例的情况并不少见——比如同一个机器上需要跑两个不同配置的站点组或者你在本机同时维护开发版和稳定版。这种场景下命令操作的复杂度会明显上升。5.1 通过-p参数区分实例的启动方式当你用源码编译安装第二个Nginx实例时一定记得要指定不同的prefix。比如# 编译第一个实例 ./configure --prefix/usr/local/nginx make make install # 编译第二个实例 ./configure --prefix/usr/local/nginx-test make make install启动时可以通过-p参数显式指定使用哪个prefix# 启动第一个实例 /usr/local/nginx/sbin/nginx -p /usr/local/nginx/ # 启动第二个实例 /usr/local/nginx-test/sbin/nginx -p /usr/local/nginx-test/这样两个实例互不干扰各自的配置、pid、日志都在各自的目录下。后面做reload、stop操作时也带上-p参数指向正确的实例目录。如果不带-pNginx会把编译时的默认prefix当作运行目录可能操作的是错误实例。5.2 查看多实例运行状态的技巧多实例环境下ps -ef | grep nginx会看到一堆进程分不清谁是谁。这时候有两个技巧# 方法一通过启动命令区分 ps -ef | grep nginx # 观察每一组nginx进程的启动命令行带-c或-p参数的就能区分出来 # 方法二通过监听端口区分 ss -tlnp | grep nginx # 如果两个实例监听不同端口用这个最直观我自己的经验是如果两个实例分别监听80和8080端口那不管进程多混乱看端口永远是最快的定位方式。如果两个实例监听同一端口但绑定了不同的IP可以用ss -tlnp | grep 80来查看每个监听地址对应的进程PID再去ps里反向查是哪个实例。6. 高频踩坑实录这些错误你也很可能遇到命令操作这块我这些年积累了不少“血泪教训”。有些坑第一次踩的时候很懵但把原理想通了就发现其实都是小问题。这一节我把最高频的几个踩坑场景完整复盘出来给你做个参考。6.1 “address already in use”启动失败的完整排查链路这是新手最容易遇见的错误执行nginx启动时报bind() to 0.0.0.0:80 failed (98: Address already in use)。我第一次遇到这个错的时候第一反应是“是不是Nginx已经启动了”排查链路如下# 第一步确认端口被谁占用 ss -tlnp | grep :80 # 第二步根据占用进程确认是否已有Nginx在运行 ps -ef | grep nginx # 第三步如果确认没有Nginx在运行 # 用fuser或lsof查看是被什么进程占用了 fuser -v 80/tcp有一次服务器重启后我执行nginx启动失败报address already in use。用ss一看端口80被一个叫Apache的进程占着——这台服务器之前装了httpd而且设置了开机自启。搞清楚原因后就好办了停掉Apache并取消自启然后启动Nginx。这个坑的通用排查思路其实就一句话端口冲突永远是先定位占用方再决定怎么处理别一上来就盲目kill。6.2 修改了配置为什么不生效“明明改了nginx.confreload也执行了为什么访问效果没变化”这个问题在技术群里被人问了无数次。大多数情况下问题出在配置文件根本没被正确加载。排查思路如下# 第一步确认当前生效的配置文件路径 nginx -T | grep configuration file # 或者执行 nginx -t # 第二步确认nginx.conf里是否include了其他配置文件 grep include /etc/nginx/nginx.conf很多发行版默认是include /etc/nginx/conf.d/*.conf或include /etc/nginx/sites-enabled/*如果你改了/etc/nginx/conf.d/xxx.conf但执行nginx -t时没看到报错并不代表它一定加载了你改的内容。先确认include路径覆盖了你的文件再检查语法然后再reload这个顺序不能乱。另一个容易忽略的原因是浏览器缓存和DNS缓存。你改了静态文件或server_name但浏览器端可能缓存了之前的响应。用curl排除本地干扰curl -I http://localhost:8080/如果curl看到的是新内容而浏览器看到的是旧内容基本可以确定是缓存问题跟Nginx命令操作无关。6.3 配置文件语法正确但启动仍报模块缺失有些朋友通过源码编译Nginx时没注意模块后续在配置里用了nginx -t检查时会看到nginx: [emerg] unknown directive stream in /etc/nginx/nginx.conf:12注意这里是[emerg]级别表示致命错误跟你之前看到的[warn]有本质区别。stream指令需要ngx_stream_module模块支持如果你的Nginx编译时没加--with-stream这个指令就是未知的。解决方法是重新编译Nginx加上缺失的模块。但如果你不想重新编译整个Nginx在版本允许的前提下可以考虑用动态模块加载方式。不过这个属于进阶话题了通常建议在第一次编译时就规划好需要哪些模块免得到时候返工。6.4 防火墙与端口对启动“失败”的误导很多时候Nginx进程明明启动成功了但外部就是访问不了。这大概率是防火墙或安全组把端口拦住了。我遇到过一次挺有意思的案例客户说Nginx启动不了我远程上去看进程在、端口也在监听但外网就是打不开。排查了半天发现是云服务商安全组规则没放行端口。防火墙层面用systemctl status查不到任何Nginx报错因为Nginx本身非常健康。所以当你觉得“Nginx启动异常”时别急着怀疑Nginx先按这个顺序排查# 1. 确认进程存在 ps -ef | grep nginx # 2. 确认端口监听正常 ss -tlnp | grep 80 # 3. 确认本机能正常访问 curl -I http://127.0.0.1/ # 4. 确认防火墙放行了端口 firewall-cmd --list-ports # 或者 iptables -L -n | grep 80 # 5. 如果用的是云服务器还要检查安全组入方向规则7. Windows环境下的Nginx启动关闭操作差异Windows上跑Nginx的人也不少因为本地开发调试比较方便。Windows版Nginx的命令操作跟Linux有较大区别我单独拿一节来说。7.1 Windows版Nginx的运行方式Windows版Nginx不像Linux那样有master-worker的进程模型它的进程模型在Windows上是一个主进程加若干worker进程但控制方式完全不同。在Windows上你不能用systemctl或service来管理Nginx只能直接操作二进制文件。# 启动在nginx.exe所在目录下执行 start nginx # 或者 nginx.exe # 快速停止 nginx.exe -s stop # 优雅停止 nginx.exe -s quit # 重载配置 nginx.exe -s reload # 检查配置 nginx.exe -t一个非常容易踩的坑是在Windows上双击nginx.exe启动Nginx后那个命令行窗口如果被关了Nginx进程很可能会一并退出。所以最好用start nginx的方式让它在独立于当前命令行窗口的进程中运行。7.2 Windows下杀掉残留Nginx进程的正确方式有时候Windows版的Nginx会被杀进程软件误删或异常退出导致端口被占用。这时候去任务管理器里逐个人工找nginx.exe再结束效率太低了。用命令行更高效# 查看Nginx进程 tasklist | findstr nginx # 强制结束所有Nginx进程 taskkill /F /IM nginx.exe注意这条命令会杀掉所有nginx.exe进程。如果同时运行了多个Nginx实例那就分不清谁是谁了。更好的做法是根据PID指定杀taskkill /F /PID 12345我一般在Windows上调试Nginx时养成的习惯是修改配置后不用重启直接nginx.exe -s reload跟Linux行为一致很顺手。如果reload后还是旧配置稍微等一两秒再刷新浏览器Windows下偶尔会有一瞬间的配置缓存延迟。8. 补齐基础帮你理解命令联动的Linux操作细节这一节写给那些刚开始用Nginx、对Linux命令还不太熟练的朋友。前面讲了那么多命令你可能会发现真正执行的时候还会穿插一些别的Linux命令。把这些基本功补齐Nginx命令操作才会真正顺畅。8.1 vim命令快查常见的编辑操作Linux下改Nginx配置基本离不开vim但vim的学习曲线确实劝退了很多人。其实日常改Nginx配置需要的vim命令没几个掌握最核心的就能顺畅操作了。# 打开配置文件 vim /etc/nginx/nginx.conf # 在vim里常用操作 # i 进入插入模式可以编辑文本 # Esc 退出插入模式回到普通模式 # :w 保存文件 # :q 退出vim # :wq 保存并退出 # :q! 不保存强制退出 # /keyword 在文件里搜索keyword按n跳转到下一个匹配 # G 跳到文件末尾 # gg 跳到文件开头有人可能觉得用vim改Nginx配置太麻烦想用nano这种更简单直观的编辑器。个人建议尽早适应vim因为你在服务器上排查问题时不是每台机器都装了nano但几乎每台都有vim。花一两天时间把vim的基础命令混个脸熟长期看很划算。8.2 配合Nginx命令使用的防火墙操作前面提到过防火墙会拦截Nginx端口这里补充一下常见的防火墙命令操作。以CentOS/RHEL系为例# 查看防火墙状态 systemctl status firewalld # 临时放行80端口 firewall-cmd --add-port80/tcp # 永久放行80端口重启后依然生效 firewall-cmd --permanent --add-port80/tcp firewall-cmd --reload # 移除放行规则 firewall-cmd --permanent --remove-port80/tcp firewall-cmd --reload # 查看所有放行规则 firewall-cmd --list-all如果你用的是纯iptables环境可以用以下命令# 放行80端口 iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 保存规则 service iptables save提醒一个高频误操作很多人在云服务器上明明用firewall-cmd --add-port80/tcp放行了端口但外部依然无法访问。这大概率是云控制台的安全组没放行80端口安全组和服务器自身的防火墙是两层机制任一层的规则没放行都会导致外网访问失败。8.3 systemctl和nginx命令混用的注意点systemd托管Nginx之后你会发现在/usr/lib/systemd/system/nginx.service这个服务文件里实际执行的还是Nginx二进制命令。比如# nginx.service文件内容摘录 ExecStart/usr/sbin/nginx ExecReload/usr/sbin/nginx -s reload ExecStop/usr/sbin/nginx -s quit所以systemctl reload nginx本质上执行的就是nginx -s reload。理解了这一层就不会在“为什么两种方式结果一样”这个问题上纠结了。混用时有一个细节需要注意如果你用nginx -s reload重载了配置systemd并不知道这个过程它的状态记录里可能还显示服务正在运行这没问题。但是如果哪天你手贱先执行了nginx -s stop再从systemd层面查询状态systemd会发现主进程不存在了于是把服务标记为failed。这时候执行systemctl start nginx通常能正常拉起来但爱较真的人可能会疑惑为什么状态是failed。如果你想彻底避免这种情况建议统一走systemctl别混用。9. 实战速查一条龙命令脚本思路最后分享一个我给自己整理的一条龙操作思路不少同事看过后都说好用。还是那句话——每天高频用的命令不多真正让你焦虑的是“该用哪个命令、什么顺序用、能不能回滚”这些决策问题。9.1 日常启动部署的推荐命令顺序当你在一台全新服务器上部署Nginx时推荐按下面这个顺序操作# 1. 检查是否有残留进程 ps -ef | grep nginx # 2. 检查端口占用 ss -tlnp | grep :80 # 3. 测试配置 nginx -t # 4. 启动 nginx # 5. 验证进程与端口 ps -ef | grep nginx ss -tlnp | grep :80 # 6. 本机访问验证 curl -I http://127.0.0.1/ # 7. 设置开机自启systemd托管时 systemctl enable nginx这个顺序不是随便排列的每一步都是为了把上一步的问题边界缩小。先确认环境干净再测试配置再启动最后多维度验证。别跳步尤其是第3步的测试配置养成了先测再启的习惯后你会少遇到很多线上事故。9.2 日常改配置的推荐命令顺序如果是已有Nginx实例改完配置后我推荐这个顺序# 1. 备份原配置 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak # 2. 修改配置 vim /etc/nginx/nginx.conf # 3. 测试新配置 nginx -t # 4. 平滑重载 nginx -s reload # 5. 验证效果 curl -I http://127.0.0.1/第1步的备份经常被忽略但真出问题时它就是救命稻草。去年有一次我改上游服务器配置手滑多打了一个分号还好有备份文件两秒钟就恢复了。没备份的话你得一行行在几百行的配置里找问题那画面想想都头大。9.3 日常关闭Nginx的推荐做法日常计划内停机维护时我推荐下面这个顺序# 1. 确认没有正在处理的长连接任务比如大文件下载 ss -tn state established ( sport :80 ) # 2. 优雅停止 nginx -s quit # 或者 systemctl stop nginx # 3. 确认进程已退出 ps -ef | grep nginx # 4. 如果确认需要完全停用开机自启 systemctl disable nginx如果你确认没有长连接任务用nginx -s stop也没问题毕竟快速停止的效率更高。但如果拿不准就选nginx -s quit宁可多等几秒也别掐断用户正在处理的请求。这些命令和流程都是我在多个真实环境里验证过的你按照这个思路去操作基本不会出大问题。Nginx的命令管理体系本身不复杂最难的地方在于理解进程模型和信号机制一旦想通了这两点你会发现所有命令都是围绕“如何与master进程正确沟通”展开的。下次遇到Nginx启动或关闭的问题先冷静分析一下是哪种场景再选对应的命令组合就不会再手忙脚乱了。
返回列表