凌晨三点十七分,网站上线我把最后一版前端代码推送到服务器。网站上线浏览器里那个转了快两小时的网站上线加载圈终于停了,页面弹出来——白底黑字,网站上线干净得有点不像话。网站上线这是网站上线给一个做手工皮具的朋友搭的独立站,从买域名到备案折腾了整整二十三天。网站上线他之前只在朋友圈卖货,网站上线现在总算有个像样的网站上线地方能放作品图了。
上线前我干了件蠢事。网站上线在本地测试时把数据库连接池设成了200,网站上线想着反正就自己用。网站上线结果部署到那台2核4G的网站上线轻量服务器上,刚跑起来就报了内存溢出。网站上线日志里一长串java.lang.OutOfMemoryError,网站上线红色的报错信息刷了满屏。调回20之后,一切正常。这种坑只有真把东西扔到线上才会踩到,本地环境永远给不了你这种教训。
域名解析生效那会儿,我蹲在路由器旁边刷了十几次ping命令。第一次看到返回的IP指向那台广州的机房时,感觉挺奇妙的。一个字符串,经过DNS层层查询,最后落到一块具体的硬盘上。朋友发来微信问“能访问了吗”,我截了张图给他,他回了句“卧槽,真有了”。
但上线只是开始。第二天早上八点,他打电话来说图片全挂了。我打开控制台一看,404铺了一屏。原因很简单——本地开发时图片路径写的是绝对路径/Users/xxx/project/uploads,服务器上根本没这个目录。改成相对路径,重新打包上传,前后不到十分钟。可这十分钟里,他那边已经有三个客户点进来看到了裂图。损失不大,但足够让人记住:线上环境和本地是两码事。
我还给站点加了个简单的访问统计。用的是开源的Umami,部署在同一个服务器上,数据库共用。第一天的数据挺有意思:PV 47,UV 12,平均停留时间1分23秒。最高峰出现在晚上九点到十点之间,朋友后来告诉我,那会儿他刚在朋友圈发了上线通知。有个用户来自加拿大,看了七个页面,最后在“关于”那页停了快四分钟。朋友猜那可能是以前在温哥华认识的老客户。
安全组规则我改了三遍。22端口只允许我的固定IP访问,443开着,80强制跳转HTTPS。SSL证书用的Let's Encrypt,自动续期脚本扔进crontab的时候,我盯着那行0 3 * * *看了半天——又是凌晨三点。好像搞技术的人总跟这个时间过不去。其实没必要,但习惯了。
现在站点跑了一周多,没再出过大问题。朋友每天往上面传两三个新品,我偶尔上去看看日志。昨天发现有个爬虫在扫/wp-login.php,笑了半天——这站压根不是WordPress搭的。顺手把那个路径加进了Nginx的拒绝规则。你看,线上世界就是这样,你刚把门装好,就有人来试锁。
网站上线这件事,说到底是把一个在你自己电脑上跑得好好的东西,扔到一个你控制不了的环境里。网络会抖,硬盘会满,证书会过期,还有人会来乱敲门。但当你看到那个域名真的能打开,看到别人在下面留言说“这个包做得真好看”,那些凌晨三点的调试就都值了。朋友刚才发来消息,说今天有个客户下了单,备注里写“从网站找过来的”。我回了个竖大拇指的表情,然后打开终端,把备份脚本又检查了一遍。