返回介绍

部署注意事项

发布于 2025-01-02 21:54:01 字数 3021 浏览 0 评论 0 收藏 0

为了完成本章,我还要讨论应用程序部署的变化。 为了支持后台任务,我在部署栈中增加了两个新组件,一个 Redis 服务器和一/多个 RQ worker。 很明显,它们需要包含在部署策略中,因此我将简要介绍前几章中不同部署方式的一些调整。

部署到 Linux 服务器

如果你正在 Linux 服务器上运行应用,则添加 Redis 十分简单。 对于 Ubuntu Linux,你可以运行 sudo apt-get install redis-server 来安装 Redis 服务器。

要运行 RQ worker 进程,可以按照 第十七章 中“设置 Gunicorn 和 Supervisor”一节那样创建第二个 Supervisor 配置,在其中运行的命令改成 rq worker microblog-tasks 。 如果你想要运行多个 worker(假设是生产环境),则可以使用 Supervisor 的 numprocs 指令来指示要同时运行多少个实例。

部署到 Heroku

要在 Heroku 上部署应用,你需要将 Redis 服务添加到你的帐户。 这与我添加 Postgres 数据库的过程类似。 Redis 也有一个免费档次,可以使用以下命令添加:

$ heroku addons:create heroku-redis:hobby-dev

新的 redis 服务的访问 URL 将作为 REDIS_URL 变量添加到你的 Heroku 环境中,这正是应用所需的。

Heroku 的免费方案允许同时启动一个 web 进程和一个 worker 进程,因此你可以在免费的情况下启动一个 rq worker 进程。 为此,你将需要在 procfile 的一个单独的行中声明 worker:

web: flask db upgrade; flask translate compile; gunicorn microblog:app
worker: rq worker microblog-tasks

将这些变更重新部署之后,可以使用以下命令启动 worker:

$ heroku ps:scale worker=1

部署到 Docker

如果你将应用程序部署到 Docker 容器,那么首先需要创建一个 Redis 容器。 为此,你可以使用 Docker 镜像仓库中的其中一个官方 Redis 镜像:

$ docker run --name redis -d -p 6379:6379 redis:3-alpine

当运行你的应用时,你需要以类似于 MySQL 容器的链接方式,链接 redis 容器并设置 REDIS_URL 环境变量。 下面是一个完整的命令来启动应用,包含了一个 redis 链接:

$ docker run --name microblog -d -p 8000:5000 --rm -e SECRET_KEY=my-secret-key \
    -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \
    -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \
    --link mysql:dbserver --link redis:redis-server \
    -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \
    -e REDIS_URL=redis://redis-server:6379/0 \
    microblog:latest

最后,你需要为 RQ worker 运行一/多个容器。 由于 worker 与主应用具有相同的代码,因此可以使用与应用相同的容器镜像,并覆盖启动命令,以便启动 worker 而不是 Web 应用。 以下是启动 worker 的 docker run 命令:

$ docker run --name rq-worker -d --rm -e SECRET_KEY=my-secret-key \
    -e MAIL_SERVER=smtp.googlemail.com -e MAIL_PORT=587 -e MAIL_USE_TLS=true \
    -e MAIL_USERNAME=<your-gmail-username> -e MAIL_PASSWORD=<your-gmail-password> \
    --link mysql:dbserver --link redis:redis-server \
    -e DATABASE_URL=mysql+pymysql://microblog:<database-password>@dbserver/microblog \
    -e REDIS_URL=redis://redis-server:6379/0 \
    --entrypoint venv/bin/rq \
    microblog:latest worker -u redis://redis-server:6379/0 microblog-tasks

覆盖 Docker 镜像的默认启动命令有点棘手,因为命令需要分两部分给出。 --entrypoint 参数只取得可执行文件的名称,但是参数(如果有的话)需要在镜像和标签之后,也就是在命令行的结尾处给出。 请注意 rq 命令需要使用 venv/bin/rq ,以便在没有手动激活虚拟环境的情况下,也能识别虚拟环境并正常工作。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文