python - 如何在由 uswgi 提供服务并由 systemd 服务启动的虚拟环境中配置 Django 应用程序?

标签 python django linux uwsgi systemd

我正在尝试配置一个由 uwsgi 提供服务的基本 Django 应用程序,以便可以从 CentoS 7.X 服务器上的 systemd 启动它。

到目前为止,我的 SystemD 服务已启动(事件且处于运行状态),但在配置的端口上无法访问应用程序。请注意,应用程序正在 Python 虚拟环境中运行。

  • Systemd 服务已激活并正在运行
  • uwsgi工作进程是 活跃
  • 绑定(bind)到 TCP 8003 的套接字处于 LISTEN 状态

SystemD 单元文件

# /etc/systemd/system/django_03.service

[Unit]
Description=My Django app
Requires=network.target
After=network.target
After=syslog.target

[Service]
TimeoutStartSec=0
RestartSec=10
Restart=always
User=myuser
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog
RuntimeDirectory=uwsgi
ExecStart=/bin/bash -c 'cd /opt/scripts/django/django_03; source django_03_env/bin/activate; uwsgi --ini /opt/scripts/django/django_03/django_03.ini'

[Install]
WantedBy=multi-user.target

uwsgi配置文件

# /opt/scripts/django/django_03/django_03.ini

[uwsgi]
module = wsgi:application
master = true
processes = 5
socket = 127.0.0.1:8003
chmod-socket = 664
vacuum = true
die-on-term = true

Django 应用程序

# wsgi.py
def application(environ, response):
    response('200 OK', [('Content-Type', 'text/html')])
    return [b"Test OK (Django 03) !!"]

感谢您的帮助

最佳答案

在此示例中,systemd 服务名为“django_03”,Python 虚拟环境名称为“django_03_env”,Python 应用程序为“wsgi”,可调用名为“application”。

1]先决条件

为Python代码、配置文件和虚拟环境创建根目录:

mkdir /opt/scripts/django/django_03

创建虚拟环境

cd /opt/scripts/django/django_03
python3 -m venv django_03_env

启动虚拟环境

source django_03_env/bin/activate

安装 Django 和 uwsgi

pip install django
pip install uwsgi

2] 文件

需要创建三个文件

  1. uwsgi配置文件(INI格式):django_03.ini
  2. SystemD 服务单元:django_03.service
  3. Python 应用程序:wsgi.py

2.1 SystemD单元文件

# /etc/systemd/system/django_03.service

[Unit]
Description=My Django app
Requires=network.target
After=network.target
After=syslog.target

[Service]
TimeoutStartSec=0
RestartSec=10
Restart=always
User=myuser
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog
RuntimeDirectory=uwsgi
# Main call: Virtual env is activated and uwsgi is started with INI file as argument
ExecStart=/bin/bash -c 'cd /opt/scripts/django/django_03; source django_03_env/bin/activate; uwsgi --ini /opt/scripts/django/django_03/django_03.ini'

[Install]
WantedBy=multi-user.target

2.2 uwsgi配置文件

# /opt/scripts/django/django_03/django_03.ini

[uwsgi]
# "callable": Application entry point, <Python filename without extension: application method name>
module = wsgi:application
# Master process for uwsgi
master = true
# Worker processes for uwsgi
processes = 5
# uwsgi protocol modification
protocol = http
# Socket format X.X.X.X:<port number>
socket = 127.0.0.1:8003

chmod-socket = 664
vacuum = true
die-on-term = true

2.3 Django应用程序文件

# /opt/scripts/django/django_03/wsgi.py

# Application callable (main entry point)
def application(environ, response):
    response('200 OK', [('Content-Type', 'text/html')])
    return [b"Test OK (Django 03) !!"]

III]管理应用程序

Django 应用程序现在可以通过常规 systemd 命令启动:

sudo systemctl start django_03

验证systemd服务状态

sudo systemctl -l status django_03
journalctl -u django_03

验证 HTTP 套接字正在监听

netstat -ntap | grep 8003

验证 HTTP 响应:

curl http://127.0.0.1:8003

请注意,默认情况下,uwsgi 使用其默认的传输协议(protocol)进行操作,该协议(protocol)不是 HTTP。不建议使用 uwsgi HTTP 套接字,最好的设置是使用 uswgi 默认协议(protocol)和前面的反向代理(NGINX、Apache HTTPd)。当然,这里提供的代码远非完美,可能会根据您的需求进行优化和定制。

关于python - 如何在由 uswgi 提供服务并由 systemd 服务启动的虚拟环境中配置 Django 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57855517/

相关文章:

python - 使用 GAEbulkloader 时出错 : Unable to download kind stats

python - 如何检查函数是否阻塞?

linux - 如何将两个文件夹区分为多个补丁文件

Python - 我可以使用 for 循环打印出具有连续数字的变量吗?

python - 从 python 中的函数返回的问题在哪里?

python - 如何在 Django 上使用 Plotly 创建图表?

python - Django 最佳实践——比较用户

python - Django 按规则自动递增 IntegerField

c++ - 用于 Linux 上 C++ 的带有 GUI 的调试器

linux - 抄送: unrecognized option '-KPIC'