ICode9

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

nginx+gunicorn部署Django项目

2020-09-25 11:35:13  阅读:230  来源: 互联网

标签:gunicorn -- py Django nginx log boluomi Gunicorn


实际采用的nginx.conf文件内容:

server {
    charset utf-8;
    listen 80;
    server_name ip;

    access_log /webapps/project/logs/nginx.access.log;
    error_log /webapps/project/logs/nginx.error.log;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static {
        alias /webapps/project/myproject/static/; # 项目静态文件所在路径
    }
    location /media {
        alias /webapps/project/myproject/media/;
    }
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

管理gunicorn脚本内容:

bash manage.sh start|stop|restart
# cat manage.sh
function start(){
	VIRTUALENV_DIR=自己虚拟环境路径
	source ${VIRTUALENV_DIR}/bin/activate
	DJANGO_DIR=自己项目地址路径
	cd ${DJANGO_DIR}
	gunicorn xxxx.wsgi:application \
	--bind 127.0.0.1:8000 \
	--workers 4 \
	--timeout 30 \
	--daemon \
	--reload \
	--access-logfile 自己日志地址 \
	--error-logfile 自己日志地址
}

function stop(){
    kill -9 `ps -ef |grep gunicorn|grep -v grep|awk "NR==1" |awk '{print $2}'`
}

case $1 in
"start")
start
sleep 5
echo "启动完成"
;;
"stop")
stop
sleep 5
echo "关闭成功"
;;
"restart")
stop
echo "关闭等到5秒"
sleep 5
echo "正在启动中,等待10秒"
sleep 10
start
echo "重启完成"
;;
*)
echo "only start|stop|restart"
exit 1
;;
esac

Django 项目中的 settings.py 部分重要配置

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False

# 允许访问此项目的地址
ALLOWED_HOSTS = ['*']  # 其实只添加你的IP地址或域名即可

# Application definition
INSTALLED_APPS = [
    ...
    # 'gunicorn', # gunicorn采用gevent 模式需要开启这个
]

# Database
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_qc',
        'HOST': '172.17.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123456',
        'CHARSET': 'utf8',
    }
}

# Static files (CSS, JavaScript, Images)
# # 对外提供WEB访问时的URL地址
STATIC_URL = '/static/'
# # 然后会将项目中的静态文件(包括STATICFILES_DIRS、自带admin的静态文件)收集到该目录下面来(所以不应该在该目录下面放置自己的一些静态文件,因为会覆盖掉)
STATIC_ROOT = os.path.join(BASE_DIR, "static")

# Upload source
# # 对外提供WEB访问时的URL地址
MEDIA_URL = '/media/'
# # 放置项目接收的上传文件
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

创建虚拟独立环境

# 创建虚拟环境
$ 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;
    }
}

标签:gunicorn,--,py,Django,nginx,log,boluomi,Gunicorn
来源: https://www.cnblogs.com/sanduzxcvbnm/p/13728997.html

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

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

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

ICode9版权所有