打开浏览器输入一个网址,面服几秒内页面就出现在屏幕上。面服这个过程背后跑着一整套协作机制,面服少了任何一环,面服你看到的面服要么是空白,要么是面服报错。
先聊最核心的面服角色——Web服务器。它本质上就是面服一台联网的计算机,上面跑着专门处理HTTP请求的面服软件。Apache、面服Nginx、面服IIS,面服这几个名字做后端的面服人天天见。Nginx这几年势头很猛,面服我身边不少朋友从Apache迁过去之后就再没回头,面服原因也简单:并发量大的时候Nginx吃内存少,扛得住。
请求进来之后服务器怎么处理?拿PHP举例,用户访问一个动态页面,比如商品详情页。Nginx收到请求,发现这是个.php文件,转交给PHP-FPM处理。PHP-FPM执行代码,可能去MySQL里查商品数据,把结果拼成HTML,再原路返回给Nginx,Nginx最后把完整的HTML丢给浏览器。整条链路走完,通常也就几十毫秒。
静态资源走的是另一条路。图片、CSS、JS这些文件不需要后端语言参与,Nginx直接读磁盘返回就行。快得多。所以做性能优化的时候,把静态资源单独拆出来放到CDN上,是常规操作。我见过一个小型电商站,图片全部走CDN之后,首页加载时间从3.2秒降到了1.1秒,用户跳出率跟着掉了一截。
HTTP协议本身也值得说两句。它是无状态的——服务器默认不记得你上一次请求是谁。那怎么维持登录状态?靠Cookie和Session。你登录之后服务器给你发一个Session ID,浏览器存到Cookie里,之后每次请求都带上这个ID,服务器一查就知道你是谁。这套机制用了二十多年,简单有效,虽然偶尔被吐槽安全性问题,但配合HTTPS基本够用。
HTTPS现在几乎是标配了。Let's Encrypt提供免费证书,申请和续期都能自动化,没什么理由还用纯HTTP。Chrome浏览器从2018年开始就把HTTP站点标记为“不安全”,用户看到那个红色警告,信任感直接打对折。
再说说Web服务器和应用服务器有什么区别。很多人把它们混着叫,其实分工不同。Web服务器专注处理HTTP连接、静态文件、反向代理;应用服务器负责跑业务逻辑,比如Java那边的Tomcat、JBoss。当然现在边界越来越模糊,Nginx也能通过FastCGI跟各种语言的后端通信,架构上灵活了很多。
负载均衡是另一个绕不开的话题。单台服务器扛不住流量的时候,前面加一层Nginx做反向代理,把请求分发给后面好几台机器。策略有好几种——轮询、IP哈希、最少连接数。选哪种取决于业务场景。电商大促期间,运维团队基本都在盯着负载均衡的流量分布图,哪台机器压力大了赶紧调整权重。
还有一点容易被忽略:日志。Web服务器的访问日志和错误日志,是排查问题的第一手材料。用户反馈“页面打不开”,你去错误日志里一翻,可能是某个PHP脚本超时了,也可能是数据库连接池满了。没有日志,就是盲人摸象。
整套Web页面服务拆开来看,每个环节都有替代方案,也有各自的坑。选型的时候没有银弹,得看团队熟悉什么、业务量级多大、预算多少。有人用一台2核4G的云服务器跑个人博客,稳得很;也有人管着上百台机器的集群,每天跟监控告警打交道。场景不同,答案就不同。