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 相关文章推荐
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
详解Django解决ajax跨域访问问题
Aug 24 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
了解不常见但是实用的Python技巧
May 23 Python
python挖矿算力测试程序详解
Jul 03 Python
Python实现Mysql数据统计及numpy统计函数
Jul 15 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
Python 安装 virturalenv 虚拟环境的教程详解
Feb 21 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
Jun 02 Python
Python pip install之SSL异常处理操作
Sep 03 Python
Python爬虫如何破解JS加密的Cookie
Nov 19 Python
Python答题卡识别并给出分数的实现代码
Jun 22 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
分页显示Oracle数据库记录的类之二
2006/10/09 PHP
php 数组的创建、调用和更新实现代码
2009/03/09 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
js综合应用实例简单的表格统计
2013/09/03 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jQuery实现列表内容的动态载入特效
2015/08/08 Javascript
JavaScript与ActionScript3两者的同性与差异性
2016/09/22 Javascript
基于JavaScript实现Tab选项卡切换效果
2016/11/24 Javascript
详解vue-cli 脚手架项目-package.json
2017/07/04 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
浅谈Node.js ORM框架Sequlize之表间关系
2017/07/24 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
解决Antd Table表头加Icon和气泡提示的坑
2020/11/17 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
Python的批量远程管理和部署工具Fabric用法实例
2015/01/23 Python
Python实现句子翻译功能
2017/11/14 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
学python爬虫能做什么
2020/07/29 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
浅析移动设备HTML5页面布局
2015/12/01 HTML / CSS
简历的自我评价
2014/02/03 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
2016创先争优活动党员公开承诺书
2016/03/24 职场文书
html5移动端禁止长按图片保存的实现
2021/04/20 HTML / CSS
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
python实现简单聊天功能
2021/07/07 Python