实际采用的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;
}
}

nginx+gunicorn部署Django项目的更多相关文章

  1. Nginx 和 Gunicorn 部署 Django项目

    目录 Nginx 和 Gunicorn 部署 Django项目 配置Nginx 安装配置Gunicorn 通过命令行直接启动 Gunicorn 与 uwsgi 的区别,用哪个好呢 Gunicorn u ...

  2. 使用Nginx+uWSGI部署Django项目

    1.linux安装python3环境 参考链接:https://www.cnblogs.com/zzqit/p/10087680.html 2.安装uwsgi pip3 install uwsgi l ...

  3. nginx + uwsgi 部署django项目

    因项目需求,需要部署django项目,这里是基础的nginx配合uwsgi部署django,后续会采用docker部署的方式 环境: centos7 python3.5.4 django2.1.4 u ...

  4. nginx+uwsgi部署Django项目到Ubuntu服务器全过程,以及那些坑!!!

    前言:自己在windows上用PyCharm编写的Django项目,编写完后在windows上运行一点问题都没有,但是部署到服务器上时却Bug百出.百度,CSDN,sf,各种搜索寻求解决方案在历时3天 ...

  5. 在nginx上部署django项目--------Gunicorn+Django+nginx+mysql

    一.安装nginx 以前的博客我有写,这里就不写了 http://www.cnblogs.com/wt11/p/6420442.html 二.安装mysql 我用的mysql5.7  64位的二进制包 ...

  6. nginx+uwsgi部署django项目

    1.django项目部署前需要生成admin的静态资源文件 (1)生成admin的静态资源文件 # 关闭debug模型 DEBUG = False # 允许所有域名访问 ALLOWED_HOSTS = ...

  7. Nginx + uWSGI 部署Django 项目,并实现负载均衡

    一.uWSGI服务器 uWSGI是一个Web服务器,它实现了WSGI协议.uwsgi.http等协议.Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换. 要注意 WSGI ...

  8. CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目

    写在前面的话 最近总是见到有新学 Django 的朋友在部署自己的项目到 Linux 上面的时候运行不起来,所以就动手写了这篇博客. 对于不会搭建 Python 3 环境的朋友可以参考前面的博客[CE ...

  9. Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统

    Python3.6+nginx+uwsgi部署Django程序到阿里云Ubuntu16.04系统 这个是写好的Django程序在本地机运行的情况,一个查询接口. 准备工作 1.首先购买一台阿里云的EC ...

随机推荐

  1. C#/VB.NET 添加多行文本水印到Word文档

    一般情况下,在Word中添加文字水印仅支持添加一个文本字样的水印,但在复杂的办公环境中,由于对不同文档的设计要求,需要在Word文档中添加平铺水印效果,即文档中的水印文字以多行多列分布的形式存在.本文 ...

  2. 20220722-Java构造器

    Java构造器知识总结 来源:B站韩顺平老师Java入门教学 代码示例 class Person { int age; String name; public Person(int pAge, Str ...

  3. GIt后悔药:还原提交的操作(谨慎操作)

    一.背景: 偶尔会遇到git的版本分支的文件被误改的情况,需要还原,此篇文章可能会帮助到你. PS: 来理解下 Git 工作区.暂存区和版本库概念,可以更好的理解以下的还原操作. * 工作区:就是你在 ...

  4. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

  5. 2022,我们继续探索开源 New Style!

  6. Apache DolphinScheduler 的持续集成方向实践

    今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...

  7. Java SE 8 新增特性

    Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...

  8. Luogu3802 小魔女帕琪 (排列组合)

    注意除数为0情况 #include <iostream> #include <cstdio> #include <cstring> #include <alg ...

  9. CSS 布局(一):Flex 布局

    主轴和纵轴 对某一盒子模型添加display: flex;属性后,称之为 Flexible Box 模型(或称之为 flexbox),即弹性盒子模型,简称弹性盒子. 弹性盒子为子元素提供了强大的空间分 ...

  10. python金牌班第七周周末总结

    python金牌班第七周周末总结 面向对象前戏 1.我们在学习面相对像之前有一个推导过程如何将我们之前写的东西,从一串代码转向给对象服务. 2.实例 我们首先模拟了两个物种进行战斗的场景,然后我们发现 ...