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网站验证码识别
Jan 25 Python
Python解析json文件相关知识学习
Mar 01 Python
Python随机生成手机号、数字的方法详解
Jul 21 Python
Python标准库笔记struct模块的使用
Feb 22 Python
Python selenium实现微博自动登录的示例代码
May 16 Python
Python3.7实现中控考勤机自动连接
Aug 28 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
django 实现编写控制登录和访问权限控制的中间件方法
Jan 15 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Python自动发送和收取邮件的方法
Aug 12 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
Python中的socket网络模块介绍
Jul 23 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
2006/11/25 PHP
apache配置虚拟主机的方法详解
2013/06/17 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
PHP中$GLOBALS['HTTP_RAW_POST_DATA']和$_POST的区别分析
2017/07/03 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
简介EasyUI datagrid editor combogrid搜索框的实现
2016/04/01 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
跨域请求的完美解决方法(JSONP, CORS)
2016/06/12 Javascript
每日十条JavaScript经验技巧(一)
2016/06/23 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
angular5 httpclient的示例实战
2018/03/12 Javascript
angular项目中bootstrap-datetimepicker时间插件的使用示例
2018/03/15 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
js实现按钮开关单机下拉菜单效果
2018/11/22 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
对layui中的onevent 和event的使用详解
2019/09/06 Javascript
如何使用three.js 制作一个三维的推箱子游戏
2020/07/29 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
Python字符串匹配算法KMP实例
2015/07/18 Python
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
2014年应届大学生毕业自我鉴定
2014/01/31 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
2014年学校党建工作汇报材料
2014/11/02 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
2016年推广普通话宣传周活动总结
2016/04/06 职场文书
《鲁班学艺》读后感3篇
2019/11/27 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技