Django uwsgi Nginx 的生产环境部署详解


Posted in Python onFebruary 02, 2019

配置生产环境

#setting.py 文件中

DEBUG = False  # 生产环境

# 允许访问的域名,域名前加一个点表示允许访问该域名下的子域名,比如 www.zmrenwu.com、
# test.zmrenwu.com 等二级域名同样允许访问。如果不加前面的点则只允许访问 zmrenwu.com
ALLOWED_HOSTS = ["127.0.0.1",".blogzjl.site"]

创建Python虚拟环境

安装 virtualenv

sudo pip3 install virtualenv

克隆Python的环境

#先到指定目录下运行, 我的虚拟环境是在 blogzjl.site 目录下
#指定--python=python3 克隆Python3的环境
virtualenv --python=python3 env

#进入虚拟环境
source /home/zjl/sites/blogzjl.site/env/bin/activate
#用户名前,会出现 (env) zjl@ ,表示进入
#后面基本上都是在虚拟环境中完成的

收集静态文件

先在settings中配置 STATIC_ROOT = os.path.join(BASE_DIR, 'static')

同时在mysite_nginx.conf 中将静态文件的路径改为 static 的绝对路径

#在settings中配置

# STATIC_ROOT 指明了静态文件的收集目录,即项目根目录(BASE_DIR)下的 static 文件夹
STATIC_ROOT = os.path.join(BASE_DIR, 'static')


#在命令行输入
python3 manage.py collectstatic #将静态文件copy到统一的目录static下

uwsgi配置

安装 uwsgi

pip3 install uwsgi

#可能需要更新pip才能安装,根据提示输入命令更新
pip install --upgrade pip

测试 uwsgi

在项目目录下执行

uwsgi --http 127.0.0.1:8080 --file BlogProject/wsgi.py --static-map=/static=static
#--http 这个就和runserver一样指定IP 端口
#--file Django 项目中wsgi.py文件的路径,和setting.py在同一个目录下
#-- static 做一个映射,指定静态文件

#可能会启动/访问失败,请检查端口是否占用,file 或 static 路径是否正确
#使用命令 netstat -nultp 查看端口使用情况
#关掉相关经常 killall -9 uwsgi 或 kill -9 进程号

执行Linux命令 curl http://127.0.0.1:8080 访问,查看是否是访问成功后的页面(可以启动DEBUG 对错误页面的相关调试)

配置文件

相当于将 uwsgi --http 127.0.0.1:8080 --file BlogProject/wsgi.py --static-map=/static=static 这一长串命令配置到文件里,简化以后的启动命令

在自定义目录或项目主目录下创建uwsgi配置文件:blogzjl_uwsgi.ini(自定义命名,以 .ini 结束),我这里是在/home/zjl/sites/blogzjl.site/blogzjl/

路径下自定义的一个目录 script 存放所有配置(包括nginx)相关的文件

[uwsgi]
#the local unix socket file than commnuincate to Nginx

socket = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock

# 项目路径
chdir = /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/

# Django's wsgi file 项目中wsgi的位置
wsgi-file = BlogProject/wsgi.py


#进程相关设置
# 进程数 同 processes
worker = 5
#processes = 4
#线程数
#threads = 2

#指定静态文件
static-map = /static=/home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static

#主进程启动
master = true

pidfile = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.pid

#static-map = /static = /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static

#启动uwsgi的用户名和用户组
uid = zjl
gid = zjl

#启用线程
enable-threads = True
#设置自中断时间
harakir = 30

#设置缓冲
post-buffering = 4096

#设置后台运行
daemonize = /home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.log

#monitor uwsgi status
#stats = 127.0.0.1:9191
# clear environment on exit 退出时清除环境
vacuum     = true

uwsgi 执行的相关命令

#启动命令
#在项目目录下
uwsgi --ini ../script/blogzjl-uwsgi.ini
#停止
uwsgi --stop ../script/uwsgi.pid
#重启
uwsgi -- reload ../script/uwsgi.pid

#uwsgi.pid 为 配置文件中 pidfile 设置的值 ,用来控制uwsgi重启或停止,

uwsgi 相关配置文件参数

master = true 
#启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。

chdir = /web/www/mysite 
#在app加载前切换到当前目录, 指定运行目录

module = mysite.wsgi 
# 加载一个WSGI模块,这里加载mysite/wsgi.py这个模块

py-autoreload=1 
#监控python模块mtime来触发重载 (只在开发时使用)

lazy-apps=true 
#在每个worker而不是master中加载应用

socket = /test/myapp.sock 
#指定socket文件,也可以指定为127.0.0.1:9000,这样就会监听到网络套接字

processes = 2 #启动2个工作进程,生成指定数目的worker/进程

buffer-size = 32768 
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。

daemonize = /var/log/myapp_uwsgi.log 
# 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器

log-maxsize = 5000000 #设置最大日志文件大小

disable-logging = true #禁用请求日志记录

vacuum = true #当服务器退出的时候自动删除unix socket文件和pid文件。

listen = 120 #设置socket的监听队列大小(默认:100)

pidfile = /var/run/uwsgi.pid #指定pid文件

enable-threads = true 
#允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程

reload-mercy = 8 
#设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)

max-requests = 5000 
#为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用(重启)。你可以使用这个选项来默默地对抗内存泄漏

