“服务器”说穿了就是一台专门“接单干活”的电脑:别人的电脑发来请求,它按要求找到内容、处理完、再把结果发回去。你刷的每个网页、看的每条视频,背后都有服务器在忙活。

举个完整的例子:你在浏览器里输入一个网址,敲下回车。浏览器先查到这个域名对应的 IP 地址(比如 203.0.113.10),然后向这个地址发去一个 HTTP 请求:“请把首页给我。”千里之外,一台机器上运行的 Web 服务器软件收到这个请求,找到存好的网页文件,在零点几秒内把文件发回来,你的浏览器把它显示出来——网页就打开了。打开一个稍微复杂点的页面,这样的“请求—响应”可能要来回几十次:文字、图片、样式各要一次。

一眼看懂 / 示意图

一台机器里的程序,怎样把网页送回来?

机器里跑着一个专门接请求的程序你的浏览器请求首页服务器机器Web服务器软件找文件 / 转交网站程序网页文件 · 应用 · 数据库请求 →← 结果
  1. 01浏览器请求

    查域名,向服务器请求首页

  2. 02Web服务器软件

    找静态文件,或转交网站程序处理

  3. 03返回网页

    浏览器收到内容后显示

服务器既可以指软件,也常指承载这些软件的机器。

NERSC数据中心的机架背面。
NERSC数据中心的机架背面。服务器可以集中放在机架中;“服务器”描述它提供服务的角色,不限定为某一种外形。
图片来源:Derrick Coetzee from Berkeley, CA, USA · Wikimedia Commons

它到底在“服务”什么

1. “服务器”首先指的是干活的软件。 真正处理请求的是一个程序,比如 Nginx、Apache 这类 Web 服务器软件。它守在机器的“端口”上(HTTP 默认 80 端口,HTTPS 默认 443 端口),收到请求就按规则处理:要静态文件就直接发文件,要动态内容就转给网站程序去现做。

2. 但日常说“服务器”,更多是指跑这些软件的机器。 机房机架上那些一排排的机器是服务器,云厂商租给你的“云服务器”也是服务器——只不过它是虚拟出来的,一台物理机器可以切成好几台虚拟服务器分别出租。所以这个词一身二任:说软件、说机器,都对,要看语境。

3. 服务器不是收到什么就照做的“传声筒”。 它要按规则办事:验证你有没有权限、查数据库取数据、有缓存就直接用缓存、没权限的请求就拒绝。你登录后才能看的订单信息,就是服务器在每次响应前替你核对身份的结果。

4. 域名、机器、网站不是一对一绑死的。 一台机器可以同时托管几百个小网站(靠请求里带的域名区分该给谁);反过来,一个大网站往往由成百上千台机器分担请求,前面还有专门的设备把流量均匀分下去。所以“这个网站的服务器”很可能不是一台,而是一群。

“服务器坏了”,坏的可能是哪一层

客服说“服务器出了问题”,这句话其实很笼统,至少有三层可能:

  • 程序层:Web 服务器软件或网站程序崩溃、卡死,机器明明开着,请求却没人接。
  • 机器层:CPU、内存跑满,硬盘写满,机器本身没坏,但已经忙不过来了。
  • 网络层:机器和程序都好,但中间的网络断了,请求根本送不到。

所以排查故障不能只问“机器开没开机”,要一层一层看:连得上吗?有响应吗?响应的内容对吗?平时说的“服务器运维”,很大一部分工作就是盯住这几层,哪层出问题补哪层。

两个常见误会

误会一:服务器就是特别贵、特别大的机器。 “服务器”描述的是角色——谁在提供服务——不是外形和配置。你自己的电脑装上服务器软件、启动起来,就是一台服务器,程序员日常就是这么在自己机器上调试网站的;只是它一关机,“服务”就停了。机房里的机器只是为这个角色做了优化:性能更强、能长时间不关机、可以塞进机架集中管理。

误会二:一个网站对应一台服务器。 前面说过,一头是一台机器能装下几百个小网站,另一头是一个大网站后面站着成千上万台机器。你在浏览器里看到的是同一个网址,背后的机器数量和分布完全是另一回事,而且会变——访问量大就加机器,小就减,这正是云服务的卖点。