一次排查ToranProxy的教训
由于公司的开发内网无法联网,之前我在公司内网维护了一个ToranProxy,用来管理我们的PHP组件包,以及方便大家应用第三方的PHP包。
今天有其他部门的同事反馈这上面的包用不了了,而以前他们用的时候是正常的。
由于这个东西我很久没弄了,翻出以前的笔记大致看了一下,也没啥头绪,猜测应该是包下载的地址有问题,内网无法访问到。所以首要任务是找到这个包具体是去哪个地址下载的。
然后我就一头扎进了源码里面,去跟踪调试。而很郁闷的是,ToranProxy的作者,在代码里面基本没写什么注释,全靠自己猜~~
就这样搞了半个小时,还是没啥头绪(其实自己当时有其他事情想要做,心也不在这边,有点抵触情绪了,因此效率极低)。
后来回过头再仔细看了一遍之前的笔记,发现这个工具自身是有记录日志的!
然后打开日志文件,里面很清晰的已经记录了具体发送的最终url,是类似这样的一个地址:
http://api.github.com/repos/illuminate/contracts/zipball/22bde7b048a33c702d9737fc1446234fff9b1363
然后我将这个地址代理到内网,发现还是不行。单独在内网服务器请求这个接口,发现被重定向到了https的443端口。原来github.com默认已经将http协议永久重定向(301)到了https协议。
至此,问题确定了。
因为据同事反馈,之前是好的,最近才不行了,那么我猜测可能是如下原因:
1、近期这个组件迁移到github了,所以以前ok,现在不行了
2、github的https永久重定向是最近才做的
但是我发现现在不止某一个包,而是基本上全部包都没法用了,那么上面1就说不通了,不可能所有包最近都从其他源转到了github.com;而上面的2也不大可能。
按理说我们配置了composer的国内镜像,应该包都从files.phpcomposer.com过来才对,难道这个域名最近都转到github.com了?
然后我看了下中国镜像的官网,发现有这样一个提示:

到这里,原因终于确定了:
我们的包同步流程是类似这样的:
composer install ->请求我们内网代理服务器->通过nginx将请求转发到外网->访问中国镜像
因为github将http协议永久重定向(301)到了https协议,而https协议无法通过nginx转发,所以现在内网就用不了了。
那我们只能静静等待中国镜像恢复了☺。
今天这个问题,给我最大的教训就是:排查问题,记得先从日志入手,不要盲目跟入代码。
日志在解决问题的过程中太重要了,切记。