跳转至

15.0 Development

The different hosting options available and high-level pros and cons.

在将 Web 应用程序部署到可供全球访问的 URL 上时,您可以选择多种主机托管方案。

  1. Running your own server (运行自己的服务器):

    • Description: 物理购买一台机器专门运行您的网站。过去成本很高,但现在使用树莓派 (Raspberry Pi) 或类似小型计算机变得更可行。树莓派成本不到 60 美元,性能足以驱动一个小型 Web 服务器。它运行 Linux 变种 (Raspbian),可像普通 Linux 服务器一样配置。初始配置需要键盘和显示器,之后可通过 SSH 访问。
    • Pros: 理论上完全控制。成本相对较低(尤其是树莓派)。
    • Cons: 您需要管理物理基础设施。这台机器需要 24/7 运行,并且可靠性要高,不能运行其他可能导致崩溃的进程。不建议用于除个人爱好服务器以外的用途。
  2. A Linux virtual machine (Linux 虚拟机):

    • Description: 向托管服务商租赁一台虚拟的物理机器。您获得完整的计算机访问权,通常可通过 SSH 访问操作系统。可以在命令行配置和部署应用程序。提供商包括 Amazon, Digital Ocean, A2, Azure, AliBaba 等。
    • Pros: 成本相对便宜,每月约 10 美元即可租赁。您无需担心物理基础设施的管理。公司会保证机器的正常运行(uptime)。
    • Cons: 您仍然需要自己设置和配置整个操作系统环境来运行您的应用程序。
  3. Platform-as-a-Service (PaaS) (平台即服务):

    • Description: 这类服务不提供完整的操作系统访问权限,而是提供一个可以直接运行您的代码或应用程序的环境。它们可能不映射到单一物理机器,而是在提供商的数据中心共享资源。容器 (Containers) 是实现 PaaS 的主要技术,它将应用程序及其所有依赖项打包在一个可移植的“盒子”中,确保在不同环境中一致运行。
    • Pros: 很大程度上无需设置服务器、管理存储和维护基础设施。为您管理服务器机器。容易启动和运行项目,可以直接从 Git 仓库部署代码。
    • Cons: 几乎总是按使用付费,并随运行时间收费。许多有免费或爱好层级,但功能受限或性能较低。可能对支持的操作系统/语言有限制。容器通常没有持久性内存,需要使用第三方云数据库。Docker 和 Heroku 是常见的微托管(micro-hosting)解决方案,提供容器作为服务(software as a service)。Heroku 以易用性著称,可以直接像 Git 仓库一样推送代码进行部署,但声誉是相对较贵,也有免费替代品如 PythonAnywhere。

Containers:

  • 解决了版本控制、包管理和跨平台可靠性问题。
  • 标准化了软件及其所有依赖项,无论在哪里运行都能保持一致。
  • Docker 是一个例子,使用容器镜像 (images) 和 Docker Engine。通过 Dockerfile 脚本来定义容器环境。提供可重复的构建。
  • Heroku 也是一个基于容器的云平台,可以直接从 Git 仓库安装代码和依赖。

The basic steps needed to configure a server (e.g. obtain a Domain Name, SSL certificate, setup logging)

一旦您获得了托管机器,需要进行一些基本配置才能通过互联网访问您的应用程序。

  1. Obtaining a domain name (获取域名):

    • Description: 域名是您网站的 URL 部分 (例如 google.com)。它分为顶级域名 (Top-level domain, TLD),如 .com, .au, .net,和二级域名 (Second-level domain, SLD),如 google, uwa, facebook
    • Process: 域名需要购买(实际上是租用)。成本取决于 TLD,.com 通常最贵。SLD 决定了您的品牌,短且易记的域名更好。您可以在线检查域名可用性。通过与 ICANN 关联的域名注册商 (Domain Registrar) 购买。域名是按年租用的,需要记得续费,否则会失效。
  2. Obtaining an SSL certificate (获取 SSL 证书):

    • Description: SSL 证书用于证明您网站的身份,启用 HTTPS (安全 HTTP) 以加密用户流量。它能防止中间人攻击和身份冒充。
    • Process: 在您的服务器上生成一个公共/私有密钥对。创建一个包含您的公共密钥、域名等信息的证书签名请求 (Certificate Signing Request, CSR)。将 CSR 提交给证书颁发机构 (Certificate Authority, CA),如 Let's Encrypt (免费)。CA 会验证您的信息,然后颁发 SSL 证书。将证书安装到您的服务器上,并配置将所有 HTTP 流量重定向到 HTTPS。这对于处理用户数据至关重要。
  3. Securing your server (保护服务器):

    • Description: 由于服务器是公开可访问的,需要采取措施锁定它。
    • Steps:
      • Remove passwords for login and use key files instead (取消密码登录,改用密钥文件): 使用更安全的公共/私有密钥对进行 SSH 认证,而非密码。
      • Disable root logins (禁用 root 登录): 防止任何人以 root 用户获得服务器的完全控制权。
      • Use a firewall to only accept traffic on specific ports (使用防火墙限制端口): 配置防火墙只允许 SSH (端口 22)、HTTP (端口 80) 和 HTTPS (端口 443) 的流量通过。恶意用户会扫描开放端口寻找漏洞。
      • Route all web requests through HTTPS (通过 HTTPS 路由所有 Web 请求): HTTP 流量以纯文本传输,容易被截获。强制使用 HTTPS 可确保流量加密。
  4. Logging (日志记录):

    • Description: 服务器 24/7 运行,无法持续监控。记录接收的请求和执行的操作非常有价值。
    • Value: 帮助了解用户如何与您的应用程序交互 (需求、高峰时段、受欢迎的功能)。帮助了解应用程序如何受到攻击。Flask 带有内置日志包。
    • Concerns:
      • Log format (日志格式): 机器可读性通常比人类可读性更重要,因为日志数据量巨大。
      • Avoiding sensitive/private information (避免记录敏感/私有信息): 切勿在日志中存储密码等敏感信息,这会绕过数据库的安全措施,也可能违反数据保护法律。
      • Pruning your log files (修剪日志文件): 日志文件增长很快,需要定期清理或归档旧的日志。

