ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

supervisor + nginx + gunicorn 搭建Django项目

2021-01-10 18:58:35  阅读:372  来源: 互联网

标签:supervisor gunicorn 项目 projectname 配置 Django nginx proxy


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

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

环境及配置:

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

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

supervisor, nginx, gunicorn, virtualenv

  • 先安装virtualenv
    pip install virtualenv

  • 创建虚拟环境
    如果是想使用系统默认的python版本进行创建, 则运行
    virtualenv 虚拟环境名称

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

  • 创建完毕后, 然后进入该虚拟环境
    source 虚拟环境路径/虚拟环境名称/bin/activate

  • 然后我们需要将项目的依赖, 也就是项目所需要的第三方库都安装好
    如果项目中携带有requirements.txt文件, 则执行
    pip install -r requirements.txt
    没有的话则执行
    pip install XXX

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

  • .env文件配置
    我们的项目某些环境配置不是写死的, settings.py文件需要用到.env文件来进行参数配置, 所以我们还需要配置一下.env文件. 这个情况下需要看大家自己的项目需要配置哪些参数, 我就不写出来了, .env文件的参数配置随自己的项目而定; 如果是需要用到.env文件但又忘记配置则可能会在运行项目时出现一些奇奇怪怪的错误

  • 安装gunicorn
    pip安装就行
    安装完了之后, 执行以下命令检验是否运行成功
    gunicorn --env DJANGO_SETTINGS_MODULE=(settings文件所在目录的名称).settings -b:8000 (settings文件所在目录的名称).wsgi
    如果没有看到报错那么也就是说运行成功了, ctrl+c将运行中的gunicorn停止

  • 第三方库都安装完之后, 运行项目
    python manage.py runserver
    通常来说项目没问题, 依赖都安装好了之后就不会报错, 如果报错请检查是否都将依赖都安装完整了或者是否配置了.env文件(当然有些项目是不需要.env文件的就略过)

使用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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有