我正在尝试配置一个由 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] 文件
需要创建三个文件
- uwsgi配置文件(INI格式):django_03.ini
- SystemD 服务单元:django_03.service
- 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/