系统相关
首页 > 系统相关> > supervisor + nginx + gunicorn 搭建Django项目

supervisor + nginx + gunicorn 搭建Django项目

作者:互联网

在服务器上部署项目, 然后再在这里记录部署流程

首先我们需要将项目git clone 到我们的服务器上, 主角来了才能开场

环境及配置:

系统ubuntu20.04.1 LTS, 语言及版本python3.8

需要用到的工具及第三方库

supervisor, nginx, gunicorn, virtualenv

如果是要创建指定Python版本的虚拟环境则需要了解到该版本的Python安装到了哪里, 由于我的服务器是ubuntu, /usr/bin/python3.8是Python的安装路径, 找到python的安装路径后, 则运行
virtualenv -p python安装路径 虚拟环境名称

需要注意的是, 我在登录该服务器时使用的不是超级管理员的账户, 所以某些命令需要使用到sudo才能执行;在全局环境中使用pip安装第三方库会提示你没有权限安装, 需要在pip命令前面加上sudo; 然而在虚拟环境中, 不需要使用到sudo去执行pip命令, 如果用sudo去执行pip命令的话会将依赖包都安装到了全局环境, 而不是虚拟环境

使用runserver命令运行成功了的话就说明目前项目运行状况是没有问题的, 接下来就得配置nginx还有supervisor了.

nginx配置

以往我们在测试机上配置项目的nginx文件的时候是配置在了**/etc/nginx/conf.d/目录下, 现在我们是配置在了/etc/nginx/sites-enabled/**目录下, 我记得我之前也在该机子上配置了另一个项目的nginx配置文件在conf.d文件夹下, 后来我找不到了, 还以为被吃了, 原来被同事换到sites-enabled文件夹下了(哈哈哈好尴尬哦)
然后我们开始配置nginx文件, 下面放出该项目的配置

server {
    listen       80; 
    server_name  http://127.0.0.1:8000;  # 注意按照自己的项目配置好
    client_body_in_single_buffer on; 
    client_max_body_size 100m;
    client_header_buffer_size 50m;
    large_client_header_buffers 4 20m;

    access_log /var/log/nginx/projectname-access.log; # 这里是nginx输出日志的配置
    error_log /var/log/nginx/projectname-error.log;  # 这里是nginx输出错误日志的配置
    
    # inventory management webapp 我们项目是前后端分离的, 这里是前端的配置
    location /_nex/ {
        alias /mnt/data/projectname/web-name/out/_next/;
    }   

    # inventory management webapp 我们项目是前后端分离的, 这里是前端的配置
    # 需要注意的是, 当所有的配置都完成后, 记得build一下前端, 不然有可能会出现无限重定向的问题导致500, 暂时不需要修改下面的last参数
    location / {
        alias /mnt/data/projectname/web-name/out/;
        if (!-e $request_filename){
            rewrite ^(.*)$ $1.html last;
        }   
    }   

    location /api {
        proxy_pass http://127.0.0.1:8000/api;  # 注意按照自己的项目配置好
        proxy_redirect off;
        proxy_set_header        Host    $host;
        proxy_set_header        REMOTE_ADDR     $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        real_ip_recursive on;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

supervisor配置

我把项目的supervisor配置文件写到了**/etc/supervisor/conf.d/**下, 以下是该项目的supervisor配置

# 注意将projectname改为你的项目名称
[group:projectname]
programs:projectname_django, projectname_celery

[program:projectname_django]
autorestart=true
command=/mnt/data/projectname/projectname-venv/bin/gunicorn projectname.wsgi --reload --access-logfile '-' --error-logfile '-' -w 5 -k gthread -b 127.0.0.1:8000
directory=/mnt/data/projectname
process_name=%(program_name)s-%(process_num)01d
numprocs=1
numprocs_start=0
user = ubuntu
redirect_stderr=true
stdout_logfile_maxbytes = 100MB
stdout_logfile_backups = 20
# supervisor的运行日志配置
stdout_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)01d.log
# supervisor的错误日志配置
stderr_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)-error.log

# 如果项目中有使用到celery则需要配置上celery
[program:projectname_celery]
autorestart=true
command=/mnt/data/projectname/projectname-venv/bin/celery -A projectname worker -l info
directory=/mnt/data/projectname
process_name=%(program_name)s-%(process_num)01d
numprocs=1
numprocs_start=0
redirect_stderr=true
stdout_logfile=/mnt/data/projectname/logs-projectname/%(program_name)s-%(process_num)01d.log

我们可以将projectname_django里的command参数命令拿出来在系统中执行, 看看是否能够正常运行, 也就是
/mnt/data/projectname/projectname-venv/bin/gunicorn projectname.wsgi --reload --access-logfile '-' --error-logfile '-' -w 5 -k gthread -b 127.0.0.1:8000
(注意到了吗, 我们已经将gunicorn的启动命令放到这里来了)

运行结果没报错的话就没什么大问题了, 要是不成功的话就按照提示修复一下吧, 单独将其提取出来运行是为了减少排错时间, 可以减少时间成本(废话)

项目启动

以上都完成了之后, 项目的配置就基本完成了, 然后我们就需要将项目启动

启动supervisor托管

项目的启动我们已经交给了supervisor托管了, 所以我们需要将supervisor启动就可以了, 当supervisor在管理着众多项目时, 我们不可能将supervisor都重启, 我们只需要将该项目的supervisor托管启动就行了
sudo supervisorctl restart projectname:*
命令中的 ’ * ’ 号包括了我们在配置文件中的两个配置: projectname_django和 projectname_celery, 你也可以执行
sudo supervisorctl restart projectname:projectname_django
sudo supervisorctl restart projectname:projectname_celery

重启nginx

每当我们更新了nginx配置的时候, 我们需要将nginx重启
sudo /etc/init.d/nginx reload

然后再在浏览器按照你配置的域名去访问就能看到你的项目了
如果报错了, 就先看看nginx报错日志, 如果nginx报错日志没有输出, 那么就需要在supervisor的报错日志里面去查看

遇事不要慌~
不要慌, 问题不大; 问题很大, 慌也没用

参考文章

Nginx+Gunicorn+Supervisor 搭建 Django 项目环境

在 Linux 上部署 Django 应用,nginx+gunicorn+supervisor

标签:supervisor,gunicorn,项目,projectname,配置,Django,nginx,proxy
来源: https://blog.csdn.net/ZohKnow/article/details/112427116