部署注意事项
为了完成本章,我还要讨论应用程序部署的变化。 为了支持后台任务,我在部署栈中增加了两个新组件,一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论