Django + Nginx + Gunicorn 部署

一、前期准备工作

1、版本

  • Ubuntu 18
  • python 3.6.5
  • Django 1.11.12
  • Nginx 1.14.0
  • Gunicorn 19.9.0
  • gevent 1.4.0

2、安装(服务器)

  1. nginx
    sudo apt install nginx
    
  2. 安装python3(已经安装请忽略)
    # ubuntu 18 自带的就是3.6.5 其它Ubuntu版本的请使用命令安装
    sudo apt update
    sudo apt install python3.6
    
  3. 安装pip(已经安装请忽略)
    sudo apt-get install python3-pip
    
  4. 安装虚拟环境
    sudo pip install virtualenv
    

二、Django项目

1、修改相关配置

  1. 关闭debug,修改hosts


    image
  2. 修改数据连接, 例如下图所示


    image
  3. 将静态文件打包
    image

    使用命令 collectstatic
    image

    收集完成之后如下图所示
    image
  4. 导出项目所依赖的库到项目根目录
    pip freeze > requirements.txt
    
  5. 注意
    一定要确保你的项目在本地运行没有问题,否则在服务器终端下出了问题对于新手来说不好解决

2、项目上传

  1. 注意
    最好将本地项目复制一份,然后将项目下的虚拟环境删除
  2. 在windows下可以使用图形化界面工具WinScp或者Xshel
    scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
    
  3. linux或者mac使用命令
    scp -r 本地项目根目录绝对路径 服务器用户名@服务器ip地址:上传服务器的目录
    
    scp /home/xxx/work/PycharmProjects/DjangoDeployExample test@192.168.0.112:/home/www/django
    

3、连接远程服务器创建虚拟环境

  1. 说明
    由于python兼容性的问题,不建议在全局环境中部署,而且一个服务器有可能部署多个项目,所以推荐在虚拟环境中部署
  2. 连接远程服务器
    ssh 用户名@IP地址 -p 端口号(默认80)
    
  3. 安装虚拟环境
    sudo pip install virtualenv
    
  4. 创建虚拟环境
    # 1.在项目的根目录(建议),也可以在其他地方均可
    cd /home/www/django
    # 创建虚拟环境,名字随意
    virtualenv venv
    
  5. 激活虚拟环境
    source .venv//bin/activate
    
    image

4、导入虚拟环境

  1. 使用pip
    pip install -r requirement.txt
    

三、Gunicorn

1、安装

  1. 在项目的虚拟环境安装gunicorn
    # 如果下载速度过慢使用国内源
    pip3 install gunicorn -i https://pypi.douban.com/simple
    
  2. 在项目的虚拟环境中安装gevent
    # 基于协程的库,提高并发量
    pip3 install gevent -i https://pypi.douban.com/simple
    

2、通过Gunicorn启动项目

2.1、命令启动(不推荐)

  1. 命令
    # 常见的参数
    gunicorn -w 10 -k 'gevent' -b 0.0.0.0:9000 DjangoDeployExample.wsgi:application --reload -t 500 -D --access-logfile logs/gunicorn.log
    
  2. 参数说明
    参数 说明 备注
    -w 10 开启10个进程 根据服务器配置来定
    -k 'gevent' 使用gevent异步模式,提高了响应速度。 必须先安装好gevent
    -b 0.0.0.0:9000 表示绑定ip地址和端口
    DjangoDeployExample.wsgi:application settings.py文件同级目录的wsgi.py中 这里使用的是相对路径
    -–reload 监听到项目文件变动自动重启gunicorn 生效
    -D 让命令后台执行 如果想看命令错误可不要
    -t 500 配置每个请求的超时时间为500秒
    –access-logfile logs/gunicorn.log 将请求日志保存到该文件中 logs目录必须创建
  3. 示例图


    image

    image
  4. 备注
    详细参数,请看其他附录

2.2、通过配置文件启动(常用)

  1. 创建gunicorn.conf文件
    # 并行工作进程数
    workers = 4
    # 指定每个进程的线程数
    threads = 2
    # 监听内网端口8000
    bind = '192.168.58.44:8000'
    # 设置守护进程(linux有效)
    daemon = 'true'
    # 工作模式协程
    worker_class = 'gevent'
    # 设置最大并发量
    worker_connections = 2000
    # 设置进程文件目录
    pidfile = '/home/xxx/work/DjangoDeployExample/product/gunicorn//gunicorn.pid'
    # 设置访问日志和错误信息日志路径
    accesslog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_acess.log'
    errorlog = '/home/xxx/work/DjangoDeployExample/product/gunicorn/logs/gunicorn_error.log'
    # 设置日志记录水平
    loglevel = 'error'
    
  2. 启动
    gunicorn -c gunicorn.conf DjangoDeployExample.wsgi:application
    
  3. 注意
    • 注意用户权限问题,比如pid文件 访问日志 errorlog 如果权限不够可以给目录授权一下

四、nginx

1、说明

本教程是通过命令安装,一般默认安装在/etc/nginx/,下载安装包的安装的可以根据自己的目录来配置,具体的一些细节这里不介绍,具体请自行查询