limit-as = 256 
#通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。

harakiri = 60 
#一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)

nginx配置

安装nginx

#安装nginx
sudo apt install nginx

#测试是否安装成功
sudo /etc/init.d/nginx start
#访问域名或地址,出现欢迎界面


#重启
sudo /etc/init.d/nginx restart

#重载
sudo /etc/init.d/nginx reload

#停止
sudo /etc/init.d/nginx stop

配置文件

在在前面自定义的 script 目录下创建blogzjl_nginx.conf(文件名以nginx结尾),同时做一个软连接,把此文件生成一个快捷方式到/etc/nginx/site-enabled/目录下

#nginx ifconfig_file
server {
  # 监听端口
  listen   80;

  # 服务器的域名 或ip
  server_name .blogzjl.site; # substitute your machine's IP address or FQDN
  charset   utf-8;

  #存放日志文件
  access_log /var/log/nginx/blogzjl_access.log;
  #error_log /var/log/nginx/blogzjl_error.log error;
  gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream; # 支持压缩的类型
  # 最大上传
  client_max_body_size 75M;  


  # Django 媒体相关文件
  # location /media {
  #   alias /; # your Django project's media files - amend as required
  # }
  
  #Django 静态相关文件 
  location /static/ {
    alias /home/zjl/sites/blogzjl.site/blogzjl/BlogProject/static/; # your Django project's static files - amend as required
    #index index.html index.htm;
    expires 30d;
  }

  # 所有非媒体、静态相关通过uwsgi 交给Django服务器 处理
  location / {
    include  uwsgi_params; # the uwsgi_params file you installed
    uwsgi_read_timeout 60;
    uwsgi_send_timeout 60;
    uwsgi_pass unix:/home/zjl/sites/blogzjl.site/blogzjl/script/uwsgi.sock;
  }
}

创建软连接

ln -s /home/zjl/sites/blogzjl.site/blogzjl/script/blogzjl_nginx.conf /etc/nginx/site-enabled
# ln -s 源文件绝对 目标文件绝对路径
#到 /etc/nginx/site-enabled/ 目录下将 default 文件删除防止其覆盖 blogzjl_nginx.conf 中的配置

启动 nginx 和 uwsgi

在启动前最好查看端口号,将相关进程关掉

#查看端口
netstat -nultp

#关掉相关进程,最好关彻底,相关端口被占用的都关掉,或自行换一个端口
killall -9 uwsgi 
killall -9 nginx

#对于还没有关掉的
kill -9 进程号

最后启动 uwsgi 和 nginx

#在项目目录下执行
#启动uwsgi
uwsgi --ini ../script/blogzjl-uwsgi.ini

#启动nginx
/etc/init.d/nginx start

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python计算三角函数之acos()方法的使用
May 15 Python
Python的time模块中的常用方法整理
Jun 18 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
Apr 24 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
Python中一些不为人知的基础技巧总结
May 19 Python
对Python中数组的几种使用方法总结
Jun 28 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
django中使用事务及接入支付宝支付功能
Sep 15 Python
pytorch 实现在一个优化器中设置多个网络参数的例子
Feb 20 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
Python机器学习之底层实现KNN
Jun 20 Python
python实现一个简单的udp通信的示例代码
Feb 01 #Python
Python读取指定日期邮件的实例
Feb 01 #Python
Python 利用切片从列表中取出一部分使用的方法
Feb 01 #Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 #Python
python 实现提取某个索引中某个时间段的数据方法
Feb 01 #Python
深入理解Python异常处理的哲学
Feb 01 #Python
python for 循环获取index索引的方法
Feb 01 #Python
You might like
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
给ECShop添加最新评论
2015/01/07 PHP
php邮箱地址正则表达式验证
2015/11/13 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
javascript实现上传图片并预览的效果实现代码
2011/04/11 Javascript
JQuery之focus函数使用介绍
2013/08/20 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
jQuery实现图片滑动效果
2017/03/08 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
JavaScript实现body内任意节点的自定义属性功能示例
2017/09/18 Javascript
Node.js学习之TCP/IP数据通讯(实例讲解)
2017/10/11 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
Python中的字符串替换操作示例
2016/06/27 Python
[原创]教女朋友学Python3(二)简单的输入输出及内置函数查看
2017/11/30 Python
python 列表,数组,矩阵两两转换tolist()的实例
2018/04/04 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
python处理大日志文件
2019/07/23 Python
python3 requests库文件上传与下载实现详解
2019/08/22 Python
python3常用的数据清洗方法(小结)
2019/10/31 Python
使用TensorFlow对图像进行随机旋转的实现示例
2020/01/20 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
用python计算文件的MD5值
2020/12/23 Python
python爬虫利用代理池更换IP的方法步骤
2021/02/21 Python
localstorage和sessionstorage使用记录(推荐)
2017/05/23 HTML / CSS
韩国女装NO.1网店:STYLENANDA
2016/09/16 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
医生进修自我鉴定
2014/01/19 职场文书
计算机个人求职信范例
2014/01/24 职场文书
干部对照检查材料范文
2014/08/26 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
亮剑观后感600字
2015/06/05 职场文书
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
python超详细实现完整学生成绩管理系统
2022/03/17 Python