前言

最近在使用NPM代理服务时,出现了无法访问的情况,如图所示:

image-20241230151756547

这里记录一下调试过程和调试方法可以,解决过程可能比较简单主要是调试过程和调试思路。

问题复现

因为该问题是出现在1:1生产环境的测试环境,生产环境NPM代理比较多,可能会增加复杂性,所以我这里模拟了一个最小的复现的环境,这样更可以说明是该问题导致。

首先NPM配置两个代理,如下:

image-20241230152223331

配置了两个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端口验证后端是否启动如图:

image-20241230152814359

如果要使用域名访问需要做DNS解析,用于测试可以使用本地Host文件进行本地解析,windowsHosts文件路径:C:\Windows\System32\drivers\etc\hosts Linux下路径为/etc/hosts增加域名指向宿主机的IP然后保存,保存完ping一下配置的域名看是否配置成功。

我的Windows下hosts配置文件如图:

image-20241230154337278

配置的两个域名解析是NPM里面配置的两个Hosts代理。

访问test.zhangshuocauc.cn查看效果:

image-20241230163126630

可以正常访问,访问test2.zhangshuocauc.cn就可以看到开篇那种效果。

问题定位

查看NPM系统日志

首先查看NPM是否有系统错误,使用docker container logs npm-app-1 -f打开日志,然后在浏览器再次尝试访问:

image-20241230163600407

可以看到点击刷新按钮,NPM系统log没有任何输出。

查看NPM代理访问日志

既然系统log没有输出,可以查看NPM的代理log,如果按上篇配置的NPM


使用tail -f stack/data/app/logs/proxy-host-2_access.log

image-20241230164658124

查看NPM代理错误日志

查看是否有错误日志:

image-20241230164832612

错误日志也是空的。

使用浏览器调试模式分析请求流程

从日志的角度无法找到问题的突破点,可以打开浏览器,使用调试模式进行访问,查看浏览器录制的访问记录:

image-20241230165046247

调试记录也看不出啥,使用调试记录主要是确认如下几点:

  • 是否是浏览器缓存产生的影响
  • DNS后访问的真正主机IP地址是否正确
  • 是否服务器响应30x重定向请求导致的重定向异常

显然没有符合上面任何一点。

查看NPM代理配置

NPM HOSTS代理有很多,尝试排除其他代理对该代理的影响。操作流程就是挨个把其他代理配置进行失能,如图:

image-20241230173533217

因为这里只有两个,禁用上面的即可。再次进行访问:

image-20241230173638812果不其然竟然可以访问了。

问题解决

找到了干扰项,就要分析为什么其他代理会对该代理产生干扰,经过排查发现,因为我都使用的Docker网关地址即172.17.0.1,后面端口号是唯一表示,经过排查,发现了端口的重复。如图:

image-20241230174010672

两个后端代理完全一样,导致只有第一个可以被访问。

总结

其实真正的生产环境不会产生该问题,因为在配置后端时,如果端口号被占用,服务启动时就会报错。我也是因为测试环境第一个代理服务其实是被关闭的,导致第二个服务可以正常启动,却无法访问的问题。也是定位了很久。

既然NPM有端口号的问题,有没有其他方式解决配置端口号被占用的其他代理呢,答案是有的,后面我的环境也是全面放弃了NPM。

--EOF

最后修改:2025 年 01 月 11 日
如果觉得我的文章对你有用,请随意赞赏