那天在办公室,我正在帮同事解决一个nginx配置问题。他突然说:“这服务器怎么半天都重启不了啊?”我打开终端一看,果然,命令行里显示nginx正在重启,但是重启进度条就像老牛拉车,慢吞吞的。我试了systemctl restart nginx命令,然后去泡了一杯咖啡。
回来一看,nginx还是那个样子。我打开另一个终端,输入ps aux | grep nginx,发现nginx的进程还在,只是状态显示为重启中。我突然想到,是不是端口被占用了?我用netstat -an | grep 80命令一看,果然,80端口被一个名为node的进程占用了。
解决完端口占用问题,我再次执行重启命令,这次nginx很快就重启成功了。时间回到10年前,我刚接触nginx的时候,对这类问题可是头都大了。现在虽然习惯了,但每解决一个问题,我还是会自言自语:“等等,还有个事,我刚才突然想到,如果遇到类似的端口占用问题,还可以用lsof命令查看具体占用端口的进程ID,直接kill掉不就行了?”
Linux下重启Nginx其实很简单。这事复杂在很多人不知道有几种方法可以做到。
先说最重要的,最常用的命令是 systemctl restart nginx。比如,去年我们跑的那个项目,大概3000量级的服务器,每次更新配置后都是这么操作的。
另外一点,如果你用的是传统的 /etc/init.d/nginx 方式,那么命令就是 service nginx restart。这个方法在老版本的系统中很常见。
还有个细节挺关键的,有时候重启后服务并没有真正重启,这时候可以检查一下Nginx的进程。用 ps -ef | grep nginx 命令看看,如果没有进程,那可能就是没有重启成功。
我一开始也以为重启就是重启,后来发现不对,有时候配置文件有问题,重启后服务并不会启动。等等,还有个事,如果你重启后服务依然不响应,可以试试先停止再启动,命令是 systemctl stop nginx 和 systemctl start nginx。
最后提醒一个容易踩的坑,不要频繁重启Nginx,每次重启都会消耗系统资源,影响性能。如果配置有误,先检查再重启。
nginx -s reload