中小型应用如何通过轻量级OSS实现高效运维?

2026-04-28 10:582阅读0评论SEO资源
  • 内容介绍
  • 相关推荐

本文共计2387个文字,预计阅读时间需要10分钟。

中小型应用如何通过轻量级OSS实现高效运维?

高效性、资源占用低的中型项目运维实践分享。源自轻量应用服务器用户投稿活动,已获得(某公司)工作室授权发布。

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

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

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

一、架构设计

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

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

中小型应用如何通过轻量级OSS实现高效运维?

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

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

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

二、网关配置

选用 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 账号密码,请通过 doc.traefik.io/traefik/middlewares/basicauth 路径生成。

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

YAML acme-staging-v02.api.letsencrypt.org/directory" # test server accessLog: filePath: "/root/log/access.log.json" format: "json"

通过 docker-compose up -d 完成网关的部署;通过访问 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.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 # 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 '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: oss-cn-hangzhou.aliyuncs.com folder: ./dist/build/h5

五、日志管理

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

我们的目标为,每个应用的开发者都可以下载到自己应用的日志文件。作者开发过一个小工具,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.webdav.be.wizzstudio.com/orientation-system-be/orientation-system-be 访问日志文件了。用户名 user1,密码 pass1,而且只具有只读权限。

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

六、总结

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

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

本文共计2387个文字,预计阅读时间需要10分钟。

中小型应用如何通过轻量级OSS实现高效运维?

高效性、资源占用低的中型项目运维实践分享。源自轻量应用服务器用户投稿活动,已获得(某公司)工作室授权发布。

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

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

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

一、架构设计

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

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

中小型应用如何通过轻量级OSS实现高效运维?

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

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

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

二、网关配置

选用 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 账号密码,请通过 doc.traefik.io/traefik/middlewares/basicauth 路径生成。

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

YAML acme-staging-v02.api.letsencrypt.org/directory" # test server accessLog: filePath: "/root/log/access.log.json" format: "json"

通过 docker-compose up -d 完成网关的部署;通过访问 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.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 # 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 '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: oss-cn-hangzhou.aliyuncs.com folder: ./dist/build/h5

五、日志管理

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

我们的目标为,每个应用的开发者都可以下载到自己应用的日志文件。作者开发过一个小工具,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.webdav.be.wizzstudio.com/orientation-system-be/orientation-system-be 访问日志文件了。用户名 user1,密码 pass1,而且只具有只读权限。

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

六、总结

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

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