繁体   English   中英

如何将 django/gunicorn 应用程序部署为系统服务?

[英]How to deploy a django/gunicorn application as a systemd service?

语境

在过去的几年里,我一直只使用docker来容器化和分发 django 应用程序。 第一次,我被要求设置一些东西,以便它可以用旧的方式部署。 我正在寻找一种方法来几乎达到我习惯的封装自动化水平,同时避免任何陷阱

当前启发式

所以,应用程序( my_app ):

  • 构建为.whl
  • 带有枪炮
  • 发布在私人 Nexus 上,并且
  • 可以通过简单的pip install安装在任何客户端的服务器上

(它依赖于 Apache 作为反向代理/static 文件服务器和 Postgresql 但这与本次讨论无关)

为了确保该应用程序将保持可用,我考虑将其作为由systemd管理的服务运行。 根据这篇文章,/etc/systemd/system/ /etc/systemd/system/my_app.service可能看起来像这样

[Unit]
Description=My app service
After=network.target
StartLimitIntervalSec=0[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=gunicorn my_app.wsgi:application --bind 8000

[Install]
WantedBy=multi-user.target

而且,据我所知,我可以为该服务提供环境变量,以供os.environ.get()/etc/systemd/system/my_app.service.d/.env中的某处读取

SECRET_KEY=somthing
SQL_ENGINE=somthing
SQL_DATABASE=somthing
SQL_USER=somthing
SQL_PASSWORD=somthing
SQL_HOST=somthing
SQL_PORT=somthing
DATABASE=somthing

开题

  1. 首先,是否有任何明显的陷阱?
  2. 升级 pip install --upgrade my_app之后重启服务是否足以升级应用程序?
  3. 库冲突是否有可能确保gunicorn my_app.wsgi:application将使用项目使用的正确版本的库? 或者我需要使用virtualenv吗? 如果是这样,应该在ExecStart中使用source /path/to/the/venv/bin/activate还是有更简洁的方法来确保ExecStart在单独的虚拟环境中运行?
  4. python manage.py migratepython manage.py collectstatic应该在哪里? 我应该使用 /etc/systemd/system/my_app.service 中的那些吗

也许你可以试试,但我也不确定它是否有效。 这是针对第三个问题。

您必须创建一个virtualenv ,在其中安装gunicorndjango

  1. 创建一个文件 python 像这样“gunicorn_config.py”
  2. 像这样填写,或者可以根据需要调整:
#gunicorn_config.py

command = 'env/bin/gunicorn'

pythonpath = 'env/myproject'

bind = '127.0.0.1:8000'
  1. systemd ExecStart中填写env/bin/gunicorn -c env/gunicorn_config.py myproject.wsgi

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM