# 简介

# Web 服务器

  • Web 服务器软件有很多种,基本都支持用作静态服务器,但用作动态服务器时,可能只支持部分类型的 Web 应用。
  • Web 服务器软件举例:
    • Apache HTTP Server
      • :简称为 Apache ,采用 C 语言开发,支持 CGI 应用。
    • Nginx
      • :采用 C 语言开发,支持 FastCGI、WSGI 应用。
      • 一般用作静态服务器,处理静态文件的效率高。
    • OpenResty
      • :一个 Nginx 发行版,2009 年由中国工程师章亦春发布。
      • 通过 lua-nginx-module 插入 Lua 代码,方便开发动态服务器,实现复杂的逻辑。
      • 每个 Worker 进程创建一个 Lua JIT VM ,负责执行 Lua 代码。
    • IIS(Internet Information Server)
      • :Windows 系统自带的一个服务器,是闭源软件,采用 C++ 开发。
    • Tomcat
      • :采用 Java 开发,支持 CGI、Java Servlet 应用。
    • Jetty
      • :采用 Java 开发,与 Tomcat 类似。
    • uWSGI
      • :采用 C 语言开发,通过自带的 uwsgi 协议实现了 WSGI 接口。
      • 用 Python 的 Django、Flask 框架开发的 WSGI 应用,可以部署到 uWSGI 服务器上运行。

# 前后端架构

  • 前后端合一

    • :由一台服务器接收 HTTP 请求并返回 HTTP 响应。
    • 结构较简单,但可扩展性较差,适合小型网站。
  • 前后端分离

    • :由前端(front-end)服务器处理客户端的静态请求,遇到动态请求时才转发给后端(back-end)服务器处理。
    • 有利于解耦、分布式集群、提高前端效率、降低后端压力。
    • 前端服务器通常是静态服务器,后端服务器通常是动态服务器。
    • 前端、后端服务器之间通常通过 RESTful API 进行通信。

# 静态服务器

:收到 HTTP 静态请求时能直接拿出静态资源回复,但不能处理 HTTP 动态请求。

  • 主要用途:
    • 独立运行一个静态网站。
    • 在前后端分离架构中,用作前端服务器。

# 静态资源

:不会变化的数据或文件。比如 html 文件、js 文件、css 文件、图片、视频。

# 静态网站

:只能提供静态资源的网站,其显示内容、行为都是预设好的,大多不能变化。

  • 优点:
    • 只负责处理 HTTP 静态请求,因此访问速度比动态网站快很多。
    • 运行开销很小,甚至 GitHub Pages 等平台愿意免费帮用户运行静态网站。
  • 缺点:
    • 与用户的交互性差,不能接收、存储用户的数据。

# 动态服务器

:不止能处理 HTTP 静态请求,还能处理 HTTP 动态请求。

  • 动态服务器上通常需要运行一些程序来处理 HTTP 动态请求,它们被称为 Web 应用、后端程序,可以用 Java、JS、PHP、Python 等语言开发。
    • Web 应用与 Web 服务器的通信接口分为多种类型,比如 CGI、FastCGI 等。

# CGI

:通用网关接口(Common Gateway Interface),一种 Web 服务器与 Web 应用之间的通信协议,工作在应用层。

  • 该协议与编程语言无关,用 C、C++、php、Perl 等语言都可以开发 CGI 程序。
  • 服务器的工作流程:
    1. 服务器收到一个 HTTP 请求。
    2. 服务器创建一个新的 CGI 进程,并将请求的内容写入 stdin 和环境变量。
    3. CGI 进程读取请求的内容,进行处理,将响应写入 stdout ,然后退出进程。
    4. 服务器读取响应,发送给客户端。 每收到一个 HTTP 请求就要重复上述过程,因此并发效率很低。

# FastCGI

:改进了 CGI ,提高了工作效率。

  • 服务器启动时,先创建一个 master 进程,负责解析配置文件、管理全局。再创建多个 worker 进程并保持运行,负责处理 HTTP 请求。

# WSGI

:Web 服务器网关接口(Web Server Gateway Interface),与 CGI 类似。

  • 定义了 server、application 两个角色,server 负责完成 HTTP 通信,application 负责业务逻辑,两者之间解耦。
    • 比如当客户端发来 HTTP request 时,server 会将它解析并传给 application 。application 处理之后会生成 HTTP response 并让 server 发送。
  • 该规范没有明确协议,且与编程语言无关。最初只有 Python 支持 WSGI ,后来 Ruby、Java 等语言也开始支持。

# ASGI

:异步网关协议接口(Asynchronous Server Gateway Interface),为 WSGI 的超集。

  • 支持异步请求。
  • 支持 HTTP/1 、HTTP/2 、WebSocket 协议。