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

配置生产环境

#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

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

时间: 2019-02-01

shell脚本之nginx自动化脚本

这个脚本,可以满足nginx开启,停止和重启的操作 #!/bin/bash . /etc/init.d/functions function usage() { echo $"usage:$0 {start|stop|restart}" exit 1 } function start() { /usr/local/nginx/sbin/nginx sleep 1 if [ `netstat -antlpe | grep nginx | wc -l` -ge 0 ];then actio

借用nginx.vim工具进行语法高亮和格式化配置nginx.conf文件

我用的tengine,安装目录是/usr/local/tengine. 1.下载nginx.vim https://www.vim.org/scripts/script.php?script_id=1886 2.将nginx.vim上传至 ~/.vim/syntax/,并在~/.vim/filetype.vim的文件中新增如下内容: au BufRead,BufNewFile /etc/nginx/*,/usr/local/nginx/conf/* if &ft == '' | setfilet

PHP-FPM和Nginx的通信机制详解

PHP-FPM 介绍 CGI 协议与 FastCGI 协议 每种动态语言( PHP,Python 等)的代码文件需要通过对应的解析器才能被服务器识别,而 CGI 协议就是用来使解释器与服务器可以互相通信.PHP 文件在服务器上的解析需要用到 PHP 解释器,再加上对应的 CGI 协议,从而使服务器可以解析到 PHP 文件. 由于 CGI 的机制是每处理一个请求需要 fork 一个 CGI 进程,请求结束再kill掉这个进程,在实际应用上比较浪费资源,于是就出现了CGI 的改良版本 FastCGI

nginx上部署react项目的实例方法

测试项目:react-demo 克隆你的react-demo项目到服务器上(默认使用Github管理我们的项目) 如果需要,请安装项目环境,比如:node.js,yarn等 进入项目目录,执行npm run build,开始构建项目 构建成功之后,会生成一个dist文件夹(取决于你的项目配置),这个文件夹里的静态文件,就是我们的项目的访问文件了, 配置Nginx,Linux服务器是进入到:/etc/nginx/sites-enabled,然后以管理员身份,新建一个你的react项目的配置文件,比

Nginx跨域设置Access-Control-Allow-Origin无效的解决办法

nginx 版本 1.11.3 使用大家说的以下配置,验证无效,跨域问题仍然存在 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Credentials' 'true'; add_header 'Access-Control-Allow-Methods' 'GET,POST'; 使用以下配置,生效. if ($request_method = 'OPTIONS') { add_heade

Docker创建一个Nginx服务器的方法步骤

运行环境: MAC Docker 版本: Docker version 17.12.0-ce, build c97c6d6 一.启动Nginx 服务器 启动Nginx 服务器,并进入模拟终端 docker run -p 8080:80 --name nginx_web -it nginx /bin/bash 二.了解Nginx 镜像的配置文件位置 日志文件位置:/var/log/nginx 配置文件位置: /etc/nginx 资源存放的位置: /usr/share/nginx/html 上面的

CentOS 7.3配置Nginx虚拟主机的方法步骤

实验环境 一台最小化安装的CentOS 7.3虚拟机 配置基本环境 1. 安装nginx yum install -y epel-* yum isntall -y nginx vim 2. 建立虚机主机的站点根目录 mkdir /var/wwwroot mkdir /var/wwwroot/site1 mkdir /var/wwwroot/site2 echo -e "site1" >> /var/wwwroot/site1/index.html echo -e "

nginx配置教程之add_header的坑详解

前言 add_header 是 headers 模块中定义的一个指令,顾名思义就是用来添加 http 响应头的.但请注意他只是「添加」而已,并不是重写.所以如果已经存在某个头,再使用 add_header 就会出问题.而且在低版本的 nginx 中 add_header 还不支持在错误页面中使用. 这是一个坑比较多的指令.它的处理阶段比 location 处理晚,虽然可以写在 location 中,但如果 rewrite 别的 location,那么上一个 location 中尚未处理的 add

nginx代理服务器配置双向证书验证的方法

生成证书链 用脚本生成一个根证书, 一个中间证书(intermediate), 三个客户端证书. 中间证书的域名为 localhost. #!/bin/bash -x set -e for C in `echo root-ca intermediate`; do mkdir $C cd $C mkdir certs crl newcerts private cd .. echo 1000 > $C/serial touch $C/index.txt $C/index.txt.attr echo

利用Nginx反向代理解决跨域问题详解

问题 在之前的分享的跨域资源共享的文章中,有提到要注意跨域时,如果要发送Cookie,Access-Control-Allow-Origin就不能设为*,必须指定明确的.与请求网页一致的域名.在此次项目开发中与他人协作中就遇到此类问题. 解决思路 一般来说,与后台利用CORS跨域资源共享将Access-Control-Allow-Origin设置为访问的域名即可,这个需要后台的配合,且有些浏览器是不支持的. 基于与合作方后台的配合,利用nginx方向代理来满足浏览器的同源策略来实现跨域 实现方法

说说如何利用 Node.js 代理解决跨域问题

