征文投稿丨基于轻量应用服务器+OSS的中小型应用运维实践

简介: 高可用性、资源占用低的中小型项目的运维实践分享。

本文来自于轻量应用服务器征文活动用户投稿,已获得用户(昵称:为之工作室)授权发布


我是西安电子科技大学为之工作室的运维负责人,为之工作室致力于互联网人才的培养,涉及到很多项目的部署及运维。这类项目的特点是并发量较小,资源占用低,外部组件依赖简单。本文会介绍这些项目的运维模式及相关实践分享,为类似的项目运维提供参考。


一、架构设计


出于节省成本的考虑,希望可以将多个项目部署在同一个服务器上。此外,对于中小型项目,虽然对于高并发的需求可能并不是非常大,但是仍然需要高可用性。自己进行服务器硬件维护的成本和精力是巨大的,所以必须充分利用云厂商的服务器资源,我们选择的是技术领先、产品完善的阿里云。


我们的项目都是前后端分离的,为了节省带宽,将前端部署在 OSS 上,服务器上只用部署后端即可,这样整个工作室只需要一台轻量应用服务器及多个 OSS 实例。其中 OSS 实例的费用是可以忽略不计的,而轻量应用服务器的实际花费,平均下来也只需要 1 个月 10 元。


轻量应用服务器 ,是 可快速搭建且易于管理的轻量级云服务器;提供基于单台服务器的应用部署,安全管理,运维监控等服务,一站式提升服务器使用体验和效率。


对象存储OSS,是一款 海量、安全、低成本、高可靠 的云存储服务,提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性; 多种存储类型供选择, 全面优化存储成本


下图为运维架构图,服务器使用 Ubuntu + Docker 部署基础服务及业务后端,而 MySQL 和 Redis 等依赖则使用阿里云提供的服务。

架构图1.png


二、网关配置


选用 Traefik 作为网关。相比 Nginx,Traefik 对 Docker 容器具有更好的支持性,且集成 Let's Encrypt 自动申请、维护 HTTPS 证书。


首先创建网络 :


docker network create traefik


文件中的 ${} 需要根据自己实际情况编写


~/.docker/compose/traefik/docker-compose.yml


YAML
version: "3.3"
services:
  traefik:
    image: traefik
    ports:
      -   "443:443"
    volumes:
      -   /var/run/docker.sock:/var/run/docker.sock
      -   ./traefik.yml:/etc/traefik/traefik.yml
      -   ./dynamic_conf.yml:/root/dynamic_conf.yml
      -   ~/.docker/volume/traefik/crt:/root/crt
      -   ~/.docker/volume/traefik/log:/root/log
    restart:   unless-stopped
    networks:
      - traefik
    environment:
        ALICLOUD_ACCESS_KEY: ${AK}
        ALICLOUD_SECRET_KEY: ${SK}
    extra_hosts:
      -   "host.docker.internal:172.18.0.1" # 172.18.0.1 是容器访问宿主机的 ip,通过   docker inspect 获取
    labels:
      -   com.centurylinklabs.watchtower.enable=false
networks:
  traefik:
    external: true


请确保 *.be.wizzstudio.com 域名解析至这台服务器;配置中 "root:$2b$12$aur8GtnfMi" 是 Traefik Basic Auth 账号密码,请通过 https://doc.traefik.io/traefik/middlewares/basicauth 路径生成。


/root/.docker/compose/traefik/dynamic_conf.yml


YAML
http:
  middlewares:
    basic-auth:
      basicAuth:
        users:
          -   "root:$2b$12$aur8GtnfMi"
  routers:
    dashboard:
      rule:   "Host(`traefik.be.wizzstudio.com`)"
      service:   "api@internal"
      middlewares:
        - basic-auth
      tls:
          certResolver: myresolver
        domains:
        - main:   '*.be.wizzstudio.com'
        - sans:   '*.be.wizzstudio.com'


/root/.docker/compose/traefik/traefik.yml


YAML
providers:
  docker:
      exposedByDefault: false
    network: traefik
  file:
    filename:   /root/dynamic_conf.yml
    watch: true
api:
  dashboard: true
  # insecure: true
entryPoints:
  https:
    address:   ":443"
    http:
      tls:
          certresolver: myresolver
certificatesResolvers:
  myresolver:
    acme:
      dnsChallenge:
        provider:   alidns
          delayBeforeCheck: 0
      storage:   /root/crt/acme.json
      # caserver:   "https://acme-staging-v02.api.letsencrypt.org/directory" # test   server