How the server and database architecture is structured on a large-scale production server and the purpose of the individual components (e.g. database server, reverse proxy server).

在生产环境中,为了处理大量流量和提高可靠性,应用程序的架构通常会比简单的客户端-单一服务器模型复杂得多。

  1. Client-Server architecture re-cap (客户端-服务器架构回顾):

    • 基本模型是一个服务器服务多个客户端。
  2. Specialised database hardware (专用数据库硬件):

    • 在大型架构中,数据库通常存储在与 Web 服务器不同的专用计算机上。
    • Advantages:
      • 可以通过为数据库优化硬件来提高性能。
      • 允许多个 Web 服务器访问同一个数据库。这为下一步扩展奠定了基础。
  3. Load balancer and multiple servers (负载均衡器和多服务器):

    • 随着应用程序流量增长,单个服务器无法处理所有请求。
    • Description: 使用多个运行完全相同应用程序的服务器。在这些服务器前面设置一个 Load balancer
    • Purpose: 负载均衡器接收来自客户端的请求,并将其分配("farms off")到后面的多个服务器中的一个。
    • Benefits: 显着提高吞吐量,可以处理更多请求。对用户而言,负载均衡器就是服务器,他们无需知道请求被分配到哪个具体服务器。
  4. Reverse-proxy server (反向代理服务器):

    • Description: 如果负载均衡器除了分配请求之外还执行其他任务,它就被称为反向代理服务器。它充当后端实际逻辑服务器的代理。
    • Purpose and additional jobs:
      • Serve static content (服务静态内容): 可以直接处理静态文件请求 (如 CSS, JS, 图片),无需将请求转发给后端服务器。
      • Handle encryption and decryption (处理加密和解密): 负责处理来自客户端的 HTTPS 请求的加密和解密过程。这可以减轻后端服务器的计算负担,有时可以使用专用硬件加速。
      • Filter suspicious traffic and protect against attacks (过滤可疑流量和防御攻击): 作为第一道防线,可以过滤恶意请求,并对 DDoS 攻击提供一定的保护。
  5. Upgrading to production-grade tools (升级到生产级工具):

    • 为了安全性和可伸缩性,开发阶段使用的工具(如 Flask 开发服务器和 SQLite)不适合公开部署。
    • Database: 使用 MySQL (或 PostgreSQL) 代替 SQLite。MySQL 是服务器数据库,可以运行在独立机器上,支持多个 Web 服务器访问,性能更好,并具有内置认证机制。SQLite 是嵌入式数据库,通常存储为本地文件。
    • Web Server: 使用 Gunicorn (或其他 WSGI 服务器) 代替 Flask 开发服务器。Gunicorn 实现了 WSGI 标准,能更高效、安全地处理生产环境的 Web 请求。
    • Reverse Proxy: 使用 Nginx (或其他如 Apache HTTP Server) 作为面向外部的反向代理服务器。Nginx 擅长处理静态文件、SSL 终止(encryption/decryption)和请求路由。

在 Flask 应用程序部署的例子中 (如 Heroku 部署),通常会有一个数据库(可能由服务商提供)在一个单独的地方,一个运行 Gunicorn 的主服务器(起源服务器,origin server)处理应用程序逻辑,以及一个 Nginx 反向代理服务器处理外部流量和静态内容。主服务器和反向代理服务器可能最初部署在同一台物理机器上,但这可以通过简单配置更改来分离到不同机器上以实现更大规模的扩展。

理解这些组件的作用以及它们如何协同工作,对于理解 Web 应用程序在生产环境中的运行至关重要。