前后端分离,经常会出现跨域访问被限制的问题. 跨域访问限制是服务端出于安全考虑的限制行为.即只有同域或者指定域的请求,才能访问.这样还可以防止图片被盗链.服务端(比如 Node.js)可以通过代理,来解决这一问题. 1 安装 request 库 npm install request --save-dev 2 配置 我们以知乎日报为例,配置两个代理.一个代理内容,另一个代理图片. 在项目根目录,配置 proxy.js : //代理 const http = require('http'); co

Angular4开发解决跨域问题详解

1.跨域 浏览器对于javascript的同源策略的限制,例如a.cn下面的js不能调用b.cn中的js,对象或数据(因为a.cn和b.cn是不同域),所以跨域就出现了. 上面提到的,同域的概念又是什么呢??? 简单的解释就是相同域名,端口相同,协议相同 同源策略: 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同. 比如:我在本地上的域名是study.cn,请求另外一个域名一段数据,这个时候在浏览器上会报错,这个就是同源策略的保护,如果浏览器对javascri

详解webpack-dev-server 设置反向代理解决跨域问题

一.设置代理的原因 现在对前端开发的要求越来越高,并且随着自动化以及模块化的诞生,前后端开发模式越来越流行.后端只负责接口,前端负责数据展示.逻辑处理.但是前后端开发模式,有一个重要的问题,就是跨域问题.  二.如何配置webpack的代理 webpack代理需要另外一个插件:webpack-dev-server webpack-dev-server配置代理非常的方便,只需要条件一个proxy属性,然后配置相关的参数就可以了: var webpack = require('webpack');

Nginx反向代理实现支持长连接详解

前言 Nginx upstream与后端的连接默认为短连接,通过HTTP/1.0向后端发起连接,并把请求的"Connection" header设为"close".Nginx与前端的连接默认为长连接,一个用户跟Nginx建立连接之后,通过这个长连接发送多个请求.如果Nginx只是作为reverse proxy的话,可能一个用户连接就需要多个向后端的短连接.如果后端的服务器(源站或是缓存服务器)处理并发连接能力不强的话,就可能导致瓶颈的出现. Nginx目前的upst

详解基于angular-cli配置代理解决跨域请求问题

1.跨域请求产生 随着不同终端(Pad/Mobile/PC)的兴起,对开发人员的要求越来越高,纯浏览器端的响应式已经不能满足用户体验的高要求,我们往往需要针对不同的终端开发定制的版本.为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接口,前端负责展现/交互逻辑,同一份数据接口,我们可以定制开发多个版本. 而前后端分离带来的一个问题就是前端web部署的服务器和后端提供服务的服务器大概率不在同一个域名下,进而会产生跨域问题. 2.通用解决方案 如果浏览器支持HTML5,那么就可以一

vue使用代理解决请求跨域问题详解

在日常开发中,我们前端必不可少的需要像后端请求数据. 但是一般前后端分离,所以域名.端口等肯定不尽相同,这样就不可避免的会遇到浏览器的同源策略限制. 在一般情况下,后端都会设置请求跨域允许的来源.方法等. 但是也保不准后端疏忽而忘记这个问题. 那为了不影响我们的开发,前端只能被动的去找后端解决跨域问题. 其实,我们前端也可以解决跨域问题,那就是使用代理. 举个例子: 我请求的地址是这个:http://192.168.12.36:9000/api/SourceManager 但是我本地的vue项目

Vue axios与Go Frame后端框架的Options请求跨域问题详解

跨域问题可从前后两端分开排查: 前端:Vue + axios axios 请求头使用 'Content-Type': 'application/json', 并且在Header中设置了 Authorization 字段用于传递 Token, 参数未经 Qs 转码, 使用以下代码测试登录接口: // 为方便操作,已将 axios 实例挂载到 this.$axios 上 this.$axios.post('/signin', {account: '', password: ''}) .then(re

vue打包使用Nginx代理解决跨域问题

vue 在开发环境,涉及跨域,就在本地配置了代理,但是部署到服务器上,就不行了. 解决方法有一下几种 服务器端配置CORS 用nginx反向代理,和访问本地服务器是一样的 可以修改成正式线上的地址,再build 推荐 使用nginx配置反向代理,这样就可以在前端彻底解决跨域问题. vue index.js文件源码 'use strict' // Template version: 1.2.7 // see http://vuejs-templates.github.io/webpack for

利用Nginx反向代理与负载均衡搭建多人测试环境详解

前言 假如我们使用 git 进行版本控制,在一个大型网站中,开发人员在不同的分支上开发不同的需求,当一个需求开发完成需要测试,我们会把这个分支告诉测试人员,然后测试人员在测试机的网站目录拉取这个分支进行测试. 设想这样一个场景:当只有一个分支提测的时候,在测试机上可以直接拉取这个分支的代码进行测试,但是如果同时有多个分支都要同时进行测试,那么就没办法在一台测试机上同时进行了. 因为这台测试机网站目录只有一个,我们无法同时拉取不同分支的代码,那么如何在一台测试机上同时支持多人测试不同的分支呢? 实