# 简介
# Web 服务器
- Web 服务器软件有很多种,基本都支持用作静态服务器,但用作动态服务器时,可能只支持部分类型的 Web 应用。
- Web 服务器软件举例:
- Apache HTTP Server
- :简称为 Apache ,采用 C 语言开发,支持 CGI 应用。
- Nginx
- :一个轻量级的 HTTP 服务器,采用 C 语言开发。
- 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 服务器上运行。
- Apache HTTP Server
# 前后端架构
传统的 Web 架构是:前后端合一
- 这是由一台服务器接收 HTTP 请求并返回 HTTP 响应。
- 结构较简单,但可扩展性较差,适合小型网站。
现代流行另一种 Web 架构:前后端分离
- 这是由前端(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 程序。
- 服务器的工作流程:
- 服务器收到一个 HTTP 请求。
- 服务器创建一个新的 CGI 进程,并将请求的内容写入 stdin 和环境变量。
- CGI 进程读取请求的内容,进行处理,将响应写入 stdout ,然后退出进程。
- 服务器读取响应,发送给客户端。 每收到一个 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 协议。
# 相关概念
SSG(Static Site Generator,静态网站生成器)
- 虽然程序员可以手动编写静态网站,但比较麻烦。一般使用 SSG 工具来生成静态网站。
- 例如 Jekyll 就是一个 SSG 工具,可以按照模板生成静态网站。
CMS(Content Management System,内容管理系统)
- 泛指允许用户发布、编辑、管理内容的网站,比如博客、论坛、新闻网站。
- 很多 CMS 只用于发布内容,不需要在线编辑,因此做成了静态网站。但也有很多 CMS 是动态网站。