accessLog:
  filePath:   "/root/log/access.log.json"
  format:   "json"


通过 docker-compose up -d 完成网关的部署;通过访问 https://traefik.be.wizzstudio.com 即可进入管理面板。


三、项目部署


以某一个后端的项目部署为例。


/root/.docker/compose/orientation-system-be/docker-compose.yml


Ruby
version: "3.3"
services:
  backend:
    image:   registry.cn-chengdu.aliyuncs.com/wizz-project/orientation-system-be:latest
    restart:   unless-stopped
    # ports:
    #   - "80:8080"
    labels:
      -   "traefik.enable=true"
      -   "traefik.http.routers.orientation-system-be.rule=Host(`orientation-system.be.wizzstudio.com`)"
      -   "traefik.http.routers.orientation-system-be.tls=true"
      -   "traefik.http.services.orientation-system-be.loadbalancer.server.port=80"
    networks:
      - traefik
    volumes:
      -   /etc/timezone:/etc/timezone:ro
      -   /etc/localtime:/etc/localtime:ro
      -   ~/.docker/volume/orientation-system-be/lab.log:/root/lab.log
networks:
  traefik:
    external: true
# mkdir -p ~/.docker/volume/orientation-system-be   && touch 
~/.docker/volume/orientation-system-be/lab.log


通过 labels 字段,定义了通过 https://orientation-system.be.wizzstudio.com 即可访问到这个容器,不需要再去 Traefik 修改配置了。


四、CI/CD


CI/CD: 即持续集成与持续交付,用于实现应用开发过程中的高度持续自动化和持续监控。CI/CD的目标是:用户上传代码后,自动构建镜像,自动部署到服务器。使用 GitHub Action 完成此功能。


1、后端

首先在项目根目录准备 Dockerfile, 将项目从源代码开始构建为二进制。


Dockerfile
FROM golang:1.18.0-alpine3.15 as build
LABEL maintainer="117503445"
RUN apk add --no-cache git
WORKDIR /root/project
COPY go.mod .
COPY go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o server
FROM alpine:3.15 as prod
EXPOSE 8080
WORKDIR /root
#   https://stackoverflow.com/questions/66963068/docker-alpine-executable-binary-not-found-even-if-in-path
RUN apk add gcompat
COPY --from=build /root/project/server server
HEALTHCHECK --interval=5s --timeout=5s --retries=3 \
    CMD wget -nv -t1   --spider 'http://localhost:8080/' || exit 1
ENTRYPOINT ./server


编写 GitHub Action,并在 Repo 中的 secrets 填写 阿里云容器镜像服务的 AK 和 SK。这里经过修改,也可以变为上传至 Docker Hub。


.github/workflows/docker.yml


Perl
name: Build and Deploy to ACK
on:
  push:
    branches:
      - main
# Environment variables available to all jobs and steps in   this workflow.
env:
  REGION_ID:   cn-chengdu
  REGISTRY:   registry.cn-chengdu.aliyuncs.com
  NAMESPACE:   wizz-project
  IMAGE:   experiment-helper-backend
  TAG: ${{   github.sha }}
jobs:
  build:
    runs-on:   ubuntu-latest
    environment:   production
    steps:
      - name:   Checkout
        uses:   actions/checkout@v2
      # 1.1 Login to   ACR
      - name: Login   to ACR with the AccessKey pair
        uses:   aliyun/acr-login@v1
        with:
          region-id:   "${{ env.REGION_ID }}"
            access-key-id: "${{ secrets.ACCESS_KEY_ID }}"
            access-key-secret: "${{ secrets.ACCESS_KEY_SECRET }}"      
            # 1.2 Buid and   push image to ACR
      - name: Build   and push image to ACR
        run: |
          docker   build --tag "$REGISTRY/$NAMESPACE/$IMAGE:$TAG" . 
          docker   push "$REGISTRY/$NAMESPACE/$IMAGE:$TAG"
          docker tag   "$REGISTRY/$NAMESPACE/$IMAGE:$TAG"   "$REGISTRY/$NAMESPACE/$IMAGE:latest"
          docker   push "$REGISTRY/$NAMESPACE/$IMAGE:latest"


每次在 main 分支 commit 后, 都会触发 GitHub Action,并将镜像推送至阿里云容器服务。也可以根据 GitHub Flow 等分支管理策略,修改触发条件。


在完成 Docker 镜像的推送后,可以使用 Watchtower 实现镜像的自动拉取、更新。同样使用 docker-compose.yml 部署 Watchtower。


/root/.docker/compose/watchtower/docker-compose.yml


