欢迎光临
我们一直在努力

云计算零基础入门:从概念到实战,新手必看完整指南

文章目录

    • 一、前言
      • 1.1 技术背景
      • 1.2 为什么需要云计算
      • 1.3 本文目标
      • 1.4 技术栈
    • 二、云计算核心概念
      • 2.1 什么是云计算
      • 2.2 云计算的服务模式
        • 2.2.1 IaaS(基础设施即服务)
        • 2.2.2 PaaS(平台即服务)
        • 2.2.3 SaaS(软件即服务)
      • 2.3 云计算的部署模式
        • 2.3.1 公有云(Public Cloud)
        • 2.3.2 私有云(Private Cloud)
        • 2.3.3 混合云(Hybrid Cloud)
      • 2.4 云计算的核心技术
        • 2.4.1 虚拟化技术
        • 2.4.2 容器技术
        • 2.4.3 分布式存储
    • 三、环境准备
      • 3.1 注册云账号
        • 3.1.1 阿里云账号注册
        • 3.1.2 AWS 账号注册(可选)
      • 3.2 安装必要工具
        • 3.2.1 安装 SSH 客户端
        • 3.2.2 安装 FTP 工具(FileZilla)
        • 3.2.3 安装终端工具(可选)
      • 3.3 基础 Linux 命令准备
    • 四、创建第一台云服务器
      • 4.1 阿里云 ECS 创建实战
        • 4.1.1 进入 ECS 控制台
        • 4.1.2 配置实例参数
      • 4.2 连接到云服务器
        • 4.2.1 使用密码登录(Windows + PuTTY)
        • 4.2.2 使用密钥登录(Windows + PuTTY)
        • 4.2.3 使用命令行 SSH 登录(macOS/Linux)
      • 4.3 服务器基础配置
        • 4.3.1 更新系统软件包
        • 4.3.2 创建普通用户(安全建议)
        • 4.3.3 配置防火墙
    • 五、云存储服务实战
      • 5.1 对象存储 OSS 入门
        • 5.1.1 创建 OSS Bucket
        • 5.1.2 使用 OSS 控制台上传文件
        • 5.1.3 使用命令行工具 ossutil
      • 5.2 使用 Python SDK 操作 OSS
        • 5.2.1 安装 SDK
        • 5.2.2 基础操作代码
    • 六、云数据库实战
      • 6.1 创建 RDS MySQL 实例
        • 6.1.1 进入 RDS 控制台
        • 6.1.2 配置实例参数
        • 6.1.3 初始化数据库
      • 6.2 连接和操作数据库
        • 6.2.1 从 ECS 连接 RDS
        • 6.2.2 使用 Python 操作数据库
    • 七、实战项目:部署一个完整的网站
      • 7.1 项目概述
      • 7.2 环境准备
        • 7.2.1 安装 Python 和依赖
        • 7.2.2 安装 Nginx
      • 7.3 开发 Flask 应用
        • 7.3.1 创建项目目录
        • 7.3.2 安装依赖
        • 7.3.3 编写应用代码
      • 7.4 配置 Gunicorn 和 Nginx
        • 7.4.1 创建 Gunicorn 配置文件
        • 7.4.2 创建 Systemd 服务
        • 7.4.3 配置 Nginx
      • 7.5 测试部署结果
    • 八、故障排查与问题解决
      • 8.1 连接问题
        • 问题 1:无法通过 SSH 连接到服务器
        • 问题 2:网站无法访问
      • 8.2 应用问题
        • 问题 3:应用启动失败
        • 问题 4:数据库连接失败
      • 8.3 性能问题
        • 问题 5:网站访问缓慢
      • 8.4 OSS 问题
        • 问题 6:OSS 上传失败
      • 8.5 日志排查技巧
    • 九、总结
      • 9.1 核心知识点回顾
      • 9.2 扩展学习方向
      • 9.3 学习资源

一、前言

1.1 技术背景

想象一下,在没有云计算的时代,如果你想开一家网店,你需要自己购买服务器、安装操作系统、配置网络环境、维护硬件设备……这不仅需要大量的资金投入,还需要专业的技术团队。而有了云计算,你只需要像使用水电一样,按需付费使用计算资源,无需关心底层硬件的维护。

云计算(Cloud Computing) 是一种通过互联网提供计算资源(包括服务器、存储、数据库、网络、软件等)的服务模式。用户无需购买和维护物理硬件,只需通过网络按需获取和使用这些资源。

云计算的发展历程:

  • 2006年:AWS(亚马逊云服务)推出 EC2,标志着现代云计算的诞生
  • 2008年:Google 推出 Google App Engine
  • 2009年:阿里云成立,开启中国云计算市场
  • 2010年:Microsoft Azure 正式发布
  • 2013年至今:容器技术(Docker)、Kubernetes 等云原生技术快速发展

1.2 为什么需要云计算

传统IT架构的痛点:

问题传统方式云计算方式
初期投入 需要购买大量硬件,成本高 按需付费,零硬件投入
扩展性 扩展需要采购新设备,周期长 几分钟内完成资源扩展
维护成本 需要专业运维团队 由云服务商负责维护
资源利用率 平均利用率仅10-20% 按需使用,利用率接近100%
灾备能力 自建灾备中心,成本高昂 云服务商提供多地域备份

