前言
最近在使用NPM代理服务时,出现了无法访问的情况,如图所示:
这里记录一下调试过程和调试方法可以,解决过程可能比较简单主要是调试过程和调试思路。
问题复现
因为该问题是出现在1:1生产环境的测试环境,生产环境NPM代理比较多,可能会增加复杂性,所以我这里模拟了一个最小的复现的环境,这样更可以说明是该问题导致。
首先NPM配置两个代理,如下:
配置了两个Hosts代理。其中test.zhangshuocauc.cn
后端是用nginx启动了一个最小的测试页面,使用Docker Compose安装Nginx最小服务。compose.yaml可以使用如下配置:
services:
app:
image: nginx:latest
ports:
- 8081:80
hostname: nashtml
volumes:
- ./stack/data/app/log:/var/log/nginx
- ./stack/data/app/html:/usr/share/nginx/html
restart: unless-stopped
这里需要在./stack/data/app/html
目录下新建一个index.html随便写一些文字。docker compose up -d
启动服务即可。然后浏览器访问宿主机的8081端口验证后端是否启动如图:
如果要使用域名访问需要做DNS解析,用于测试可以使用本地Host文件进行本地解析,windows的Hosts文件路径:C:\Windows\System32\drivers\etc\hosts
Linux下路径为/etc/hosts
增加域名指向宿主机的IP然后保存,保存完ping一下配置的域名看是否配置成功。
我的Windows下hosts配置文件如图:
配置的两个域名解析是NPM里面配置的两个Hosts代理。
访问test.zhangshuocauc.cn
查看效果:
可以正常访问,访问test2.zhangshuocauc.cn
就可以看到开篇那种效果。
问题定位
查看NPM系统日志
首先查看NPM是否有系统错误,使用docker container logs npm-app-1 -f
打开日志,然后在浏览器再次尝试访问:
可以看到点击刷新按钮,NPM系统log没有任何输出。
查看NPM代理访问日志
既然系统log没有输出,可以查看NPM的代理log,如果按上篇配置的NPM
使用
tail -f stack/data/app/logs/proxy-host-2_access.log
查看NPM代理错误日志
查看是否有错误日志:
错误日志也是空的。
使用浏览器调试模式分析请求流程
从日志的角度无法找到问题的突破点,可以打开浏览器,使用调试模式进行访问,查看浏览器录制的访问记录:
调试记录也看不出啥,使用调试记录主要是确认如下几点:
- 是否是浏览器缓存产生的影响
- DNS后访问的真正主机IP地址是否正确
- 是否服务器响应30x重定向请求导致的重定向异常
显然没有符合上面任何一点。
查看NPM代理配置
NPM HOSTS代理有很多,尝试排除其他代理对该代理的影响。操作流程就是挨个把其他代理配置进行失能,如图:
因为这里只有两个,禁用上面的即可。再次进行访问:
果不其然竟然可以访问了。
问题解决
找到了干扰项,就要分析为什么其他代理会对该代理产生干扰,经过排查发现,因为我都使用的Docker网关地址即172.17.0.1,后面端口号是唯一表示,经过排查,发现了端口的重复。如图:
两个后端代理完全一样,导致只有第一个可以被访问。
总结
其实真正的生产环境不会产生该问题,因为在配置后端时,如果端口号被占用,服务启动时就会报错。我也是因为测试环境第一个代理服务其实是被关闭的,导致第二个服务可以正常启动,却无法访问的问题。也是定位了很久。
既然NPM有端口号的问题,有没有其他方式解决配置端口号被占用的其他代理呢,答案是有的,后面我的环境也是全面放弃了NPM。
--EOF
版权属于:redhat
本文链接:https://blog.zhangshuocauc.cn/archives/14/
本站采用“知识共享署名 - 非商业性使用 - 相同方式共享 4.0 中国大陆许可协议” 进行许可 您可以转载本站的技术类文章,转载时请以超链接形式标明文章原始出处,Thank you.