首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

通过一个案例了解 nginx 重载过程

这周四,同事告诉我一个奇怪的问题:在我们的一台服务器上原来已经有了一个网站,现在需要再部署另一个网站。分别通过两个不同的域名来访问,这很简单,使用基于域名的虚拟主机就可以做到。但是奇怪的是重载之后,通过两个域名访问到的都是那个老的网站。

为了方便描述,我们假设老的网站叫做“网站 A”,对应域名是“a.com”,新部署的网站叫做“网站 B”,对应的域名是“b.com”。

在我接手这个问题以后,我首先看了网站 B 对应的配置文件

看起来没有任何问题。我首先 ping 了一下域名发现异常。因此我怀疑是不是域名配置有什么问题,我找了运维也没有发现配置有任何可疑之处,只好作罢。在这之前我还是比较怀疑的,毕竟我们是依靠域名做的虚拟主机。我也查了 nginx 的日志文件,看到了 b.com 域名的访问记录,也基本证明了域名配置正确。(事后回顾:我现在再就正常了,当时可能是域名解析的缓存问题)

然后我想到我以前见到过的默认虚拟主机配置,我大概了解这个特性,但是不了解具体用法。所以搜索了一番。了解到在匹配虚拟主机时,首先测试请求的 IP 地址和端口(通过 listen 指定配置)是否匹配,然后才测试 Host(通过 server_name 指令配置)是否匹配,如果没有匹配到,nginx 把这个请求交给默认虚拟主机处理。虚拟主机是配置在 listen 指令,也就是 IP 和端口上,所有不同的 IP+Port 组合可以设置不同的默认服务器。根据以上信息,我尝试设置默认虚拟主机,但是仍然没有任何改变。

这时候我开始怀疑人生了,我开始怀疑是不是这台服务器上有两个 nginx,是不是修改错了配置文件,我要测试一下。我通过停止 nginx 服务器,立马访问发现不能访问了,也就是说确定是这个 nginx 服务器了,没有问题。我紧接着通过重启 nginx 服务,但是很不幸,报错了,居然报错了。

本来好好的,怎么突然找不到文件了呢,我一度怀疑是我启动姿势不对,还特地去问了同事,然后急忙注释掉”error_log /var/log/nginx/logs/error.log;”这句话才成功地启动了。

到这里可以看出,原来是错误日志文件找不到,所以重载失败,但是没有给出任何错误提示。为什么会这样呢?我明明记得有时候也会报错的?

经过各种搜索才发现,原来重载时 master 进程首先检查配置的语法有效性,如果有语法错误会报错,比如你将第一行替换成试试。如果通过语法检测,就会尝试配置,打开日志文件,尝试分配新的监听端口等,这一步如果有错误,就回滚改变,继续使用原来的配置。如果尝试配置成功,就会使用新的配置创建新的 worker 进程,并给旧的 worker 进程发一个关闭的消息。旧的 worker 进程收到关闭消息后,继续处理当前正在处理的请求,等完成以后就会关闭。关于重载过程请参考官方文档。

通过上面对于重载过程的讲解不难看出,重载时如果打开日志文件出现错误就回滚了,并不会报错。会让你误以为成功了。其实还有另一个命令,它可以检查配置是否正确,不仅可以进行语法检查,还能检查到上述的错误日志文件不存在的问题。它就是:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190106G13HHP00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券