办公室里七个人抢一个4G上网卡的理上日子,我过了整整两周。理上直到某天下午,理上隔壁工位的理上程序员老张看不下去了,丢给我一个旧笔记本:“装个nginx,理上咱自己搭代理。理上”
那台笔记本配置惨不忍睹——双核CPU,理上2G内存,理上硬盘还吱吱响。理上但老张说,理上就凭这玩意儿,理上能让全办公室的理上网页访问速度翻倍。我半信半疑地跟着他敲命令。理上先装nginx,理上然后改配置文件,理上加了个location /块,里面写上proxy_pass http://上级代理IP:端口;。就这么几行,保存,重启服务。
神奇的事情发生了。我把自己电脑的浏览器代理设置成那台笔记本的IP加8080端口,原本打不开的国外技术文档网站,居然嗖嗖地加载出来了。其他同事见状纷纷效仿,一上午功夫,整个办公室的网络环境彻底变了样。没人再抢那个破4G卡,连下载大文件都不再卡成PPT。
nginx做代理上网,原理说白了就是个“二传手”。你请求网页,它先替你接住,再转交给真正的目标服务器。目标服务器把内容传回来,它也先收下,再递给你。中间多了一道手,却解决了两大难题——第一,它能帮你绕过网络封锁,访问那些直接连不上的资源;第二,它能缓存常用页面,别人问过的东西它记在本地,下次直接给,省去重复跑外网的时间。
但别高兴太早。我踩过坑。有次图省事,把proxy_cache缓存时间设成了24小时,结果当天下午更新了新闻页面,全办公室刷出来的都是旧内容。老张骂我猪脑子,说代理不是时光机,缓存设这么长,等着被骂吧。后来改成5分钟,才算消停。
还有个细节容易被忽略——DNS解析。nginx默认用自己的DNS去解析目标域名,如果这台代理服务器的DNS配置有问题,那所有人上网都会跟着遭殃。我试过把DNS改成8.8.8.8,结果国内网站反而变慢了,换成114.114.114.114才恢复正常。这事儿让我明白,代理服务器不是配置完就一劳永逸,它跟你家路由器一样,得时不时关心一下。
最让我意外的是,这台破笔记本扛住了全办公室一天的流量。峰值时同时在线十二个人,有看视频的,有传文件的,CPU占用率愣是没超过70%。nginx的异步处理机制确实有两下子,不像Apache那样一个连接就占一个进程,它用事件驱动,几千个连接共用几个工作进程,资源消耗自然低。
现在那台笔记本还在我桌子底下蹲着,风扇声音有点大,但没人抱怨。偶尔有人问我,为啥不用现成的代理软件?我说nginx灵活啊,想加个访问控制,改两行配置就能限制某些IP;想记录谁上了什么网站,开个access_log就全有了。这些功能,那些图形界面的工具反倒做得啰嗦。
不过话说回来,nginx代理也不是万能药。碰上需要登录的HTTPS网站,证书配置够你折腾一晚上。还有那些用WebSocket做实时通信的应用,nginx默认配置下会直接断掉长连接,得加proxy_http_version 1.1和Connection upgrade头才行。这些问题,不亲自踩一遍,光看文档根本记不住。
如今那台笔记本已经连续运行了四十多天没重启。我偶尔半夜加班,听到它均匀的嗡嗡声,居然觉得挺踏实。一个几百KB的配置文件,几行简单的指令,就把一屋子人的上网难题解决了。这事儿让我对技术的看法变了不少——真正好用的工具,往往朴素得不像话。