使用Nginx和Gunicorn部署Django项目
创建虚拟独立环境
# 创建虚拟环境
$ virtualenv --python /usr/local/bin/python3.6 py-env-boluomi
# 进入虚拟环境
$ source py-env-boluomi/bin/activate
# 退出依赖环境
(py-env-boluomi)$ deactivate
复制代码
安装依赖包
# 在虚拟环境中安装django
(py-env-boluomi)$ pip install django
# 在虚拟环境中安装mysqlclient
(py-env-boluomi)$ pip install mysqlclient
# 在虚拟环境中安装gunicorn
(py-env-boluomi)$ pip install gunicorn
复制代码
创建Django项目
# 在项目目录创建Django项目
(py-env-boluomi)$ django-admin startproject boluomi
复制代码
项目目录结构如下:
boluomi
├── boluomi
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
└── manage.py
复制代码
编辑settings.py文件,将数据库改为MySQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'boluomi',
'USER': 'root',
'PASSWORD': '123456',
'HOST': '127.0.0.1',
'PORT': '3306',
'OPTIONS': {
'init_command':"SET sql_mode='STRICT_TRANS_TABLES'",
},
}
}
复制代码
根据模型将数据表同步到数据库:
(py-env-boluomi)$ python manage.py migrate
复制代码
根据提示创建一个admin的管理账户:
(py-env-boluomi)$ python manage.py createsuperuser
复制代码
启动Django内置服务器:
(py-env-boluomi)$ python manage.py runserver 0.0.0.0:8080
复制代码
配置Gunicorn
在实际生产环境中不会使用Django内置的单线程开发服务器,可以采用Gunicorn,Gunicorn是一个被广泛使用的高性能的Python WSGI UNIX HTTP服务器。Gunicorn采用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点。
# 使用方法
# gunicorn [OPTIONS] 模块名:变量名
# 模块名是python文件名(可以是完整的路径+python文件名)
# 变量名是python文件中可调用的WSGI(Web Server Gateway)
# [OPTIONS]
# 指定一个配置文件
# -c CONFIG, --config
# 绑定socket
# -b ADDRESS, --bind ADDRESS
# 以守护进程方式运行Gunicorn进程
# -D, --daemon
# 切换到指定的工作目录
# --chdir CHDIR
# 工作进程的数量,在Gunicorn启动的时候,在主进程中预先fork出指定数量的worker进程处理请求
# -w INT, --workers INT
# worker重启前处理的最大请求数
# --max-requests INT
# worker空闲的超时时间,空闲超时将重启(默认30秒)
# -t INT, --timeout INT
# 指定访问日志文件
# --access-logfile FILE
# 指定error log的错误级别
# --log-level LEVEL
# 指定错误日志文件
# --error-logfile FILE, --log-file FILE
复制代码
启动/关闭/重启Gunicorn:
# 启动Gunicorn
(py-env-boluomi)$ gunicorn boluomi.wsgi:application --bind 0.0.0.0:8080 --workers 2
# 关闭Gunicorn
$ pstree | grep gunicorn | grep -v grep | awk 'NR==1{system("kill -QUIT "$2)}'
# 重启Gunicorn
$ pstree | grep gunicorn | grep -v grep | awk 'NR>1{system("kill -HUP "$2)}'
复制代码
在生产环境使用Gunicorn需要添加很多配置,通常我们会把这些配置写成一个bash脚本,如下所示:
#!/bin/bash
# 激活虚拟环境
VIRTUALENV_DIR=/data/server/workspace/py-project/py-env-boluomi
source $VIRTUALENV_DIR/bin/activate
#进入项目目录
DJANGO_DIR=/data/server/workspace/py-project/boluomi
cd $DJANGO_DIR
#启动Gunicorn服务
gunicorn boluomi.wsgi:application \
--bind 0.0.0.0:8080 \
--workers 2 \
--timeout 30 \
--daemon \
--access-logfile /data/logs/gunicorn/boluomi_access.log \
--error-logfile /data/logs/gunicorn/boluomi_error.log
复制代码
==用Gunicorn启动服务后,Django的admin无法显示static文件,解决方法如下:==
在项目的settings.py中设置ALLOWED_HOSTS:
# 这个参数的设置是为了限制一些主机的访问,当Debug=False的时候,这个值是必须要设定的,否则会报错。
# 其值是一个列表,可以是ip地址,也可以是域名,还可以支持通配符。
ALLOWED_HOSTS = ['*']
复制代码
在项目的settings.py中添加STATIC_ROOT:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
复制代码
执行如下命令会自动创建static文件夹,并把静态文件全部复制到static文件夹中:
$ python manage.py collectstatic
复制代码
在项目urls.py中添加如下内容:
from django.conf import settings
from django.conf.urls import url
from django.views.static import serve
# DEBUG为Fasle时执行
if not settings.DEBUG:
urlpatterns += [url(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})]
复制代码
配置Nginx
通常Gunicorn会部署在Nginx后面,Nginx会直接解析静态请求,并将动态请求转发给Gunicorn去解析。
server {
listen 80;
server_name boluomi.test.com;
access_log /data/logs/nginx/boluomi_access.log main;
error_log /data/logs/nginx/boluomi_error.log;
location / {
proxy_pass http://127.0.0.1:8080;
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 /data/server/workspace/py-project/boluomi/static;
}
}