进程缓存DNS解析的问题
问题描述
205.235测试服务器之前为了调试,将mongodb的hosts指向了正式服务器,即/etc/hosts中配置了:
192.168.200.102 db_mongo_master
今天切换回测试地址(hosts改为192.168.205.233 db_mongo_master)后,访问页面,发现显示的数据仍然是正式服务器的数据。
调试过程
1.刷新dns缓存,无效
2.测试其他的hosts映射名,或者将hosts和程序配置文件中的db_mongo_master改为db_mongo_test,发现能够正常连接
3.命令行脚本测试,发现能够正常连接
由此猜测应该和PHP/Nginx有关系,可能是PHP/Nginx进程缓存了dns信息
但是php只是代码,按理说不应该会缓存dns
验证过程
重启php-fpm进程,发现hosts文件的修改能够即时生效了,试了几次都正常,之前的现象没有出现。
思考
现象没有重现,是否是因为还没弄清楚原理的缘故?php-fpm开启了多个进程,是不是碰巧我尝试的几个进程没问题,导致的巧合现象?
经陈大师提醒,这个缓存,应该是针对进程的缓存,而不是php或者nginx。
验证过程
经查看,发现php-fpm.conf设置的pm.max_requests=0,默认一直生效,导致PHP进程常驻内存不会自动销毁,应该就是这个原因了。
之前我修改hosts没生效,应该是之前我们发起过很多次请求,所有常驻内存的进程都用过了,都有了dns缓存
重启后,进程都是新的,因此初期的几次请求,修改的hosts都能即时生效
为了验证,再进行了测试:
1.修改hosts
192.168.200.102 db_mongo_master
2.重启php-fpm
此时应该缓存为200.102
3.修改hosts
192.168.205.233 db_mongo_master
4.访问
如有缓存,应该仍然访问到200.102,虽然不一定每个进程都访问到102,但是至少一部分常驻进程应该是访问到200.102
5.结果
全为改动后的205.233
结论
进程会在第一次用到某个域名时,进行dns缓存,而不是进程一开启就缓存所有dns信息,这样可以避免缓存冗余数据。
接下去还要测试nginx静态页面,确定是否是针对进程的