注意:在系统的命令窗口中使用,上面都是在虚拟环境下使用

2、命令介绍

  1. 查看nginx是否启动
    ps aux|grep nginx
    
    image
  2. 检查nginx配置文件是否有错:
    # -t 测试     nginx的配置文件
    sudo nginx -t xxx/xxx/nginx.conf
    
  3. 通过配置文件启动
    sudo nginx -c xxx/xxx/nginx.conf
    
  4. 关闭nginx
    nginx -s stop
    # 其它方式
    sudo pkill -9 nginx 
    

3、反向代理

  1. nginx.conf配置文件
    不建议直接修改nginx的配置文件,最好复制一份通过指定配置文件启动
    # 用户  用户名    用户组
    user  zhangwei  zhangwei;
    #设置值和CPU核心数一致
    worker_processes auto;
    # 全局错误日志 (注意权限)
    error_log  /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/error.log;
    # pid文件所在目录 (注意权限)
    pid  /home/xxx/work/PycharmProjects/DjangoDeployExample/product/nginx//nginx.pid;
    # events块配置
    events {
      # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
      use epoll;
      # 单个work进程允许的最大连接数,默认为512
      worker_connections 65535;
    }
    # http块配置
    http {
        # 文件扩展名与文件类型映射表。设定mime类型(邮件支持类型),类型由mime.types文件定义
        # 
        include /etc/nginx/mime.types;
        #默认文件类型,默认为text/plain
        default_type application/octet-stream;
        # http模块的的访问日志
        access_log  /home/zhangwei/work/PycharmProjects/DjangoDeployExample/product/nginx/logs/access.log;
        # #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
        #(sendfile系统调用不需要将数据拷贝或者映射到应用程序地址空间中去)
        sendfile  on;
        # 连接超时时间,默认为75s,可以在http,server,location块
        keepalive_timeout  65;
        server {
            listen       80;
            #  有域名的话绑定域名,没域名写ip地址
            server_name  www.hello.com;
            # 全局错误的界面
            error_page  404  /404.html;
            # 反向代理的路径(和upstream绑定),location后面设置映射的路径
            location / { 
               # 注意代理的ip地址一定要和gunicorn里的端口一致
               proxy_pass http://192.168.58.44: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 {
                alias  /home/xxx/work/PycharmProjects/DjangoDeployExample/static;
                # 过期30天,静态文件不怎么更新,过期可以设大一点,
                 # 如果频繁更新,则可以设置得小一点。
                expires 30d;
            }
         # 多媒体资源等文件 路径
            location /media {
                alias /home/xxx/work/PycharmProjects/DjangoDeployExample/media/;
                # 过期30天,静态文件不怎么更新,过期可以设大一点,
                # 如果频繁更新,则可以设置得小一点。
                expires 30d;
            }
        }
    }
    
  2. 本案例直接将nginx放在工程下
    sudo nginx -c xxx/xxx/nginx.conf
    
  3. 注意
    • 一定要注意文件的权限问题日志 pid文件的权限问题
    • 代理的ip地址一定要和gunicorn里的端口一致
    • mime.types注意引入的路径,因为不是修改默认的nginx配置文件

五、附录

1、gunicorn详细参数

命令 简写 参数类型 说明
--config -c 字符串 配置文件路径,路径形式的字符串格式
--bind -b ip地址 绑定服务器套接字
--workers -w 整型 用于处理工作进程的数量,为正整数,默认为1。worker推荐的数量为当前的CPU个数*2 + 1
--backlog 整型 等待服务的客户的数量, 必须是正整数,一般设定在64~2048的范围内
--worker-class -k 字符串 要使用的工作模式,默认为sync 可选值 gevent tornado
--threads 整型 处理请求的工作线程数,使用指定数量的线程运行每个worker。为正整数,默认为1
--worker-connections 整型 最大客户端并发数量,默认情况下这个值为1000
max_requests 整型 超过这么多秒后工作将被杀掉,并重新启动。一般设定为30秒
--timeout -t 整型
--keep-alive 整型 `连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间
--limit-request-line 整型 HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。值是0~8190的数字。此参数可以防止任何DDOS攻击
--limit-request-fields 整型 限制HTTP请求中请求头字段的数量。此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size一起使用可以提高安全性。默认情况下,这个值为100,这个值不能超过32768
--limit-request-field-size 整型 限制HTTP请求中请求头的大小,默认情况下这个值为8190。值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制
--reload 代码更新时将重启工作,默认为False。此设置用于开发,每当应用程序发生更改时,都会导致工作重新启动。
--check-config 布尔 显示配置文件信息
--chdir 路径 切换到指定的工作目录
--daemon -D, 布尔 守护Gunicorn进程,默认False
-pid -p 文件 设置pid文件的文件名,如果不设置将不会创建pid文件
--worker-tmp-dir DIR 路径 设置工作临时文件目录,如果不设置会采用默认值
--access-logfile 文件 要写入的访问日志目录
--error-logfile 文件 要写入错误日志的文件目录
--log-file 文件 要写入日志的文件目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270