YAML
version: "3.3"
services:
  watchtower:
    image:   containrrr/watchtower
    restart:   unless-stopped
    volumes:
      -   /var/run/docker.sock:/var/run/docker.sock
      -   ~/.docker/config.json:/config.json
    command:   --interval 60 --cleanup --debug



2、前端


同样使用 GitHub Action,每次发生代码提交后,都进行构建,再将 dist 文件夹上传至 OSS。


.github/workflows/oss.yml


HTTP
name: oss
on:
  push:
    branches:
      - main
jobs:
  build:
    runs-on:   ubuntu-latest
    steps:
      - name:   checkout
        uses:   actions/checkout@v1
      - name:   install node
        uses:   actions/setup-node@v2
        with:
            node-version: "14"
      - name: build   dist
        run: |
          npm   install -g yarn
          yarn   install
          yarn build
      - name: upload   files to OSS
        uses:   fangbinwei/aliyun-oss-website-action@v1
        with:
          accessKeyId:   ${{ secrets.ACCESS_KEY_ID }}
            accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }}
          bucket:   experiment-helper-mobile
          endpoint:   https://oss-cn-hangzhou.aliyuncs.com
          folder:   ./dist/build/h5  


五、日志管理


对于更大规模的生产环境,可能需要ELK或者阿里云日志服务等专业的日志解决方案,但是这些解决方案对于本使用场景来说过重了。


我们的目标为,每个应用的开发者都可以下载到自己应用的日志文件。作者开发过一个小工具,https://github.com/117503445/GoWebDAV


GoWebDAV 可以将服务器上的文件夹以 WebDAV 的形式暴露出来,并支持浏览器在线访问、挂载多个路径、路径粒度的 Basic Auth 及只读控制。对于这个场景,小工具也可以轻松解决需求。


在上述 orientation-system 项目的部署中,可以观察到将镜像内的 /root/lab.log 挂载到了宿主机的 ~/.docker/volume/orientation-system-be/lab.log;接着部署GoWebDAV。相关配置规则可查看 repo 上的 README。


/root/.docker/compose/watchtower/docker-compose.yml


YAML
version: "3.3"
services:
  webdav:
    image:   117503445/go_webdav
    restart:   unless-stopped
    volumes:
      -   ~/.docker/volume/orientation-system-be:/root/orientation-system-be
    environment:
      -   dav=/orientation-system-be,/root/orientation-system-be,user1,pass1,true
    networks:
      - traefik
    labels:
      -   "traefik.enable=true"
      -   "traefik.http.routers.webdav.rule=Host(`webdav.be.wizzstudio.com`)"
      -   "traefik.http.routers.webdav.tls=true"
      -   "traefik.http.services.webdav.loadbalancer.server.port=80"
networks:
  traefik:
    external: true


通过这样配置,开发者就可以通过访问 https://webdav.be.wizzstudio.com/orientation-system-be/orientation-system-be 访问日志文件了。用户名 user1,密码 pass1,而且只具有只读权限。


同一个 GoWebDAV 镜像支持多个文件夹路径,因此服务器上只用部署 1 个 GoWebDAV 即可。


六、总结


本文给出了中小型项目的运维方案,介绍了架构设计的思路及项目实施部署,以及CI/CD、日志管理方面的实践分享,适用于个人开发者和小微公司高并发需求低、资源占用低的应用部署,希望大家能有所收获。


