最近公司项目采购系统已经开发的差不多了,同事测试完了之后让我帮忙部署,jar包搞上docker后,在同事配置nginx的时候出现了问题。

除了nginx配置的时候除了域名不一样,其他的则全部一致,这个时候访问的时候,却跳到另一个项目的页面去。

即比如要访问c.company.com,却跳到a.company.com的页面去,虽然域名还是c.company.com。

百思不得其姐,先用./nginx -t 检查了一下配置是否出问题,结果没有错。

然后./nginx -s reload 后,查了下nginx的错误日志发现:

2019/11/29 13:47:35 [notice] 19479#0: signal process started
2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use)
2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use)
2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use)
2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use)
2019/11/29 13:47:35 [emerg] 3048#0: bind() to 0.0.0.0:9000 failed (98: Address already in use)
2019/11/29 13:47:35 [emerg] 3048#0: still could not bind()

发现9000这个端口绑定失败。
这个端口号是一个服务的端口,怎么跟nginx扯上关系了呢?

其实因为一开始没先看日志,因为配置都是跟测试环境保持一致的,不知道什么原因导致了跳转根目录失败:

比如a.company.com的根目录是/a,
c.company.com的根目录是/c,在我要访问c.company.com的时候,通过nginx日志看到访问的路径是:/a/index.html这样的目录。

为什么会出现这种问题呢?

其实就跟上面这个端口有关系。在我的nginx的conf.d目录中,有3个配置文件 :

a.conf
b.conf
c.conf

其中c.conf就是新项目的配置,上面出现的端口绑定失败是在b.conf中,其中的ssl配置出了问题,不知为何不是配的443,而是9000。在将其修改成443之后就可以正常访问了。

总结一下修改后就恢复正常的原因:
1.因为配置的语法没有问题,所以使用./nginx -t 是检测不出来问题的。

2.因为配置端口错误是在b.conf中,所以b.conf只是不能使用https,并不影响http使用,所以一直没有发现问题

3.之所以访问c.company.com会跳转到a.company.com的页面去,我猜是因为b.conf出了问题,nginx不能正确的加载下一个配置文件,因为a.company.com和c.company.com的域名解析都是在这同一台主机上,DNS解析的时候解析到当前主机,却不能正确的找到c.conf这个配置,所以只能默认加载到第一个配置文件a.conf上,导致出现访问c却跳到a的登陆页面去。

nginx在加载配置的时候应该是按顺序加载进来,一旦某个配置文件有问题,将会导致下面要加载的配置文件不能正确加载。

如有问题,欢迎讨论( •̀ ω •́ )y


小哥
12 声望2 粉丝

虚心学习