云计算的核心优势:

  • 成本节约:将资本支出(CapEx)转化为运营支出(OpEx)
  • 弹性伸缩:根据业务需求快速扩展或缩减资源
  • 高可用性:多地域部署,自动故障切换
  • 全球覆盖:一键部署到全球多个数据中心
  • 专注业务:将精力集中在核心业务,而非基础设施
  • 1.3 本文目标

    通过本教程,你将学到:

    • 理解云计算的核心概念和服务模式
    • 掌握主流云平台(阿里云、AWS)的基本操作
    • 学会创建和管理云服务器(ECS/EC2)
    • 掌握云存储(OSS/S3)的基本使用
    • 了解云数据库的部署和管理
    • 完成一个完整的云上网站部署实战项目

    适合读者:

    • 零基础,对云计算感兴趣的学习者
    • 想要转型云计算领域的开发者
    • 需要了解云计算基础知识的运维人员
    • 希望降低IT成本的中小企业技术人员

    1.4 技术栈

    技术栈:

    • 云平台:阿里云、AWS(亚马逊云)
    • 操作系统:Linux(CentOS/Ubuntu)
    • 容器技术:Docker
    • Web服务器:Nginx
    • 数据库:MySQL
    • 编程语言:Python(用于自动化脚本)
    • 工具:SSH客户端(PuTTY/Xshell)、FTP工具(FileZilla)

    二、云计算核心概念

    2.1 什么是云计算

    通俗解释:

    云计算就像是你租房子住。你不需要自己买地、盖房、装修,只需要按月支付租金,就能拎包入住。当你需要更大的房子时,可以随时换租;当你不需要时,可以随时退租。云计算也是如此,你不需要购买服务器、搭建机房,只需要按需付费使用云服务商提供的计算资源。

    专业定义:

    云计算是一种按使用量付费的模式,这种模式提供可用的、便捷的、按需的网络访问,进入可配置的计算资源共享池(资源包括网络、服务器、存储、应用软件、服务),这些资源能够被快速提供,只需投入很少的管理工作,或与服务供应商进行很少的交互。

    2.2 云计算的服务模式

    云计算有三种主要的服务模式,通常被称为"云服务三层模型":

    #mermaid-svg-9ak25myRhBycedGV{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#ffffff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9ak25myRhBycedGV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9ak25myRhBycedGV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9ak25myRhBycedGV .error-icon{fill:#a44141;}#mermaid-svg-9ak25myRhBycedGV .error-text{fill:#ddd;stroke:#ddd;}#mermaid-svg-9ak25myRhBycedGV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9ak25myRhBycedGV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9ak25myRhBycedGV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9ak25myRhBycedGV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9ak25myRhBycedGV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9ak25myRhBycedGV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9ak25myRhBycedGV .marker{fill:#60a5fa;stroke:#60a5fa;}#mermaid-svg-9ak25myRhBycedGV .marker.cross{stroke:#60a5fa;}#mermaid-svg-9ak25myRhBycedGV svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9ak25myRhBycedGV p{margin:0;}#mermaid-svg-9ak25myRhBycedGV .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#ffffff;}#mermaid-svg-9ak25myRhBycedGV .cluster-label text{fill:#F9FFFE;}#mermaid-svg-9ak25myRhBycedGV .cluster-label span{color:#F9FFFE;}#mermaid-svg-9ak25myRhBycedGV .cluster-label span p{background-color:transparent;}#mermaid-svg-9ak25myRhBycedGV .label text,#mermaid-svg-9ak25myRhBycedGV span{fill:#ffffff;color:#ffffff;}#mermaid-svg-9ak25myRhBycedGV .node rect,#mermaid-svg-9ak25myRhBycedGV .node circle,#mermaid-svg-9ak25myRhBycedGV .node ellipse,#mermaid-svg-9ak25myRhBycedGV .node polygon,#mermaid-svg-9ak25myRhBycedGV .node path{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-9ak25myRhBycedGV .rough-node .label text,#mermaid-svg-9ak25myRhBycedGV .node .label text,#mermaid-svg-9ak25myRhBycedGV .image-shape .label,#mermaid-svg-9ak25myRhBycedGV .icon-shape .label{text-anchor:middle;}#mermaid-svg-9ak25myRhBycedGV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9ak25myRhBycedGV .rough-node .label,#mermaid-svg-9ak25myRhBycedGV .node .label,#mermaid-svg-9ak25myRhBycedGV .image-shape .label,#mermaid-svg-9ak25myRhBycedGV .icon-shape .label{text-align:center;}#mermaid-svg-9ak25myRhBycedGV .node.clickable{cursor:pointer;}#mermaid-svg-9ak25myRhBycedGV .root .anchor path{fill:#60a5fa!important;stroke-width:0;stroke:#60a5fa;}#mermaid-svg-9ak25myRhBycedGV .arrowheadPath{fill:lightgrey;}#mermaid-svg-9ak25myRhBycedGV .edgePath .path{stroke:#60a5fa;stroke-width:2.0px;}#mermaid-svg-9ak25myRhBycedGV .flowchart-link{stroke:#60a5fa;fill:none;}#mermaid-svg-9ak25myRhBycedGV .edgeLabel{background-color:#1e293b;text-align:center;}#mermaid-svg-9ak25myRhBycedGV .edgeLabel p{background-color:#1e293b;}#mermaid-svg-9ak25myRhBycedGV .edgeLabel rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-9ak25myRhBycedGV .labelBkg{background-color:rgba(30, 41, 59, 0.5);}#mermaid-svg-9ak25myRhBycedGV .cluster rect{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-9ak25myRhBycedGV .cluster text{fill:#F9FFFE;}#mermaid-svg-9ak25myRhBycedGV .cluster span{color:#F9FFFE;}#mermaid-svg-9ak25myRhBycedGV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:#1e293b;border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9ak25myRhBycedGV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ffffff;}#mermaid-svg-9ak25myRhBycedGV rect.text{fill:none;stroke-width:0;}#mermaid-svg-9ak25myRhBycedGV .icon-shape,#mermaid-svg-9ak25myRhBycedGV .image-shape{background-color:#1e293b;text-align:center;}#mermaid-svg-9ak25myRhBycedGV .icon-shape p,#mermaid-svg-9ak25myRhBycedGV .image-shape p{background-color:#1e293b;padding:2px;}#mermaid-svg-9ak25myRhBycedGV .icon-shape rect,#mermaid-svg-9ak25myRhBycedGV .image-shape rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-9ak25myRhBycedGV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9ak25myRhBycedGV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9ak25myRhBycedGV :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    用户

    IaaS 基础设施即服务

    PaaS 平台即服务

    SaaS 软件即服务

    管理:操作系统中间件运行时数据应用程序

    云服务商管理:虚拟化服务器存储网络

    管理:应用程序数据

    云服务商管理:运行时中间件操作系统虚拟化服务器存储网络

    管理:无

    云服务商管理:全部

    2.2.1 IaaS(基础设施即服务)

    概念: IaaS 提供最基础的计算资源,包括服务器、存储、网络等基础设施。用户可以在这些基础设施上部署和运行任意软件。

    类比: 就像你租了一个毛坯房,云服务商提供房子(服务器)、水电(网络)、地基(存储),你需要自己装修(安装操作系统)、布置家具(部署应用)。

    典型产品:

    • 阿里云 ECS(弹性计算服务)
    • AWS EC2(弹性计算云)
    • 腾讯云 CVM(云服务器)
    • Azure Virtual Machines

    适用场景:

    • 需要完全控制底层基础设施
    • 有特殊的系统配置需求
    • 需要运行自定义的应用程序
    2.2.2 PaaS(平台即服务)

    概念: PaaS 在 IaaS 的基础上,额外提供了开发、运行和管理应用程序的平台环境,包括操作系统、数据库、开发工具等。

    类比: 就像你租了一个精装修的房子,云服务商不仅提供基础设施,还提供家具、家电(开发环境、数据库),你只需要拎包入住(部署应用代码)。

    典型产品:

    • 阿里云 EDAS(企业级分布式应用服务)
    • AWS Elastic Beanstalk
    • Google App Engine
    • Heroku

    适用场景:

    • 专注于应用开发,不想管理基础设施
    • 需要快速开发和部署应用
    • 团队协作开发
    2.2.3 SaaS(软件即服务)

    概念: SaaS 直接提供完整的软件应用,用户只需通过浏览器或客户端使用,无需关心底层的技术实现。

    类比: 就像你住酒店,所有设施一应俱全,你只需要享受服务,完全不需要关心房子是怎么建的、水电是怎么通的。

    典型产品:

    • 钉钉、企业微信(办公协作)
    • Salesforce(CRM)
    • Office 365、Google Docs(办公软件)
    • 阿里云邮箱

    适用场景:

    • 需要快速使用成熟的软件功能
    • 不想投入开发和维护成本
    • 标准化业务流程

    2.3 云计算的部署模式

    #mermaid-svg-zqEAbqYgk1U9DW7S{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#ffffff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zqEAbqYgk1U9DW7S .error-icon{fill:#a44141;}#mermaid-svg-zqEAbqYgk1U9DW7S .error-text{fill:#ddd;stroke:#ddd;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zqEAbqYgk1U9DW7S .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zqEAbqYgk1U9DW7S .marker{fill:#60a5fa;stroke:#60a5fa;}#mermaid-svg-zqEAbqYgk1U9DW7S .marker.cross{stroke:#60a5fa;}#mermaid-svg-zqEAbqYgk1U9DW7S svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zqEAbqYgk1U9DW7S p{margin:0;}#mermaid-svg-zqEAbqYgk1U9DW7S .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#ffffff;}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster-label text{fill:#F9FFFE;}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster-label span{color:#F9FFFE;}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster-label span p{background-color:transparent;}#mermaid-svg-zqEAbqYgk1U9DW7S .label text,#mermaid-svg-zqEAbqYgk1U9DW7S span{fill:#ffffff;color:#ffffff;}#mermaid-svg-zqEAbqYgk1U9DW7S .node rect,#mermaid-svg-zqEAbqYgk1U9DW7S .node circle,#mermaid-svg-zqEAbqYgk1U9DW7S .node ellipse,#mermaid-svg-zqEAbqYgk1U9DW7S .node polygon,#mermaid-svg-zqEAbqYgk1U9DW7S .node path{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-zqEAbqYgk1U9DW7S .rough-node .label text,#mermaid-svg-zqEAbqYgk1U9DW7S .node .label text,#mermaid-svg-zqEAbqYgk1U9DW7S .image-shape .label,#mermaid-svg-zqEAbqYgk1U9DW7S .icon-shape .label{text-anchor:middle;}#mermaid-svg-zqEAbqYgk1U9DW7S .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zqEAbqYgk1U9DW7S .rough-node .label,#mermaid-svg-zqEAbqYgk1U9DW7S .node .label,#mermaid-svg-zqEAbqYgk1U9DW7S .image-shape .label,#mermaid-svg-zqEAbqYgk1U9DW7S .icon-shape .label{text-align:center;}#mermaid-svg-zqEAbqYgk1U9DW7S .node.clickable{cursor:pointer;}#mermaid-svg-zqEAbqYgk1U9DW7S .root .anchor path{fill:#60a5fa!important;stroke-width:0;stroke:#60a5fa;}#mermaid-svg-zqEAbqYgk1U9DW7S .arrowheadPath{fill:lightgrey;}#mermaid-svg-zqEAbqYgk1U9DW7S .edgePath .path{stroke:#60a5fa;stroke-width:2.0px;}#mermaid-svg-zqEAbqYgk1U9DW7S .flowchart-link{stroke:#60a5fa;fill:none;}#mermaid-svg-zqEAbqYgk1U9DW7S .edgeLabel{background-color:#1e293b;text-align:center;}#mermaid-svg-zqEAbqYgk1U9DW7S .edgeLabel p{background-color:#1e293b;}#mermaid-svg-zqEAbqYgk1U9DW7S .edgeLabel rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-zqEAbqYgk1U9DW7S .labelBkg{background-color:rgba(30, 41, 59, 0.5);}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster rect{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster text{fill:#F9FFFE;}#mermaid-svg-zqEAbqYgk1U9DW7S .cluster span{color:#F9FFFE;}#mermaid-svg-zqEAbqYgk1U9DW7S div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:#1e293b;border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zqEAbqYgk1U9DW7S .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ffffff;}#mermaid-svg-zqEAbqYgk1U9DW7S rect.text{fill:none;stroke-width:0;}#mermaid-svg-zqEAbqYgk1U9DW7S .icon-shape,#mermaid-svg-zqEAbqYgk1U9DW7S .image-shape{background-color:#1e293b;text-align:center;}#mermaid-svg-zqEAbqYgk1U9DW7S .icon-shape p,#mermaid-svg-zqEAbqYgk1U9DW7S .image-shape p{background-color:#1e293b;padding:2px;}#mermaid-svg-zqEAbqYgk1U9DW7S .icon-shape rect,#mermaid-svg-zqEAbqYgk1U9DW7S .image-shape rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-zqEAbqYgk1U9DW7S .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zqEAbqYgk1U9DW7S .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zqEAbqYgk1U9DW7S :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    云计算部署模式

    公有云

    私有云

    混合云

    社区云

    多租户共享成本低弹性好阿里云/AWS

    单租户独占安全性高可控性强OpenStack

    公私结合灵活部署数据隔离敏感数据私有一般业务公有

    特定社区共享共同需求政府/金融/医疗

    2.3.1 公有云(Public Cloud)

    定义: 由第三方云服务商拥有和运营,通过互联网向公众提供计算资源。多个用户(租户)共享云服务商的基础设施,但相互隔离。

    特点:

    • 成本低:无需购买硬件,按需付费
    • 弹性好:可快速扩展或缩减资源
    • 维护简单:由云服务商负责基础设施维护
    • 全球覆盖:可选择全球多个数据中心

    代表厂商: 阿里云、AWS、Azure、Google Cloud、腾讯云、华为云

    适用场景:

    • 初创企业和中小企业
    • 业务波动大的应用
    • 需要快速上线的项目
    • 开发和测试环境
    2.3.2 私有云(Private Cloud)

    定义: 由单个组织独占使用的云计算环境,可以部署在企业内部数据中心,也可以由第三方托管。

    特点:

    • 安全性高:数据完全由自己掌控
    • 可控性强:可完全自定义配置
    • 合规性好:满足特定行业的合规要求
    • 成本较高:需要投入硬件和运维成本

    代表产品: VMware vSphere、OpenStack、华为 FusionCloud

    适用场景:

    • 对数据安全要求极高的行业(金融、政府、医疗)
    • 已有大量硬件投资的企业
    • 需要满足特定合规要求的业务
    2.3.3 混合云(Hybrid Cloud)

    定义: 将公有云和私有云结合起来,实现数据和应用程序在两种环境之间的流动和共享。

    特点:

    • 灵活部署:根据业务需求选择部署位置
    • 数据隔离:敏感数据放在私有云,一般业务放在公有云
    • 成本优化:充分利用两种模式的优势
    • 复杂度高:需要解决网络连通和数据同步问题

    适用场景:

    • 业务既有敏感数据又有普通业务
    • 需要应对业务高峰(公有云扩展)
    • 灾难恢复和备份

    2.4 云计算的核心技术

    2.4.1 虚拟化技术

    概念: 虚拟化是将物理计算资源(CPU、内存、存储、网络)抽象成逻辑资源的技术。通过虚拟化,一台物理服务器可以运行多个相互隔离的虚拟机(VM)。

    类比: 就像一栋大楼(物理服务器)被分割成多个独立的公寓(虚拟机),每个公寓都有自己的门牌号(IP地址)、水电表(资源配额),住户之间互不干扰。

    主要类型:

  • 服务器虚拟化:将物理服务器虚拟成多个虚拟机

    • 代表产品:VMware vSphere、KVM、Xen、Hyper-V
  • 存储虚拟化:将多个物理存储设备整合成统一的存储池

    • 代表产品:Ceph、SAN、NAS
  • 网络虚拟化:将物理网络资源抽象成虚拟网络

    • 代表产品:SDN(软件定义网络)、VPC(虚拟私有云)
  • 2.4.2 容器技术

    概念: 容器是一种轻量级的虚拟化技术,它将应用程序及其依赖打包成一个独立的运行单元。与虚拟机不同,容器共享宿主机的操作系统内核,因此更加轻量、启动更快。

    类比: 如果说虚拟机是独立的公寓,那么容器就像是公寓里的一个个收纳箱。收纳箱(容器)共享公寓(宿主机)的空间,但每个收纳箱里的物品(应用)是独立的。

    Docker 容器 vs 虚拟机:

    特性虚拟机(VM)容器(Container)
    启动时间 分钟级 秒级
    资源占用 占用整个操作系统 共享宿主机内核
    镜像大小 GB级 MB级
    性能 有虚拟化开销 接近原生性能
    隔离性 强隔离 进程级隔离
    适用场景 运行不同操作系统 微服务、快速部署

    代表产品: Docker、containerd、Podman

    2.4.3 分布式存储

    概念: 分布式存储是将数据分散存储在多台独立的设备上,通过网络提供统一的存储服务。它具有高可靠性、高扩展性和高性能的特点。

    核心特性:

    • 数据冗余:通过副本或纠删码保证数据可靠性
    • 水平扩展:可通过增加节点来扩展存储容量
    • 自动故障恢复:节点故障时自动迁移数据

    代表产品:

    • 对象存储:阿里云 OSS、AWS S3、Ceph
    • 分布式文件系统:HDFS、GlusterFS
    • 分布式数据库:TiDB、MongoDB、Cassandra

    三、环境准备

    3.1 注册云账号

    3.1.1 阿里云账号注册

    步骤 1:访问阿里云官网

  • 打开浏览器,访问 https://www.aliyun.com
  • 点击右上角的"免费注册"按钮
  • 步骤 2:填写注册信息

  • 选择注册方式(手机号或邮箱)
  • 输入手机号/邮箱,获取验证码
  • 设置登录密码
  • 阅读并同意服务协议
  • 点击"注册"完成账号创建
  • 步骤 3:实名认证

    💡 提示:使用云服务必须进行实名认证,这是国家法规要求。

  • 登录阿里云控制台
  • 点击右上角头像,选择"实名认证"
  • 选择认证类型(个人/企业)
  • 按照提示完成认证流程
  • 步骤 4:领取免费试用资源

  • 进入阿里云"免费试用"页面
  • 新用户可领取以下免费资源:
    • ECS 云服务器:1核2G,免费使用 1-3 个月
    • OSS 对象存储:5GB 存储空间,免费使用 1 年
    • RDS 数据库:基础版免费试用
  • 3.1.2 AWS 账号注册(可选)

    步骤 1:访问 AWS 官网

  • 打开浏览器,访问 https://aws.amazon.com
  • 点击"创建 AWS 账户"
  • 步骤 2:填写注册信息

  • 输入邮箱地址和密码
  • 填写联系人信息
  • 输入信用卡信息(用于验证身份,基本使用不会产生费用)
  • 完成手机验证
  • 步骤 3:选择支持计划

  • 选择"Basic(免费)"支持计划
  • 完成注册
  • 步骤 4:了解免费套餐 AWS 免费套餐包含:

    • EC2:750 小时/月的 t2.micro 实例(1 年)
    • S3:5GB 标准存储(1 年)
    • RDS:750 小时/月的 db.t2.micro 实例(1 年)

    3.2 安装必要工具

    3.2.1 安装 SSH 客户端

    SSH(Secure Shell)是一种网络协议,用于安全地远程登录到服务器。

    Windows 系统:

    方案 1:安装 PuTTY(推荐新手)

  • 访问 https://www.putty.org
  • 下载 PuTTY 安装程序(putty-64bit-0.xx-installer.msi)
  • 双击安装,按照向导完成安装
  • 安装完成后,在开始菜单中找到 PuTTY
  • 方案 2:使用 Windows 内置 OpenSSH(Windows 10/11)

    # 检查是否已安装
    ssh V

    # 如果未安装,以管理员身份运行 PowerShell,执行:
    Add-WindowsCapability Online Name OpenSSH.Client~~~~0.0.1.0

    macOS 系统: macOS 自带 OpenSSH,无需额外安装。

    Linux 系统: 大多数 Linux 发行版都自带 OpenSSH。

    3.2.2 安装 FTP 工具(FileZilla)

    FileZilla 是一款免费的 FTP/SFTP 客户端,用于文件传输。

    Windows/macOS/Linux:

  • 访问 https://filezilla-project.org
  • 下载 FileZilla Client
  • 按照安装向导完成安装
  • 3.2.3 安装终端工具(可选)

    Windows 推荐:

    • Windows Terminal:微软官方终端,支持多标签页
      • 从 Microsoft Store 搜索安装
    • Xshell:专业 SSH 客户端(商业软件,有免费版)

    macOS 推荐:

    • iTerm2:功能强大的终端替代品
      • 下载地址:https://iterm2.com

    3.3 基础 Linux 命令准备

    云服务器通常运行 Linux 系统,掌握以下基础命令非常重要:

    # 文件和目录操作
    ls # 列出目录内容
    ls -la # 列出所有文件(包括隐藏文件)
    cd /path # 切换目录
    cd .. # 返回上级目录
    pwd # 显示当前目录路径
    mkdir dirname # 创建目录
    rm filename # 删除文件
    rm -r dirname # 删除目录及其内容
    cp src dst # 复制文件
    mv src dst # 移动/重命名文件

    # 文件查看和编辑
    cat filename # 查看文件内容
    less filename # 分页查看文件内容
    head -n 10 filename # 查看文件前10行
    tail -n 10 filename # 查看文件后10行
    tail -f filename # 实时查看文件更新(常用于看日志)
    nano filename # 使用 nano 编辑器编辑文件
    vim filename # 使用 vim 编辑器编辑文件

    # 系统管理
    ps aux # 查看所有进程
    top # 实时显示进程状态
    df -h # 查看磁盘使用情况
    free -h # 查看内存使用情况
    uptime # 查看系统运行时间

    # 网络相关
    ping hostname # 测试网络连通性
    netstat -tlnp # 查看端口监听情况
    curl url # 发送 HTTP 请求
    wget url # 下载文件

    # 权限管理
    chmod 755 file # 修改文件权限
    chown user:group file # 修改文件所有者

    # 压缩和解压
    tar -czvf archive.tar.gz dirname # 压缩目录
    tar -xzvf archive.tar.gz # 解压文件


    四、创建第一台云服务器

    4.1 阿里云 ECS 创建实战

    4.1.1 进入 ECS 控制台
  • 登录阿里云控制台:https://ecs.console.aliyun.com
  • 在左侧导航栏选择"实例与镜像" > “实例”
  • 点击"创建实例"按钮
  • 4.1.2 配置实例参数

    步骤 1:选择付费模式

    • 包年包月:适合长期稳定运行的业务,价格更优惠
    • 按量付费:按实际使用时间计费,适合短期或测试用途
    • 抢占式实例:价格更低,但可能被回收,适合可中断的任务

    💡 建议:新手选择"按量付费",便于学习和测试。

    步骤 2:选择地域和可用区

    • 地域:选择离你用户最近的地域,可降低网络延迟
      • 中国大陆用户:选择"华东 1(杭州)“或"华北 2(北京)”
      • 海外用户:选择对应区域(如美国、新加坡)
    • 可用区:同一地域内的不同数据中心,选择默认即可

    步骤 3:选择实例规格

    实例规格决定了 CPU、内存等计算资源。

    场景推荐规格配置适用
    学习测试 共享型 n4 1核2G 个人学习、小型网站
    小型网站 突发性能 t6 2核4G 个人博客、企业官网
    中型应用 计算型 c6 4核8G 电商平台、中型网站
    大型应用 通用型 g6 8核16G 高并发应用、大数据

    💡 建议:新手选择"共享型 n4"或"突发性能 t6",1核2G 配置即可。

    步骤 4:选择镜像

    镜像是服务器的操作系统模板。

    公共镜像(推荐新手):

    • CentOS:企业级 Linux,稳定可靠,适合生产环境
      • 推荐版本:CentOS 7.9
    • Ubuntu:社区活跃,软件丰富,适合开发环境
      • 推荐版本:Ubuntu 20.04 LTS
    • Alibaba Cloud Linux:阿里云优化版 Linux
      • 与 CentOS 兼容,性能更好

    市场镜像: 包含预装软件的环境,如 WordPress、LAMP、Node.js 等。

    💡 建议:新手选择"CentOS 7.9"或"Ubuntu 20.04"。

    步骤 5:配置存储

    • 系统盘:默认 40GB,选择 SSD 云盘(性能更好)
    • 数据盘:可选,用于存储数据,建议 40-100GB

    步骤 6:配置网络和安全组

    网络:

    • 选择默认 VPC 和交换机即可

    安全组: 安全组是虚拟防火墙,控制入站和出站流量。

    需要开放的端口:

    端口用途授权对象
    22 SSH 远程连接 你的 IP 地址
    80 HTTP 网站访问 0.0.0.0/0(所有人)
    443 HTTPS 网站访问 0.0.0.0/0(所有人)
    3389 Windows 远程桌面 你的 IP 地址

    ⚠️ 注意:为了安全,SSH(22端口)建议只开放给你的 IP 地址。

    步骤 7:设置登录凭证

    方式 1:密钥对(推荐,更安全)

  • 选择"密钥对"认证方式
  • 如果没有密钥对,点击"创建密钥对"
  • 输入密钥对名称,选择资源组
  • 点击"确定",浏览器会自动下载私钥文件(.pem)
  • 务必妥善保存私钥文件,丢失后无法找回!
  • 方式 2:密码

  • 选择"自定义密码"
  • 设置登录密码(8-30位,包含大小写字母、数字、特殊字符)
  • 确认密码
  • 步骤 8:确认配置并创建

  • 查看配置清单,确认无误
  • 勾选服务协议
  • 点击"创建实例"
  • 等待实例创建完成(约 1-2 分钟)
  • 4.2 连接到云服务器

    4.2.1 使用密码登录(Windows + PuTTY)

    步骤 1:获取公网 IP

  • 在 ECS 控制台实例列表中,找到刚创建的实例
  • 复制"公网 IP"地址
  • 步骤 2:使用 PuTTY 连接

  • 打开 PuTTY
  • 在"Host Name"中输入:root@你的公网IP
  • 端口保持默认 22
  • 点击"Open"
  • 首次连接会提示安全警告,点击"是"
  • 输入密码(输入时不显示字符)
  • 登录成功后,显示命令提示符:[root@xxx ~]#
  • 4.2.2 使用密钥登录(Windows + PuTTY)

    步骤 1:转换密钥格式 PuTTY 需要使用 .ppk 格式的密钥,需要将下载的 .pem 文件转换。

  • 打开 PuTTYgen(随 PuTTY 安装)
  • 点击"Load",选择下载的 .pem 文件
  • 点击"Save private key",保存为 .ppk 文件
  • 步骤 2:配置 PuTTY

  • 打开 PuTTY
  • 输入 Host Name:root@你的公网IP
  • 在左侧导航选择:Connection > SSH > Auth
  • 点击"Browse",选择 .ppk 文件
  • 返回 Session,点击"Open"
  • 首次连接点击"是",自动登录成功
  • 4.2.3 使用命令行 SSH 登录(macOS/Linux)

    密码登录:

    ssh root@你的公网IP
    # 输入密码

    密钥登录:

    # 修改密钥文件权限(重要!)
    chmod 400 /path/to/your-key.pem

    # 使用密钥连接
    ssh -i /path/to/your-key.pem root@你的公网IP

    4.3 服务器基础配置

    4.3.1 更新系统软件包

    CentOS:

    # 更新所有软件包
    yum update -y

    # 安装常用工具
    yum install -y wget curl vim net-tools

    Ubuntu:

    # 更新软件包列表
    apt update

    # 升级所有软件包
    apt upgrade -y

    # 安装常用工具
    apt install -y wget curl vim net-tools

    4.3.2 创建普通用户(安全建议)

    为了安全,建议创建一个普通用户用于日常操作,避免直接使用 root。

    # 创建新用户(以用户名 'admin' 为例)
    useradd -m -s /bin/bash admin

    # 设置密码
    passwd admin
    # 输入两次密码

    # 将用户添加到 sudo 组(CentOS)
    usermod -aG wheel admin

    # 将用户添加到 sudo 组(Ubuntu)
    usermod -aG sudo admin

    以后可以使用 admin 用户登录,需要 root 权限时加 sudo:

    sudo yum install xxx

    4.3.3 配置防火墙

    CentOS 7+(使用 firewalld):

    # 启动防火墙
    systemctl start firewalld
    systemctl enable firewalld

    # 开放 80 端口(HTTP)
    firewall-cmd –permanent –add-port=80/tcp

    # 开放 443 端口(HTTPS)
    firewall-cmd –permanent –add-port=443/tcp

    # 重新加载防火墙配置
    firewall-cmd –reload

    # 查看已开放的端口
    firewall-cmd –list-ports

    Ubuntu(使用 ufw):

    # 启用防火墙
    ufw enable

    # 开放 80 端口
    ufw allow 80/tcp

    # 开放 443 端口
    ufw allow 443/tcp

    # 查看防火墙状态
    ufw status


    五、云存储服务实战

    5.1 对象存储 OSS 入门

    对象存储(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存储图片、视频、文档等非结构化数据。

    5.1.1 创建 OSS Bucket

    步骤 1:进入 OSS 控制台

  • 登录阿里云控制台
  • 搜索并进入"对象存储 OSS"
  • 点击"Bucket 列表"
  • 点击"创建 Bucket"
  • 步骤 2:配置 Bucket 参数

    Bucket 名称:

    • 全局唯一,不能重复
    • 只能包含小写字母、数字、短横线
    • 例如:my-first-bucket-2024

    地域:

    • 选择与 ECS 相同的地域,内网传输免费

    存储类型:

    • 标准存储:频繁访问的数据,访问延迟低
    • 低频访问:月均访问 1-2 次的数据,存储成本更低
    • 归档存储:很少访问的数据,成本最低,解冻需要时间

    读写权限:

    • 私有:只有授权用户才能访问(推荐)
    • 公共读:所有人可读,适合静态网站托管
    • 公共读写:所有人可读写(不推荐,有安全风险)

    步骤 3:完成创建 点击"确定",等待 Bucket 创建完成。

    5.1.2 使用 OSS 控制台上传文件
  • 在 Bucket 列表中,点击 Bucket 名称进入
  • 点击"文件管理"
  • 点击"上传文件"
  • 选择本地文件,点击"上传"
  • 上传完成后,可以在文件列表中看到文件
  • 5.1.3 使用命令行工具 ossutil

    步骤 1:下载并安装 ossutil

    Linux/macOS:

    # 下载 ossutil
    curl -o ossutil http://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64

    # 添加执行权限
    chmod +x ossutil

    # 移动到系统路径
    mv ossutil /usr/local/bin/

    Windows:

  • 下载地址:https://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64.zip
  • 解压到任意目录
  • 将目录添加到系统 PATH 环境变量
  • 步骤 2:配置 ossutil

    # 运行配置命令
    ossutil config

    # 按照提示输入:
    # – Endpoint:oss-cn-hangzhou.aliyuncs.com(根据你的地域修改)
    # – AccessKey ID:你的 AccessKey ID
    # – AccessKey Secret:你的 AccessKey Secret

    💡 提示:AccessKey 在阿里云控制台"AccessKey 管理"中创建。

    步骤 3:常用命令

    # 查看 Bucket 列表
    ossutil ls

    # 查看 Bucket 中的文件
    ossutil ls oss://your-bucket-name

    # 上传文件
    ossutil cp localfile.txt oss://your-bucket-name/

    # 上传目录
    ossutil cp -r localdir/ oss://your-bucket-name/remotedir/

    # 下载文件
    ossutil cp oss://your-bucket-name/remotefile.txt ./

    # 删除文件
    ossutil rm oss://your-bucket-name/file.txt

    # 同步本地目录到 OSS(增量同步)
    ossutil sync localdir/ oss://your-bucket-name/remotedir/

    5.2 使用 Python SDK 操作 OSS

    5.2.1 安装 SDK

    pip install oss2

    5.2.2 基础操作代码

    # -*- coding: utf-8 -*-
    """
    阿里云 OSS 操作示例
    功能:上传、下载、列举、删除文件
    """

    import oss2
    import os
    from typing import Optional, List

    class OSSClient:
    """
    阿里云 OSS 客户端封装类

    功能:
    – 文件上传、下载
    – 文件列举、删除
    – 生成临时访问链接
    """

    def __init__(self, access_key_id: str, access_key_secret: str,
    endpoint: str, bucket_name: str):
    """
    初始化 OSS 客户端

    Args:
    access_key_id: 阿里云 AccessKey ID
    access_key_secret: 阿里云 AccessKey Secret
    endpoint: OSS 服务端点,如 oss-cn-hangzhou.aliyuncs.com
    bucket_name: Bucket 名称
    """
    # 创建认证对象
    self.auth = oss2.Auth(access_key_id, access_key_secret)

    # 创建 Bucket 对象
    self.bucket = oss2.Bucket(self.auth, endpoint, bucket_name)

    print(f"OSS 客户端初始化成功,Bucket: {bucket_name}")

    def upload_file(self, local_path: str, remote_path: str) > bool:
    """
    上传文件到 OSS

    Args:
    local_path: 本地文件路径
    remote_path: OSS 中的目标路径

    Returns:
    上传成功返回 True,失败返回 False
    """
    try:
    # 检查本地文件是否存在
    if not os.path.exists(local_path):
    print(f"错误:本地文件不存在 {local_path}")
    return False

    # 上传文件
    print(f"正在上传: {local_path} -> {remote_path}")
    self.bucket.put_object_from_file(remote_path, local_path)

    print(f"上传成功: {remote_path}")
    return True

    except oss2.exceptions.OssError as e:
    print(f"上传失败: {e}")
    return False

    def download_file(self, remote_path: str, local_path: str) > bool:
    """
    从 OSS 下载文件

    Args:
    remote_path: OSS 中的文件路径
    local_path: 本地保存路径

    Returns:
    下载成功返回 True,失败返回 False
    """
    try:
    print(f"正在下载: {remote_path} -> {local_path}")
    self.bucket.get_object_to_file(remote_path, local_path)

    print(f"下载成功: {local_path}")
    return True

    except oss2.exceptions.NoSuchKey:
    print(f"错误:OSS 中不存在文件 {remote_path}")
    return False

    except oss2.exceptions.OssError as e:
    print(f"下载失败: {e}")
    return False

    def list_files(self, prefix: str = '', max_keys: int = 100) > List[str]:
    """
    列举 OSS 中的文件

    Args:
    prefix: 文件名前缀,用于筛选
    max_keys: 最多返回的文件数量

    Returns:
    文件名列表
    """
    try:
    file_list = []

    # 列举文件
    for obj in oss2.ObjectIterator(self.bucket, prefix=prefix, max_keys=max_keys):
    file_list.append(obj.key)
    print(f" – {obj.key} (大小: {obj.size} bytes, 修改时间: {obj.last_modified})")

    print(f"共找到 {len(file_list)} 个文件")
    return file_list

    except oss2.exceptions.OssError as e:
    print(f"列举文件失败: {e}")
    return []

    def delete_file(self, remote_path: str) > bool:
    """
    删除 OSS 中的文件

    Args:
    remote_path: 要删除的文件路径

    Returns:
    删除成功返回 True,失败返回 False
    """
    try:
    print(f"正在删除: {remote_path}")
    self.bucket.delete_object(remote_path)

    print(f"删除成功: {remote_path}")
    return True

    except oss2.exceptions.OssError as e:
    print(f"删除失败: {e}")
    return False

    def generate_url(self, remote_path: str, expire: int = 3600) > Optional[str]:
    """
    生成临时访问链接(用于私有 Bucket)

    Args:
    remote_path: 文件路径
    expire: 链接有效期(秒),默认 1 小时

    Returns:
    临时访问链接,失败返回 None
    """
    try:
    url = self.bucket.sign_url('GET', remote_path, expire)
    print(f"生成临时链接(有效期 {expire} 秒): {url}")
    return url

    except oss2.exceptions.OssError as e:
    print(f"生成链接失败: {e}")
    return None

    # 使用示例
    if __name__ == "__main__":
    # 配置信息(请替换为你的实际配置)
    ACCESS_KEY_ID = 'your-access-key-id'
    ACCESS_KEY_SECRET = 'your-access-key-secret'
    ENDPOINT = 'oss-cn-hangzhou.aliyuncs.com' # 根据你的地域修改
    BUCKET_NAME = 'your-bucket-name'

    # 创建客户端
    client = OSSClient(ACCESS_KEY_ID, ACCESS_KEY_SECRET, ENDPOINT, BUCKET_NAME)

    # 上传文件示例
    # client.upload_file('local_test.txt', 'uploads/test.txt')

    # 列举文件示例
    # client.list_files()

    # 下载文件示例
    # client.download_file('uploads/test.txt', 'downloaded_test.txt')

    # 生成临时链接示例
    # client.generate_url('uploads/test.txt', expire=3600)

    # 删除文件示例
    # client.delete_file('uploads/test.txt')


    六、云数据库实战

    6.1 创建 RDS MySQL 实例

    6.1.1 进入 RDS 控制台
  • 登录阿里云控制台
  • 搜索并进入"云数据库 RDS"
  • 点击"创建实例"
  • 6.1.2 配置实例参数

    选择数据库类型:

    • MySQL:最流行的开源数据库,适合大多数场景
    • PostgreSQL:功能强大的开源数据库,支持复杂查询
    • SQL Server:微软数据库,适合 .NET 应用
    • Redis:内存数据库,适合缓存场景

    💡 建议:新手选择 MySQL 5.7 或 8.0。

    选择实例规格:

    场景规格配置
    学习测试 共享型 1核1G
    小型网站 通用型 2核4G
    中型应用 通用型 4核8G

    选择存储:

    • 存储类型:SSD 云盘(性能更好)
    • 存储空间:根据需求选择,最小 20GB

    配置网络:

    • VPC:选择与 ECS 相同的 VPC,内网访问免费且更快
    • 交换机:选择可用区对应的交换机
    6.1.3 初始化数据库

    步骤 1:设置管理员密码

  • 实例创建完成后,在实例列表点击"管理"
  • 点击"账号管理"
  • 创建高权限账号,设置密码
  • 步骤 2:创建数据库

  • 点击"数据库管理"
  • 点击"创建数据库"
  • 输入数据库名称,选择字符集(推荐 utf8mb4)
  • 授权账号访问该数据库
  • 步骤 3:配置白名单

  • 点击"数据安全性"
  • 点击"白名单设置"
  • 修改默认白名单组,添加允许访问的 IP
    • 添加 ECS 的私网 IP:允许 ECS 内网访问
    • 添加 0.0.0.0/0:允许所有 IP 访问(不推荐,有安全风险)
  • 6.2 连接和操作数据库

    6.2.1 从 ECS 连接 RDS

    步骤 1:在 ECS 上安装 MySQL 客户端

    CentOS:

    yum install -y mysql

    Ubuntu:

    apt install -y mysql-client

    步骤 2:连接数据库

    # 使用内网地址连接(推荐,更快且免费)
    mysql -h rm-xxx.mysql.rds.aliyuncs.com -u username -p

    # 输入密码后进入 MySQL 命令行

    步骤 3:基础 SQL 操作

    — 查看所有数据库
    SHOW DATABASES;

    — 使用指定数据库
    USE database_name;

    — 查看所有表
    SHOW TABLES;

    — 创建表
    CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    );

    — 插入数据
    INSERT INTO users (username, email) VALUES ('张三', 'zhangsan@example.com');

    — 查询数据
    SELECT * FROM users;

    — 退出
    EXIT;

    6.2.2 使用 Python 操作数据库

    # -*- coding: utf-8 -*-
    """
    RDS MySQL 操作示例
    功能:连接数据库、增删改查操作
    """

    import pymysql
    from typing import List, Dict, Optional
    from contextlib import contextmanager

    class MySQLClient:
    """
    MySQL 数据库客户端封装类

    功能:
    – 数据库连接管理
    – 执行 SQL 查询和更新
    – 事务支持
    """

    def __init__(self, host: str, port: int, user: str,
    password: str, database: str):
    """
    初始化数据库连接参数

    Args:
    host: 数据库主机地址
    port: 数据库端口
    user: 用户名
    password: 密码
    database: 数据库名
    """
    self.config = {
    'host': host,
    'port': port,
    'user': user,
    'password': password,
    'database': database,
    'charset': 'utf8mb4',
    'cursorclass': pymysql.cursors.DictCursor
    }

    print(f"数据库配置初始化完成: {host}:{port}/{database}")

    @contextmanager
    def get_connection(self):
    """
    获取数据库连接的上下文管理器

    Yields:
    数据库连接对象
    """
    conn = None
    try:
    conn = pymysql.connect(**self.config)
    yield conn
    except pymysql.Error as e:
    print(f"数据库连接错误: {e}")
    raise
    finally:
    if conn:
    conn.close()

    def execute_query(self, sql: str, params: tuple = ()) > List[Dict]:
    """
    执行查询语句(SELECT)

    Args:
    sql: SQL 查询语句
    params: 查询参数(防止 SQL 注入)

    Returns:
    查询结果列表,每个元素是一个字典
    """
    with self.get_connection() as conn:
    with conn.cursor() as cursor:
    try:
    cursor.execute(sql, params)
    results = cursor.fetchall()
    return results
    except pymysql.Error as e:
    print(f"查询执行错误: {e}")
    return []

    def execute_update(self, sql: str, params: tuple = ()) > int:
    """
    执行更新语句(INSERT、UPDATE、DELETE)

    Args:
    sql: SQL 更新语句
    params: 更新参数

    Returns:
    受影响的行数
    """
    with self.get_connection() as conn:
    with conn.cursor() as cursor:
    try:
    cursor.execute(sql, params)
    conn.commit()
    return cursor.rowcount
    except pymysql.Error as e:
    conn.rollback()
    print(f"更新执行错误: {e}")
    return 0

    def create_table(self, table_name: str, columns: Dict[str, str]) > bool:
    """
    创建数据表

    Args:
    table_name: 表名
    columns: 字段定义字典,如 {'id': 'INT PRIMARY KEY', 'name': 'VARCHAR(50)'}

    Returns:
    创建成功返回 True
    """
    column_defs = ', '.join([f"{name} {type_}" for name, type_ in columns.items()])
    sql = f"CREATE TABLE IF NOT EXISTS {table_name} ({column_defs})"

    try:
    self.execute_update(sql)
    print(f"表 {table_name} 创建成功")
    return True
    except Exception as e:
    print(f"创建表失败: {e}")
    return False

    # 使用示例
    if __name__ == "__main__":
    # 数据库配置(请替换为你的实际配置)
    DB_CONFIG = {
    'host': 'rm-xxx.mysql.rds.aliyuncs.com', # RDS 内网地址
    'port': 3306,
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database'
    }

    # 创建客户端
    db = MySQLClient(**DB_CONFIG)

    # 创建表示例
    # db.create_table('users', {
    # 'id': 'INT AUTO_INCREMENT PRIMARY KEY',
    # 'username': 'VARCHAR(50) NOT NULL',
    # 'email': 'VARCHAR(100)',
    # 'created_at': 'TIMESTAMP DEFAULT CURRENT_TIMESTAMP'
    # })

    # 插入数据示例
    # affected = db.execute_update(
    # "INSERT INTO users (username, email) VALUES (%s, %s)",
    # ('张三', 'zhangsan@example.com')
    # )
    # print(f"插入 {affected} 条记录")

    # 查询数据示例
    # results = db.execute_query("SELECT * FROM users")
    # for row in results:
    # print(row)


    七、实战项目:部署一个完整的网站

    7.1 项目概述

    我们将部署一个基于 Python Flask 的简单网站,包含以下组件:

    • Web 服务器:Nginx(反向代理、静态文件服务)
    • 应用服务器:Gunicorn(运行 Python 应用)
    • Web 框架:Flask(Python Web 框架)
    • 数据库:RDS MySQL(数据存储)
    • 文件存储:OSS(图片等静态资源)

    #mermaid-svg-6nuxWa3fXwHGePXk{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#ffffff;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6nuxWa3fXwHGePXk .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6nuxWa3fXwHGePXk .error-icon{fill:#a44141;}#mermaid-svg-6nuxWa3fXwHGePXk .error-text{fill:#ddd;stroke:#ddd;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6nuxWa3fXwHGePXk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6nuxWa3fXwHGePXk .marker{fill:#60a5fa;stroke:#60a5fa;}#mermaid-svg-6nuxWa3fXwHGePXk .marker.cross{stroke:#60a5fa;}#mermaid-svg-6nuxWa3fXwHGePXk svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6nuxWa3fXwHGePXk p{margin:0;}#mermaid-svg-6nuxWa3fXwHGePXk .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#ffffff;}#mermaid-svg-6nuxWa3fXwHGePXk .cluster-label text{fill:#F9FFFE;}#mermaid-svg-6nuxWa3fXwHGePXk .cluster-label span{color:#F9FFFE;}#mermaid-svg-6nuxWa3fXwHGePXk .cluster-label span p{background-color:transparent;}#mermaid-svg-6nuxWa3fXwHGePXk .label text,#mermaid-svg-6nuxWa3fXwHGePXk span{fill:#ffffff;color:#ffffff;}#mermaid-svg-6nuxWa3fXwHGePXk .node rect,#mermaid-svg-6nuxWa3fXwHGePXk .node circle,#mermaid-svg-6nuxWa3fXwHGePXk .node ellipse,#mermaid-svg-6nuxWa3fXwHGePXk .node polygon,#mermaid-svg-6nuxWa3fXwHGePXk .node path{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-6nuxWa3fXwHGePXk .rough-node .label text,#mermaid-svg-6nuxWa3fXwHGePXk .node .label text,#mermaid-svg-6nuxWa3fXwHGePXk .image-shape .label,#mermaid-svg-6nuxWa3fXwHGePXk .icon-shape .label{text-anchor:middle;}#mermaid-svg-6nuxWa3fXwHGePXk .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6nuxWa3fXwHGePXk .rough-node .label,#mermaid-svg-6nuxWa3fXwHGePXk .node .label,#mermaid-svg-6nuxWa3fXwHGePXk .image-shape .label,#mermaid-svg-6nuxWa3fXwHGePXk .icon-shape .label{text-align:center;}#mermaid-svg-6nuxWa3fXwHGePXk .node.clickable{cursor:pointer;}#mermaid-svg-6nuxWa3fXwHGePXk .root .anchor path{fill:#60a5fa!important;stroke-width:0;stroke:#60a5fa;}#mermaid-svg-6nuxWa3fXwHGePXk .arrowheadPath{fill:lightgrey;}#mermaid-svg-6nuxWa3fXwHGePXk .edgePath .path{stroke:#60a5fa;stroke-width:2.0px;}#mermaid-svg-6nuxWa3fXwHGePXk .flowchart-link{stroke:#60a5fa;fill:none;}#mermaid-svg-6nuxWa3fXwHGePXk .edgeLabel{background-color:#1e293b;text-align:center;}#mermaid-svg-6nuxWa3fXwHGePXk .edgeLabel p{background-color:#1e293b;}#mermaid-svg-6nuxWa3fXwHGePXk .edgeLabel rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-6nuxWa3fXwHGePXk .labelBkg{background-color:rgba(30, 41, 59, 0.5);}#mermaid-svg-6nuxWa3fXwHGePXk .cluster rect{fill:#1e293b;stroke:#3b82f6;stroke-width:1px;}#mermaid-svg-6nuxWa3fXwHGePXk .cluster text{fill:#F9FFFE;}#mermaid-svg-6nuxWa3fXwHGePXk .cluster span{color:#F9FFFE;}#mermaid-svg-6nuxWa3fXwHGePXk div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:#1e293b;border:1px solid rgba(255, 255, 255, 0.25);border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6nuxWa3fXwHGePXk .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#ffffff;}#mermaid-svg-6nuxWa3fXwHGePXk rect.text{fill:none;stroke-width:0;}#mermaid-svg-6nuxWa3fXwHGePXk .icon-shape,#mermaid-svg-6nuxWa3fXwHGePXk .image-shape{background-color:#1e293b;text-align:center;}#mermaid-svg-6nuxWa3fXwHGePXk .icon-shape p,#mermaid-svg-6nuxWa3fXwHGePXk .image-shape p{background-color:#1e293b;padding:2px;}#mermaid-svg-6nuxWa3fXwHGePXk .icon-shape rect,#mermaid-svg-6nuxWa3fXwHGePXk .image-shape rect{opacity:0.5;background-color:#1e293b;fill:#1e293b;}#mermaid-svg-6nuxWa3fXwHGePXk .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6nuxWa3fXwHGePXk .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6nuxWa3fXwHGePXk :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

    HTTP/HTTPS

    转发请求

    运行

    读写数据

    上传/下载

    用户

    Nginx反向代理

    GunicornWSGI服务器

    FlaskWeb应用

    RDS MySQL云数据库

    OSS对象存储

    7.2 环境准备

    7.2.1 安装 Python 和依赖

    CentOS:

    # 安装 Python 3 和 pip
    yum install -y python3 python3-pip

    # 验证安装
    python3 –version
    pip3 –version

    Ubuntu:

    # 安装 Python 3 和 pip
    apt install -y python3 python3-pip

    # 验证安装
    python3 –version
    pip3 –version

    7.2.2 安装 Nginx

    CentOS:

    # 安装 Nginx
    yum install -y epel-release
    yum install -y nginx

    # 启动 Nginx
    systemctl start nginx
    systemctl enable nginx

    # 检查状态
    systemctl status nginx

    Ubuntu:

    # 安装 Nginx
    apt install -y nginx

    # 启动 Nginx
    systemctl start nginx
    systemctl enable nginx

    # 检查状态
    systemctl status nginx

    验证 Nginx 安装: 在浏览器中访问服务器的公网 IP,应该能看到 Nginx 的欢迎页面。

    7.3 开发 Flask 应用

    7.3.1 创建项目目录

    # 创建项目目录
    mkdir -p /var/www/myapp
    cd /var/www/myapp

    # 创建虚拟环境
    python3 -m venv venv

    # 激活虚拟环境
    source venv/bin/activate

    7.3.2 安装依赖

    创建 requirements.txt:

    Flask==2.3.3
    gunicorn==21.2.0
    pymysql==1.1.0
    oss2==2.18.3

    安装依赖:

    pip install -r requirements.txt

    7.3.3 编写应用代码

    创建 app.py:

    # -*- coding: utf-8 -*-
    """
    Flask Web 应用示例
    功能:首页展示、用户注册/登录、文件上传
    """

    from flask import Flask, render_template, request, jsonify, redirect, url_for
    import pymysql
    import oss2
    import os
    from datetime import datetime

    app = Flask(__name__)
    app.secret_key = 'your-secret-key-change-in-production'

    # 数据库配置(请替换为你的配置)
    DB_CONFIG = {
    'host': 'rm-xxx.mysql.rds.aliyuncs.com',
    'port': 3306,
    'user': 'your_db_user',
    'password': 'your_db_password',
    'database': 'your_database',
    'charset': 'utf8mb4'
    }

    # OSS 配置(请替换为你的配置)
    OSS_CONFIG = {
    'access_key_id': 'your-access-key-id',
    'access_key_secret': 'your-access-key-secret',
    'endpoint': 'oss-cn-hangzhou.aliyuncs.com',
    'bucket_name': 'your-bucket-name'
    }

    # 初始化 OSS 客户端
    oss_auth = oss2.Auth(OSS_CONFIG['access_key_id'], OSS_CONFIG['access_key_secret'])
    oss_bucket = oss2.Bucket(oss_auth, OSS_CONFIG['endpoint'], OSS_CONFIG['bucket_name'])

    def get_db_connection():
    """获取数据库连接"""
    return pymysql.connect(**DB_CONFIG)

    @app.route('/')
    def index():
    """首页"""
    return render_template('index.html')

    @app.route('/api/users', methods=['GET'])
    def get_users():
    """获取用户列表"""
    try:
    conn = get_db_connection()
    with conn.cursor() as cursor:
    cursor.execute("SELECT id, username, email, created_at FROM users")
    users = cursor.fetchall()
    conn.close()

    return jsonify({
    'success': True,
    'data': [
    {
    'id': u[0],
    'username': u[1],
    'email': u[2],
    'created_at': str(u[3])
    } for u in users
    ]
    })
    except Exception as e:
    return jsonify({'success': False, 'error': str(e)})

    @app.route('/api/users', methods=['POST'])
    def create_user():
    """创建用户"""
    try:
    data = request.json
    username = data.get('username')
    email = data.get('email')
    password = data.get('password')

    if not all([username, email, password]):
    return jsonify({'success': False, 'error': '缺少必要字段'})

    conn = get_db_connection()
    with conn.cursor() as cursor:
    cursor.execute(
    "INSERT INTO users (username, email, password) VALUES (%s, %s, %s)",
    (username, email, password)
    )
    conn.commit()
    conn.close()

    return jsonify({'success': True, 'message': '用户创建成功'})
    except Exception as e:
    return jsonify({'success': False, 'error': str(e)})

    @app.route('/api/upload', methods=['POST'])
    def upload_file():
    """上传文件到 OSS"""
    try:
    if 'file' not in request.files:
    return jsonify({'success': False, 'error': '没有文件'})

    file = request.files['file']
    if file.filename == '':
    return jsonify({'success': False, 'error': '文件名为空'})

    # 生成唯一的文件名
    timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
    filename = f"uploads/{timestamp}_{file.filename}"

    # 上传到 OSS
    oss_bucket.put_object(filename, file.read())

    # 生成访问链接
    url = f"https://{OSS_CONFIG['bucket_name']}.{OSS_CONFIG['endpoint']}/{filename}"

    return jsonify({
    'success': True,
    'url': url,
    'filename': filename
    })
    except Exception as e:
    return jsonify({'success': False, 'error': str(e)})

    @app.route('/health')
    def health():
    """健康检查接口"""
    return jsonify({'status': 'healthy', 'timestamp': str(datetime.now())})

    if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

    创建 templates/index.html:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的云应用</title>
    <style>
    * { margin: 0; padding: 0; box-sizing: border-box; }
    body {
    font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
    min-height: 100vh;
    padding: 20px;
    }
    .container {
    max-width: 800px;
    margin: 0 auto;
    background: white;
    border-radius: 10px;
    padding: 30px;
    box-shadow: 0 10px 40px rgba(0,0,0,0.1);
    }
    h1 {
    text-align: center;
    color: #333;
    margin-bottom: 30px;
    }
    .section {
    margin-bottom: 30px;
    padding: 20px;
    background: #f8f9fa;
    border-radius: 8px;
    }
    .section h2 {
    color: #667eea;
    margin-bottom: 15px;
    }
    input, button {
    padding: 10px 15px;
    margin: 5px;
    border: 1px solid #ddd;
    border-radius: 5px;
    font-size: 14px;
    }
    button {
    background: #667eea;
    color: white;
    border: none;
    cursor: pointer;
    transition: background 0.3s;
    }
    button:hover {
    background: #5568d3;
    }
    .result {
    margin-top: 15px;
    padding: 10px;
    background: #e8f5e9;
    border-radius: 5px;
    display: none;
    }
    .user-list {
    margin-top: 15px;
    }
    .user-item {
    padding: 10px;
    background: white;
    margin-bottom: 10px;
    border-radius: 5px;
    border-left: 4px solid #667eea;
    }
    </style>
    </head>
    <body>
    <div class="container">
    <h1>☁️ 我的云应用</h1>
    <p style="text-align: center; color: #666; margin-bottom: 30px;">
    基于 Flask + MySQL + OSS 的云计算实战项目
    </p>

    <div class="section">
    <h2>👤 用户注册</h2>
    <input type="text" id="username" placeholder="用户名">
    <input type="email" id="email" placeholder="邮箱">
    <input type="password" id="password" placeholder="密码">
    <button onclick="createUser()">注册</button>
    <div id="userResult" class="result"></div>
    </div>

    <div class="section">
    <h2>📋 用户列表</h2>
    <button onclick="loadUsers()">刷新列表</button>
    <div id="userList" class="user-list"></div>
    </div>

    <div class="section">
    <h2>📁 文件上传</h2>
    <input type="file" id="fileInput">
    <button onclick="uploadFile()">上传到 OSS</button>
    <div id="uploadResult" class="result"></div>
    </div>
    </div>

    <script>
    async function createUser() {
    const username = document.getElementById('username').value;
    const email = document.getElementById('email').value;
    const password = document.getElementById('password').value;

    try {
    const response = await fetch('/api/users', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ username, email, password })
    });
    const data = await response.json();

    const resultDiv = document.getElementById('userResult');
    resultDiv.style.display = 'block';
    resultDiv.textContent = data.success ? '✅ ' + data.message : '❌ ' + data.error;

    if (data.success) {
    loadUsers();
    document.getElementById('username').value = '';
    document.getElementById('email').value = '';
    document.getElementById('password').value = '';
    }
    } catch (error) {
    alert('请求失败: ' + error);
    }
    }

    async function loadUsers() {
    try {
    const response = await fetch('/api/users');
    const data = await response.json();

    const listDiv = document.getElementById('userList');
    if (data.success && data.data.length > 0) {
    listDiv.innerHTML = data.data.map(user => `
    <div class="user-item">
    <strong>
    ${user.username}</strong> – ${user.email}<br>
    <small>注册时间:
    ${user.created_at}</small>
    </div>
    `
    ).join('');
    } else {
    listDiv.innerHTML = '<p style="color: #999;">暂无用户</p>';
    }
    } catch (error) {
    alert('加载失败: ' + error);
    }
    }

    async function uploadFile() {
    const fileInput = document.getElementById('fileInput');
    if (!fileInput.files[0]) {
    alert('请选择文件');
    return;
    }

    const formData = new FormData();
    formData.append('file', fileInput.files[0]);

    try {
    const response = await fetch('/api/upload', {
    method: 'POST',
    body: formData
    });
    const data = await response.json();

    const resultDiv = document.getElementById('uploadResult');
    resultDiv.style.display = 'block';

    if (data.success) {
    resultDiv.innerHTML = `
    ✅ 上传成功!<br>
    <a href="
    ${data.url}" target="_blank">查看文件</a>
    `
    ;
    } else {
    resultDiv.textContent = '❌ ' + data.error;
    }
    } catch (error) {
    alert('上传失败: ' + error);
    }
    }

    // 页面加载时获取用户列表
    loadUsers();
    </script>
    </body>
    </html>

    7.4 配置 Gunicorn 和 Nginx

    7.4.1 创建 Gunicorn 配置文件

    创建 gunicorn.conf.py:

    # Gunicorn 配置文件
    import multiprocessing

    # 绑定地址和端口
    bind = "127.0.0.1:8000"

    # 工作进程数,通常设置为 CPU 核心数的 2-4 倍
    workers = multiprocessing.cpu_count() * 2 + 1

    # 工作模式,使用异步 workers
    worker_class = "sync"

    # 每个 worker 的最大请求数,超过后自动重启(防止内存泄漏)
    max_requests = 1000
    max_requests_jitter = 50

    # 超时时间(秒)
    timeout = 30

    # 保持连接时间
    keepalive = 2

    # 日志配置
    errorlog = "/var/log/gunicorn/error.log"
    accesslog = "/var/log/gunicorn/access.log"
    loglevel = "info"

    # 进程名称
    proc_name = "myapp"

    # 守护进程模式(后台运行)
    daemon = False

    创建日志目录:

    mkdir -p /var/log/gunicorn

    7.4.2 创建 Systemd 服务

    创建服务文件 /etc/systemd/system/myapp.service:

    [Unit]
    Description=My Flask App
    After=network.target

    [Service]
    User=root
    Group=root
    WorkingDirectory=/var/www/myapp
    Environment="PATH=/var/www/myapp/venv/bin"
    ExecStart=/var/www/myapp/venv/bin/gunicorn -c gunicorn.conf.py app:app

    [Install]
    WantedBy=multi-user.target

    启动服务:

    # 重新加载 systemd
    systemctl daemon-reload

    # 启动服务
    systemctl start myapp

    # 设置开机自启
    systemctl enable myapp

    # 查看状态
    systemctl status myapp

    7.4.3 配置 Nginx

    创建 Nginx 配置文件 /etc/nginx/conf.d/myapp.conf:

    server {
    listen 80;
    server_name _; # 监听所有域名

    # 日志配置
    access_log /var/log/nginx/myapp_access.log;
    error_log /var/log/nginx/myapp_error.log;

    # 静态文件目录
    location /static {
    alias /var/www/myapp/static;
    expires 30d;
    }

    # 反向代理到 Gunicorn
    location / {
    proxy_pass http://127.0.0.1:8000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

    # 错误页面
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root /usr/share/nginx/html;
    }
    }

    测试并重载 Nginx:

    # 测试配置
    nginx -t

    # 重载配置
    systemctl reload nginx

    7.5 测试部署结果

  • 测试应用是否运行:

    curl http://localhost:8000/health

    应该返回 JSON 格式的健康状态。

  • 测试 Nginx 反向代理:

    curl http://localhost/

    应该返回 HTML 页面内容。

  • 浏览器访问: 在浏览器中访问服务器的公网 IP,应该能看到网站首页。

  • 测试功能:

    • 注册一个新用户
    • 查看用户列表
    • 上传一个文件到 OSS

  • 八、故障排查与问题解决

    8.1 连接问题

    问题 1:无法通过 SSH 连接到服务器

    错误现象:

    Connection timed out
    Connection refused
    Permission denied

    原因分析:

  • 安全组未开放 22 端口
  • 服务器防火墙阻止了 SSH 连接
  • SSH 服务未启动
  • 密钥或密码错误
  • 解决方案:

    方案 1:检查安全组配置

  • 登录阿里云控制台
  • 进入 ECS 实例详情页
  • 点击"安全组" > “配置规则”
  • 确认有允许 22 端口的入方向规则
  • 如果没有,添加规则:
    • 协议类型:SSH(22)
    • 授权对象:你的 IP 地址(如 123.45.67.89/32)
  • 方案 2:检查服务器防火墙

    # CentOS
    firewall-cmd –list-ports
    firewall-cmd –add-port=22/tcp –permanent
    firewall-cmd –reload

    # Ubuntu
    ufw status
    ufw allow 22/tcp

    方案 3:检查 SSH 服务状态

    # 检查 SSH 服务是否运行
    systemctl status sshd

    # 启动 SSH 服务
    systemctl start sshd

    # 设置开机自启
    systemctl enable sshd

    方案 4:使用阿里云 VNC 连接 如果以上方法都无效,可以通过阿里云控制台的 VNC 功能连接服务器:

  • 在 ECS 控制台,点击实例的"远程连接"
  • 选择"VNC 远程连接"
  • 输入用户名密码登录
  • 在 VNC 中排查问题

  • 问题 2:网站无法访问

    错误现象: 浏览器显示"无法访问此网站"或"连接超时"。

    排查步骤:

    步骤 1:检查服务是否运行

    # 检查 Nginx 状态
    systemctl status nginx

    # 检查应用服务状态
    systemctl status myapp

    # 查看应用日志
    journalctl -u myapp -f

    步骤 2:检查端口监听

    # 查看 80 端口是否被监听
    netstat -tlnp | grep :80

    # 查看 Gunicorn 是否在 8000 端口监听
    netstat -tlnp | grep :8000

    步骤 3:检查安全组 确认安全组已开放 80 端口:

    • 协议类型:HTTP(80)
    • 授权对象:0.0.0.0/0

    步骤 4:检查防火墙

    # CentOS
    firewall-cmd –list-ports

    # Ubuntu
    ufw status

    步骤 5:测试本地访问

    # 测试 Nginx
    curl http://localhost/

    # 测试 Gunicorn
    curl http://localhost:8000/


    8.2 应用问题

    问题 3:应用启动失败

    错误现象:

    Failed to start myapp.service

    排查步骤:

    步骤 1:查看详细错误信息

    # 查看服务状态
    systemctl status myapp

    # 查看详细日志
    journalctl -u myapp -n 50

    步骤 2:手动运行测试

    cd /var/www/myapp
    source venv/bin/activate

    # 直接运行应用,查看错误输出
    python app.py

    常见问题及解决:

  • 依赖未安装

    pip install -r requirements.txt

  • 端口被占用

    # 查找占用 8000 端口的进程
    lsof -i :8000

    # 结束进程
    kill -9 <PID>

  • 权限问题

    # 修改项目目录权限
    chown -R root:root /var/www/myapp
    chmod -R 755 /var/www/myapp


  • 问题 4:数据库连接失败

    错误现象:

    pymysql.err.OperationalError: (2003, "Can't connect to MySQL server")

    排查步骤:

    步骤 1:检查 RDS 白名单

  • 登录 RDS 控制台
  • 进入实例详情页
  • 点击"数据安全性" > “白名单设置”
  • 确认 ECS 的 IP 已添加到白名单
  • 步骤 2:测试连接

    # 从 ECS 测试连接
    mysql -h rm-xxx.mysql.rds.aliyuncs.com -u username -p

    步骤 3:检查数据库配置 确认 app.py 中的数据库配置正确:

    • 主机地址(使用内网地址)
    • 端口号(默认 3306)
    • 用户名和密码
    • 数据库名

    步骤 4:检查安全组 如果使用外网地址连接,确保安全组允许出方向的 3306 端口。


    8.3 性能问题

    问题 5:网站访问缓慢

    排查步骤:

    步骤 1:检查服务器资源使用

    # 查看 CPU 使用率
    top

    # 查看内存使用
    free -h

    # 查看磁盘使用
    df -h

    步骤 2:优化 Gunicorn 配置

    # gunicorn.conf.py

    # 根据 CPU 核心数调整 workers
    workers = 4 # 2-4 倍 CPU 核心数

    # 增加超时时间
    timeout = 60

    # 启用 keepalive
    keepalive = 5

    步骤 3:启用 Nginx 缓存

    # 在 Nginx 配置中添加
    location /static {
    alias /var/www/myapp/static;
    expires 30d; # 静态文件缓存 30 天
    add_header Cache-Control "public, immutable";
    }

    步骤 4:数据库优化

    • 为常用查询字段添加索引
    • 使用连接池减少连接开销
    • 启用 RDS 的查询缓存

    8.4 OSS 问题

    问题 6:OSS 上传失败

    错误现象:

    oss2.exceptions.AccessDenied

    解决方案:

    方案 1:检查 AccessKey 权限

  • 登录阿里云控制台
  • 进入"AccessKey 管理"
  • 确认 AccessKey 有 OSS 操作权限
  • 如果没有,添加 OSS 管理权限
  • 方案 2:检查 Bucket 权限

  • 进入 OSS 控制台
  • 点击 Bucket 名称
  • 点击"权限管理"
  • 确认读写权限设置正确
  • 方案 3:检查 RAM 权限(如果使用子账号) 确保子账号有 OSS 操作权限:

    {
    "Version": "1",
    "Statement": [
    {
    "Effect": "Allow",
    "Action": [
    "oss:PutObject",
    "oss:GetObject",
    "oss:DeleteObject"
    ],
    "Resource": [
    "acs:oss:*:*:your-bucket-name/*"
    ]
    }
    ]
    }


    8.5 日志排查技巧

    查看应用日志:

    # Gunicorn 错误日志
    tail -f /var/log/gunicorn/error.log

    # Gunicorn 访问日志
    tail -f /var/log/gunicorn/access.log

    # Nginx 错误日志
    tail -f /var/log/nginx/myapp_error.log

    # 系统日志
    journalctl -u myapp -f

    查看系统日志:

    # 查看所有日志
    journalctl

    # 查看特定服务的日志
    journalctl -u nginx

    # 查看最近的 100 条日志
    journalctl -n 100

    # 实时查看日志
    journalctl -f


    九、总结

    9.1 核心知识点回顾

    通过本教程,我们学习了以下核心内容:

  • 云计算基础概念

    • 云计算的定义和优势
    • 三种服务模式:IaaS、PaaS、SaaS
    • 四种部署模式:公有云、私有云、混合云、社区云
    • 核心技术:虚拟化、容器、分布式存储
  • 云服务器 ECS

    • 创建和配置云服务器
    • 使用 SSH 远程连接
    • 服务器基础配置和安全加固
  • 云存储 OSS

    • 创建 Bucket 和配置权限
    • 使用控制台和命令行工具
    • 使用 Python SDK 进行编程操作
  • 云数据库 RDS

    • 创建 MySQL 实例
    • 配置白名单和访问权限
    • 使用 Python 进行数据库操作
  • 完整项目部署

    • Flask Web 应用开发
    • 使用 Gunicorn 运行 Python 应用
    • 使用 Nginx 作为反向代理
    • 整合 ECS + RDS + OSS 构建完整应用
  • 9.2 扩展学习方向

    进阶技术:

    • 容器化:学习 Docker 和 Kubernetes,实现应用的容器化部署
    • CI/CD:学习 Jenkins、GitLab CI 等持续集成/持续部署工具
    • 监控告警:学习 Prometheus、Grafana 监控系统状态
    • 日志分析:学习 ELK Stack(Elasticsearch、Logstash、Kibana)
    • 自动化运维:学习 Ansible、Terraform 等基础设施即代码工具

    云平台深入:

    • 负载均衡:学习 SLB/ALB 实现流量分发
    • 自动伸缩:学习 ESS 根据负载自动调整资源
    • CDN 加速:学习 CDN 提升网站访问速度
    • 云安全:学习 WAF、DDoS 防护等安全服务
    • Serverless:学习函数计算,实现无服务器架构

    认证体系:

    • 阿里云认证:ACA/ACP/ACE
    • AWS 认证:Cloud Practitioner/Solutions Architect
    • 腾讯云认证:TCA/TCP

    9.3 学习资源

    官方文档:

    • 阿里云官方文档
    • AWS 官方文档
    • Docker 官方文档
    • Nginx 官方文档

    官方教程:

    • 阿里云大学
    • AWS 免费数字化培训

    官方 GitHub:

    • 阿里云 SDK
    • AWS SDK
    • Flask
    • Gunicorn

    恭喜你完成了云计算零基础入门教程! 你已经掌握了云计算的核心概念,能够独立创建和管理云资源,并成功部署了一个完整的云上应用。继续实践和探索,你将在云计算领域走得更远!

    赞(0)
    未经允许不得转载:171主机测评 » 云计算零基础入门:从概念到实战,新手必看完整指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址