点击这里,查看全新升级的轻量应用服务器征文活动,奖励更丰富,月月可投稿。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
1月前
|
运维 自然语言处理 Cloud Native
云栖实录 | 智能运维年度重磅发布及大模型实践解读
阿里云大数据运维团队重磅发布云原生大规模集群场景的 GitOps 方案,该方案基于 OAM 云原生模型,促进研发与运维人员协作,同时兼顾变更的过程管理和终态管理,可实现变更的自动化、代码化、透明化。此外,阿里云大数据运维团队分享了大模型在大数据智能运维场景的应用实践,通过引入检索增强生成(RAG)方法和其他优化策略,大幅提高了在智能问答和智能诊断方面知识的关联性和检索精度,并基于多智能体框架建立高效的数据分析和决策支持系统。
|
1月前
|
运维 监控 安全
高效运维管理:提升系统稳定性的策略与实践
【10月更文挑战第2天】 在当今数字化时代,运维管理成为企业IT部门的重要任务。本文将探讨如何通过高效的运维管理策略和最佳实践,提升系统的稳定性,确保业务持续平稳运行。通过分析常见问题、预防措施以及应对策略,我们将揭示高效运维的关键要素,助您打造一个可靠的IT环境。
|
6天前
|
人工智能 运维 监控
构建高效运维体系:理论与实践的深度融合####
本文旨在探讨高效IT运维体系的构建策略,通过理论框架与实际案例并重的方式,深入剖析了现代企业面临的运维挑战。文章开篇概述了当前运维领域的新趋势,包括自动化、智能化及DevOps文化的兴起,随后详细阐述了如何将这些先进理念融入日常运维管理中,形成一套既灵活又稳定的运维机制。特别地,文中强调了数据驱动决策的重要性,以及在快速迭代的技术环境中保持持续学习与适应的必要性。最终,通过对比分析几个典型企业的运维转型实例,提炼出可复制的成功模式,为读者提供具有实操性的指导建议。 ####
|
8天前
|
机器学习/深度学习 人工智能 运维
智能运维:AIOps在大型系统运维中的实践与挑战
【10月更文挑战第28天】随着云计算、大数据和人工智能的发展,AIOps(人工智能运维)应运而生,旨在通过算法和机器学习提高运维效率和质量。本文探讨了AIOps在大型系统运维中的实践与挑战,包括数据质量、模型选择和团队协作等方面,并通过一个异常检测案例展示了其应用。尽管面临挑战,AIOps仍有望成为未来运维的重要方向。
34 5
|
4天前
|
运维 负载均衡 Ubuntu
自动化运维的利器:Ansible入门与实践
【10月更文挑战第31天】在当今快速发展的信息技术时代,高效的运维管理成为企业稳定运行的关键。本文将引导读者了解自动化运维工具Ansible的基础概念、安装步骤、基本使用,以及如何通过实际案例掌握其核心功能,从而提升工作效率和系统稳定性。
|
6天前
|
运维 资源调度 监控
提升运维效率的关键技术与实践
在当今快速发展的信息技术时代,运维工作面临着前所未有的挑战和机遇。本文旨在探讨如何通过采用先进的技术和实施最佳实践来提高IT运维的效率和效果。我们将深入分析自动化工具、监控策略、灾难恢复计划以及持续集成/持续部署(CI/CD)等关键领域,展示它们如何协同工作以优化运维流程。此外,文章还将提供一些实际案例研究,帮助读者更好地理解这些概念的应用。无论是对于初创公司还是大型企业,掌握这些技术都将是提升竞争力的关键。
|
15天前
|
运维 应用服务中间件 持续交付
自动化运维的利器:Ansible入门与实践
【10月更文挑战第21天】在现代IT基础设施的管理中,自动化运维已成为提升效率、降低错误率的关键。Ansible,作为一种简单而强大的自动化工具,正被广泛应用于配置管理、应用部署和任务自动化等领域。本文将引导你了解Ansible的基本概念,通过实际案例展示如何利用Ansible简化日常运维工作,并探讨其在现代IT运维中的应用价值。无论你是新手还是有经验的系统管理员,这篇文章都将为你开启Ansible的高效之旅提供指导。
|
21天前
|
运维 自然语言处理 开发者
作为一名运维人员,使用通义灵码个人版处理日常工作中的代码相关任务,极大地提升了我的工作效率。以下是我使用通义灵码的具体实践场景、效果和心得,以及相应的截图。
作为一名运维人员,我使用通义灵码处理日常工作中的代码任务,效率提升了30%。通义灵码帮助我快速理解复杂代码、生成准确的代码注释,并能从自然语言生成代码示例,大幅减少了代码编写和理解的时间。
53 3
|
22天前
|
运维 Prometheus 监控
运维之眼:监控的艺术与实践
在信息技术飞速发展的今天,运维监控已成为保障系统稳定运行的关键。本文将探讨运维监控的重要性,介绍常用的监控工具和方法,并通过实际案例分析,展示如何有效地实施监控策略,以确保系统的高可用性和性能。
|
22天前
|
运维 监控 安全
高效运维管理:提升系统稳定性的策略与实践
【10月更文挑战第13天】 本文探讨了高效运维管理的关键策略和实践,旨在帮助运维团队提升系统的稳定性。通过分析常见问题,提出具体的解决方案,包括监控与告警、自动化工具的应用、故障排查与恢复、性能优化以及安全防护等方面。通过这些策略和实践,可以帮助企业构建一个稳定、可靠且高效的IT系统。
62 1

热门文章

最新文章

相关产品

  • 云服务器 ECS
  • 轻量应用服务器
  • 下一篇
    无影云桌面