daiyizheng

Django线上部署实战教程之Nginx+Gunicorn+Django篇

 

我们的目标:

 

 

安装gunicorn

 

(trydjango110_env)# pip install gunicorn

 


 

实战部署django

 

收集项目所有静态文件:

 

Django project的settings.py文件:

 

STATIC_URL = \'/static/\'

 

STATICFILES_DIRS = [

    os.path.join(BASE_DIR, "static"),

]

 

STATIC_ROOT = os.path.join(BASE_DIR, "static_assets")

 

# STATIC_ROOT=/www/http/static

 

 

将django admin和django app的静态文件收集到STATIC_ROOT目录下:

 

(trydjango110_env)# python manage.py collectstatic

 

修改ALLOWED_HOSTS:

 

修改Django项目的settings.py文件中的ALLOWED_HOSTS配置:

 

ALLOWED_HOSTS = ["*", ]

 

 

修改nginx配置:

 

备份原来的nginx配置:

 

# mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

 

新建一个/usr/local/nginx/conf/nginx.conf文件,

按下方gunicorn版nginx配置修改/usr/local/nginx/conf/nginx.conf文件

 

#user  nobody;

worker_processes  1;

 

error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

 

pid        logs/nginx.pid;

 

 

events {

    worker_connections  1024;

}

 

 

http {

    include       mime.types;

    default_type  application/octet-stream;

 

    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'

                      \'$status $body_bytes_sent "$http_referer" \'

                      \'"$http_user_agent" "$http_x_forwarded_for"\';

 

    #access_log  logs/access.log  main;

 

    sendfile        on;

    #tcp_nopush     on;

 

    #keepalive_timeout  0;

    keepalive_timeout  65;

 

    #gzip  on;

 

    upstream trydjango110 {

        server unix:/usr/local/envs/trydjango110/bbs.sock;

    }

 

    server {

        listen       80;

        server_name  localhost;

 

        #access_log  logs/host.access.log  main;

 

        location / {

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_set_header Host $http_host;

            proxy_redirect off;

            if (!-f $request_filename) {

                proxy_pass http://trydjango110;

                break;

            }

        }

 

        #error_page  404              /404.html;

 

        # redirect server error pages to the static page /50x.html

        #

        error_page   500 502 503 504  /50x.html;

        location = /50x.html {

            root   html;

        }

 

        location /static/ {

            alias /usr/local/envs/trydjango110/static_assets/;

        }

    }

}

 

重载nginx配置:

 

# /usr/local/nginx/sbin/nginx -s reload

 

通过gunicorn启动Django项目,在你的django project目录下运行:

 

# gunicorn bbs.wsgi:application --bind=unix:/usr/local/envs/trydjango110/bbs.sock

 

可以把gunicorn启动Django项目的命令写成脚本,增加很多参数设置:

 

按照下方内容,在Django project下创建bbs_gunicorn_start.sh文件:

 

#!/bin/bash

 

NAME="posts" # 应用的名字,这里填上Django project下面的app名字

DJANGODIR=/usr/local/envs/trydjango110 # Django project 路径

SOCKFILE=/usr/local/envs/trydjango110/bbs.sock # 使用这个文件进行unix socket通信

# USER=hello # 运行的用户,我们这里使用的是root用户所以不需要

# GROUP=webapps # 运行的用户组

NUM_WORKERS=3 # Gunicorn 可以产生的工作进程数量

DJANGO_SETTINGS_MODULE=bbs.settings # Django project使用的settings

DJANGO_WSGI_MODULE=bbs.wsgi # WSGI模块,默认与settings.py文件同目录


echo "Starting $NAME as `whoami`"

 

# 启用虚拟环境

#cd $DJANGODIR # cd到Django project目录

#source trydjango110_env/bin/activate # 启用

#export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE

#export PYTHONPATH=$DJANGODIR:$PYTHONPATH

 

# Start your Django gunicorn

# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)

exec gunicorn ${DJANGO_WSGI_MODULE}:application \

--name $NAME \

--workers $NUM_WORKERS \

--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-

 

赋予该启动脚本执行权限:

 

# chmod a+x bbs_gunicorn_start.sh

 

运行该启动脚本:

 

# sh bbs_gunicorn_start.sh

 

 


参考链接:

 

Django官网部署教程(gunicorn):

https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/gunicorn/

 

其他:

 

http://www.jianshu.com/p/288ebe5396a0

 

分类:

技术点:

相关文章: