django+nginx+gunicorn+supervisord部署配置

django+nginx+gunicorn+supervisord部署配置,第1张

一、背景介绍

后端服务是Django框架编写的,需要使用Gunicorn进行服务托管,使用supervisord进行保持活跃,最后通过Nginx向外提供服务

二、nginx+gunicorn 安装和配置 2.1 软件安装  nginx 安装

在centos上支持yum 直接安装,其他系统请自行搜索安装方式

$ yum install nginx
gunicorn 安装

gunicorn只是一个Python的库 这里建议使用pip安装,简单方便
附:要么网络好,要么建议更改pip源为豆瓣源

$ pip install gunicorn

注:

  • 如果没有pip需要首先安装pip
  • 如果是Python3 请使用pip3
  • 由于服务器就跑一个Python应用,就使用了全局安装,如果你的服务器上运行了多个Python应用,并使用了不同的环境(版本号),建议使用不同的虚拟环境
2.2 环境配置

首先把你的django服务放在服务器合适的地方

2.2 nginx配置
server {
        listen       80 ;
        listen       [::]:80 ;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;


        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location /images {
            alias /data/images;
        }
        location / {
            proxy_max_temp_file_size 0;
            proxy_next_upstream off;
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host  $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Remote_Addr $remote_addr;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
  • listen是所需要监听的端口
  • server_name是需要绑定的域名,暂时没有域名时,请使用ip
  • access_log是确定正常状态下log文件位置
  • error_log使确定发生错误时log文件位置
  • location / 是当访问到根下的时候,将所有请求转发到127.0.0.1:8000,本文使转发到gunicorn启动的django应用上,中间配置的是需要转发的内容,基本上述内容可以满足大多需求,如需特殊需求请自行查看nginx官方文档
  • location /static/ 配置了静态文件所在的路径,静态文件由nginx处理,动态转发到django,如不配置会出现站点引用的所有js css都找不到

/root/envs/joops/bin/gunicorn joops.wsgi:application -c /data/joops/gunicorn.py
gunicorn配置

gunicorn启动一般有两种方式,可以在项目目录下建立gunicorn.conf.py配置文件,也可以在启动gunicorn时直接加上相关命令

需要在项目的settings.py中的INSTALLED_APPS添加gunicorn:

INSTALLED_APPS = [
    ...
    ...
    'gunicorn',  # 部署用
]

gunicorn.conf.py文件

import multiprocessing

bind = "127.0.0.1:8000"   #绑定的ip与端口
workers = 2                #核心数
errorlog = '/home/xxx/xxx/gunicorn.error.log' #发生错误时log的路径
accesslog = '/home/xxx/xxx/gunicorn.access.log' #正常时的log路径
#loglevel = 'debug'   #日志等级
proc_name = 'gunicorn_project'   #进程名

如还需要其他配置,可以自行查看官方文档

直接使用gunicron启动

gunicron需要启动后需要长期运行在后台,如果直接启动会在关闭终端后进程就被杀死,这肯定不是我们的需求,所以这里给出两种解决方式

  1. 使用Linux自带的nohup命令
    不使用gunicorn配置文件(需进入项目目录)
$ sudo nohup gunicorn 项目名.wsgi:application -b 127.0.0.1:8000&

使用配置文件方式

$ sudo nohup gunicorn 项目名.wsgi:application -c /home/xxx/xxx/gunicorn.conf.py& 
  1. 使用supervistor进程管理器
    supervistor工具使用方法可参考博客Supervisor的使用_胡伟煌的博客-CSDN博客_supervisor,也可以直接查看官方文档
    配置文件:
[program:joops]
command=/root/envs/joops/bin/gunicorn joops.wsgi:application -c /data/joops/gunicorn.py ;
directory=/data/joops/ ;
stdout_logfile=/data/log/supervisor/joops/joops.log ;
redirect_stderr = true  ;
stdout_logfile_maxbytes = 200MB  ;
stdout_logfile_backups = 10     ;
autostart = true ;
startsecs = 5 ;
autorestart = true ;
startretries = 3 ;
user = root ;
三、启动站点
  1. 加载nginx配置文件重启nginx
$ sudo systemctl nginx reload
$ sudo systemctl nginx restart 
//执行一种即可
  1. 启动gunicorn
  • 如果使用supervistor:
$ sudo supervisorctl reload
  • 如果使用nohup
$ sudo nohup gunicorn 项目名.wsgi:application -b 127.0.0.1:8000&
四、前后端分离配置
  1. 在一些前后端分离项目,可能还需要配置前端静态页面,此时就不能将所有url都转发到django了,需要配置一个前缀,但此时,django自带的后台管理也会出现问题,建议配置一个/admin,所以,最后我的配置nginx文件如下:
server {
    listen 80;
    server_name 192.168.84.199;
    server_name_in_redirect off;
    access_log /home/webserver/web/nginx.access.log;
    error_log /home/webserver/web/nginx.error.log;

    index login.html;
    root /home/webserver/web/html/WebHtml/;

    location / {
        try_files $uri $uri/ =404;
    }

    location /apis {
        rewrite ^.+apis/?(.*)$ / break;
        proxy_pass http://127.0.0.1:8000;
        proxy_pass_header       Authorization;
        proxy_pass_header       WWW-Authenticate;
        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 /admin {
        proxy_pass http://127.0.0.1:8000;
        proxy_pass_header       Authorization;
        proxy_pass_header       WWW-Authenticate;
        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/ {
        root /home/webserver/web/WebServer/;
    }
  1. 收集使用的admin或者其他库含有的静态文件
    在django项目的settings.py添加如下代码:
# 收集app静态文件到项目目录使nginx能访问到
STATIC_ROOT = os.path.join(BASE_DIR, "static")

# 执行python manage.py collectstatic
STATICFILES_FINDERS = (
    "django.contrib.staticfiles.finders.FileSystemFinder",
    "django.contrib.staticfiles.finders.AppDirectoriesFinder"
)

然后在终端中进入项目目录在终端执行:

$ python manage.py collectstatic

将会自动将app中所含有的静态文件自动收集到项目的setting目录下,解决了某些app,比如admin在部署后找不到静态文件的现象

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/739899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存