Nginx+Gunicorn+Venv+Supervisor+Django

mac2024-05-18  34

Nginx+Gunicorn+Venv+Supervisor+Django

项目路径:/home/zyh/projects/mytestProject1/mysite

一:添加虚拟环境venv

切换到项目路径

cd /home/zyh/projects/mytestProject1/mysite

新建虚拟环境python3_venv

python -m venv python3_venv

激活

source python3_venv/bin/activate

下载项目所需第三方库

pip install -r requirements.txt

二:配置Gunicorn

虚拟环境中安装gunicorn

pip install gunicorn

测试开启服务(可选):

cd /home/zyh/projects/mytestProject1/mysite gunicorn mysite.wsgi:application --bind 127.0.0.1:9000 # 9000 为gunicorn端口

编写gunicorn脚本文件

1. cd /home/zyh/projects/mytestProject1/mysite 2. touch gunicorn_start.sh # 新建gunicorn文件

插入代码

#!/bin/bash NAME="mysite" DIR=/home/zyh/projects/mytestProject1/mysite USER=zyh GROUP=zyh WORKERS=3 BIND=127.0.0.1:9000 DJANGO_SETTINGS_MODULE=mysite.settings DJANGO_WSGI_MODULE=mysite.wsgi LOG_LEVEL=error cd $DIR source ../python3_venv/bin/activate export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE export PYTHONPATH=$DIR:$PYTHONPATH exec ../python3_venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \ --name $NAME \ --workers $WORKERS \ --bind=$BIND \ --log-level=$LOG_LEVEL \ --log-file=-

修改权限为可执行模式

sudo chmod u+x bin/gunicorn_start

三:配置Supervisor

虚拟环境中安装supervisor

pip install supervisor

生成配置文件

cd /etc/supervisor echo_supervisord_conf > /etc/supervisord.conf sudo vim supervisord.conf

修改代码

[unix_http_server] file=/var/run/supervisor.sock (修改成当前) [supervisord] logfile=/var/log/supervisord.log(修改成当前) pidfile=/var/run/supervisord.pid(修改成当前) [supervisorctl] serverurl=unix:///var/run/supervisor.sock(修改成当前) 最后一行改为:files = /etc/supervisor/conf.d/*.conf

编辑自己的mysite.conf文件

cd conf.d touch mysite.conf

插入代码

[program:mysite] command =/home/zyh/projects/mytestProject1/mysite/gunicorn_start.sh(执行gunicorn文件) user = zyh autostart=true autorestart=true redirect_stderr = true stdout_logfile =/home/zyh/projects/mytestProject1/mysite/logs/robot.log stderr_logfile=/home/zyh/projects/mytestProject1/mysite/logs/err.log

也可以直接在supervisord.conf中插入代码

删除最后一行files = /etc/supervisor/conf.d/*.conf

[program:mysite] command =/home/zyh/projects/mytestProject1/mysite/gunicorn_start.sh(执行gunicorn文件) user = zyh autostart=true autorestart=true redirect_stderr = true stdout_logfile =/home/zyh/projects/mytestProject1/mysite/logs/robot.log stderr_logfile=/home/zyh/projects/mytestProject1/mysite/logs/err.log

新建logs文件夹

cd /home/zyh/projects/mytestProject1/mysite mkdir logs

调试

启动 $ supervisord -c /etc/supervisor/supervisord.conf $ sudo supervisorctl reread mysite: available $ sudo supervisorctl update mysite: added process group 查看所有服务状态 $ sudo supervisorctl status mysite RUNNING pid 18020, uptime 0:00:50 停止服务 $ sudo supervisorctl stop mysite mysite: stopped 开启服务 $ sudo supervisorctl start mysite mysite: started 重启服务 $ sudo supervisorctl restart mysite mysite: stopped mysite: started

四:配置Nginx

下载

sudo apt install nginx

新建dj.conf文件

cd /etc/nginx/sites-available/ touch dj.conf

插入代码

server { listen 8000; # 监听端口(前端访问端口) server_name 192.168.153.189; # IP或者域名(前端访问) charset utf-8; client_max_body_size 75M; location / { proxy_pass http://127.0.0.1:9000; # gunicorn的bind proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /static { #这里做了访问静态目录不走uwsgi/gunicorn #expires 30d; #autoindex on; #add_header Cache-Control private; alias /home/zyh/projects/mytestProject1/mysite/staticfiles; } }

创建软连接

sudo ln -s /etc/nginx/sites-available/dj.conf /etc/nginx/sites-enabled/dj.conf # 必须为绝对路径

删除默认文件

sudo rm /etc/nginx/sites-enabled/default

重启nginx

sudo service nginx restart或sudo service nginx start

五:关于Django的静态文件

DEBUG = False

项目下新建static,staticfiles文件夹

setting.py:

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]

url.py:

from django.urls import path, re_path, include from django.conf.urls import url from django.contrib import admin from django.views import static from django.conf import settings urlpatterns = [ #re_path(r'^admin/', admin.site.urls), #path('polls/', include('polls.urls')), url(r'^static/(?P<path>.*)$', static.serve, {'document_root': settings.STATIC_ROOT}, name='static'), ]

设置nginx

cd /etc/nginx/sites-available 将所有.conf文件中server下添加: location /static { #这里做了访问静态目录不走uwsgi/gunicorn expires 30d; # 可选 autoindex on; # 可选 add_header Cache-Control private; # 可选 alias /home/zyh/projects/mytestProject1/mysite/staticfiles; }

收集静态文件:

python manage.py collectstatic sudo service nginx restart # 重启nginx

六:supervisor开机自启

配置系统文件

cd /lib/systemd/system vim supervisord.service

插入代码

[Unit] Description=Supervisord Service [Service] Type=forking ExecStart=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisord -c /etc/supervisor/supervisord.conf ExecStop=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisorctl $OPTIONS shutdown ExecReload=/home/zyh/projects/mytestProject1/python3_venv/bin/supervisorctl $OPTIONS reload KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target

重新加载

systemctl daemon-reload

激活开机启动

systemctl enable supervisord.service

七:常用命令

后台运行‘cmd’

$ nohup ‘cmd’

查看端口

netstat -nlpt | grep 9090

查看关键字

ps -aux | grep gunicorn

kill 端口

sudo fuser -k 8000/tcp

八:理解

客户通过nginx:8000端口提交请求,nginx将动态请求分给gunicorn:9000端口,gunicorn通过Django执行后台程序后返回response给nginx,再返回给客服端;将静态请求设置缓存。supervisor检测gunicorn是否一直处于运行状态。

最新回复(0)