写在部署前

  在线上部署django项目时,比较成熟的方案是:nginx + uWSGI + Django。 nginx和Django 都比较熟悉了,uWSGI是什么呢?WSGI是一个协议,python用于web开发的协议,uWSGI则是一个程序,充当WEB服务器或者中间件。当Nginsx+uWSGI+Django一起使用时,uWSGI就是个中间件,如果直接用django+uWSGI时,uWSGI就是个WEB服务器。

  说下WEB协议出现的顺序: CGI --> FCGI --> WSGI --> uwsgi。
CGI是最早的协议,然后FCGI顾名思义就是比CGI更快,WSGI是Python专用的协议,uwsgi比FCGI和WSGI都快,是uWSGI项目的自有协议,主要特征是采用二进制来存储数据,
之前的协议都是存储字符串,所以在存储空间和解析速度上,都会优于字符串协议。附官方资料地址:http://uwsgi-docs.readthedocs.io/en/latest/FAQ.html

CGI = Common Gateway Interface,通用网关接口
顾名思义,它是一种接口规范。该规范详细定义了Web服务器中运行的服务器代理程序,怎样获取及返回网页生成过程中,服务器环境上下文和HTTP协议中的参数名称,
如大家所熟知的:REQUEST_METHOD,QUERY_STRING,CONTENT_TYPE等等。绝大部分的Web服务器程序,是以脚本的形式代理接受并处理HTTP请求,返回HTTP页面或响应。
这些脚本程序,就是大家所熟知的PHP、ASP、JSP等等。 FCGI = Fast CGI
它其实是CGI在具体实现中的的一个变种。其设计思路是,通过减少CGI代理程序和Web宿主服务程序的通信开销,从而达到提高Web服务性能的最终目的。
由此可见,FCGI在规范上跟CGI并没有不同,
只是具体实现方式上有所改进:
CGI的做法是,对于每个HTTP请求,Web宿主服务程序都建立新的进程以调用服务器脚本,响应该请求;大量HTTP请求时,服务器频繁创建进程会影响服务器性能。
FCGI的做法是,建立一个独立的FCGI服务程序进程,和Web宿主服务程序进程通信,FCGI服务进程被一旦启动后,自己分配资源、创建线程响应HTTP请求、并决定自身生命周期,
从而大大降低了系统为了创建进程而做出的资源开销。FCGI还支持分布式,也就是WEB服务器和应用程序可以再不通的机器上。
现代流行的Web服务器程序,如PHP、ASP.Net,基本都是FCGI的实现。 SCGI = Simple CGI
它是FCGI在精简数据协议和响应过程后的产物。其设计目的是为了适应越来越多基于AJAX或REST的HTTP请求,而做出更快更简洁的应答。
并且SCGI约定,当服务器返回对一个HTTP协议请求响应后,立刻关闭该HTTP连接。所以不难看出,SCGI更加适合于普遍意义上SOA所提倡的“请求-忘记”这种通信模式。 WSGI = Web Server Gateway Interface
此协议是Python语言的专利,它定义了一组在Web服务宿主程序和HTTP响应代理程序之间通信的普遍适用的接口。
它的产生是因为Python程序员注意到,对于Web框架和Web宿主服务器程序间,有严重的耦合性,比如说,某些框架是针对Apache的mod_python设计的。
于是,WSGI就定义了一套非常低级别的接口。常见的Python Web框架都实现了这个协议:如 CherryPy, Django, web.py, web2py, TurboGears, Tornado,
Pylons, BlueBream, Google App Engine[dubious – discuss], Trac, Flask, Pyramid,等等.

各类CGI简介

浏览器请求一个页面的流程

  1. 浏览器发送请求给服务器,包含请求头和请求体
  2. 服务器解析请求头和请求体
  3. 服务器根据请求信息来处理请求,生成返回内容
  4. 服务器生成响应头和响应体
  5. 服务器返回响应给浏览器,浏览器显示给用户

  步骤1,2,4,5在所有网站的请求中都是一样的,只有步骤3是不固定的。所以把固定的4个步骤抽象出来,让开发者只关注步骤3,可以提高开发效率。
WSGI,全称 Web Server Gateway Interface, 是python专用的协议,其他语言没有。用于处理WEB服务器和应用程序APP的交互信息。很多WEB框架
都有自带的WSGI服务器,不过性能并不理想,只能用于测试用途。

# nginx 相关

(1)正向代理:浏览器主动请求代理服务器,代理服务器转发请求到对应的目标服务器。
(2)反向代理:部署在WEB服务器上,代理所有外部网络的访问,浏览器访问服务器,必须经过这个代理,是被动的。
正向代理的主动方是客户端,反向代理的主动方是WEB服务器。 反向代理的作用:
(1)安全,客户端对Web服务器的访问需要先经过反向代理服务器。这样可以防止外部程序对Web服务器的直接攻击。
(2)负载均衡,反向代理服务器可以根据Web服务器的负载情况,动态地把HTTP请求交给不同的Web服务器来处理,前提是要有多个Web服务器。
(3)提升Web服务器的IO性能。一个HTTP请求的数据,从客户端传输给服务器,是需要时间的,例如N秒,如果直接传给Web服务器,Web服务器就需要让一个进程阻塞N秒,来接收IO,
这样会降低Web服务器的性能。如果使用反向代理服务器,先让反向代理服务器接收完整个HTTP请求,再把请求发给Web服务器,就能提升Web服务器的性能。还有一些静态文件的请求,
可以直接交给反向代理来处理,不需要经过Web服务器。

Nginx相关简介

正式安装

#系统环境:
CentOS 7
nginx
Django1.9
python3.6
uwsgi

  

# 安装依赖包
yum install zlib-devel bzip2-devel pcre-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel python-pip -y
# 安装uwsgi
pip install uwsgi
# 查看版本
uwsgi --version

  

# 测试uwsgi是否正常,实现一个最简单的服务器

# vim test.py
#!/usr/bin/python env
# coding: utf-8
def application(env, start_response):
start_response('200 OK', [{'Contetn-Type', 'text/html'}])
return "hello world"
# 解释:
# env参数是一个字典对象,保存HTTP请求的信息,如URL路径,域名,请求头,请求参数等
# start_response 参数是一个函数,用于向wsgiref提供响应头的设置,只能调用一次。 # 在终端运行
uwsgi --http :8080 --wsgi-file test.py
# 浏览器输入 http://127.0.0.1:8080 , 如果返回hello world 则正确,不是的话,请检查上面步骤。

  

# 安装django 和 nginx
pip install Django==1.9
yum install nginx -y

  

# 配置uwsgi
vim /etc/uwsgi.ini
[uwsgi]
socket = 127.0.0.1:10000 // 运行端口号
chdir = /data/OPS/superops/ // django项目绝对路径
wsgi-file = superops/wsgi.py // django的wsgi文件
master = true // 主进程
vhost = true // 多站模式
no-stie = true // 多站模式时不设置入口模块和文件
workers = 2 // 子进程数
reload-mercy = 10
vacuum = true // 退出,重启时清理文件
max-requests = 1000
limit-as = 512
buffer-sizi = 30000
pidfile = /var/run/uwsgi.pid // pid文件,用于下面的脚本启动,停止该进程
daemonize = /var/log/uwsgi.log // 日志文件,这个日志会记录django运行日志 # 附:uWSGI参考资料:http://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html

  

# 启动uwsgi
uwsgi /etc/uwsgi.ini

  

# cat /etc/init.d/uwsgi
DESC="uwsgi daemon"
NAME=uwsgi
DAEMON=/usr/bin/uwsgi
CONFIGFILE=/etc/$NAME.ini
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
set -e
[ -x "$DAEMON" ] || exit 0 do_start() {
$DAEMON $CONFIGFILE || echo -n "uwsgi running"
} do_stop() {
$DAEMON --stop $PIDFILE || echo -n "uwsgi not running"
rm -f $PIDFILE
echo "$DAEMON STOPED."
} do_reload() {
$DAEMON --reload $PIDFILE || echo -n "uwsgi can't reload"
} do_status() {
ps aux|grep $DAEMON
} case "$1" in
status)
echo -en "Status $NAME: \n"
do_status
;;
start)
echo -en "Starting $NAME: \n"
do_start
;;
stop)
echo -en "Stopping $NAME: \n"
do_stop
;;
reload|graceful)
echo -en "Reloading $NAME: \n"
do_reload
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|reload}" >&2
exit 3
;;
esac
exit 0

创建uwsgi的启动脚本

# 配置nginx
server {
listen 8888; // 外网访问端口
listen [::]:8888;
server_name _;
root /usr/share/nginx/html; # Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf; location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:10000; // 必须和uwsgi.ini配置的端口一致
uwsgi_param UWSGI_SCRIPT superops.wsgi; // 入口文件, superops是项目名称
uwsgi_param UWSGI_CHDIR /data/OPS/superops; // 项目根目录,这个路径是有manage.py的那一层
index index.html index.htm;
client_max_body_size 35m;
}
location /static/ {
alias /data/OPS/superops/static/; // 有时候会发现访问网站的时候加载不到资源(404)在这里声明下。
}

  

# 测试整体
/etc/init.d/uwsgi start
systemctl start nginx
在浏览器中输入http://127.0.0.1:8888 就可以正常访问django 项目了

  

# 多站配置
# uwsgi:也就是使用多个uwsgi服务的方法来实现多个站点,创建多个/etc/uwsgi01.ini并修改文件对应的端口号
# nginx: 在配置文件中再配置一个server,设置不同的端口,并指向uwsgi

  

  

CentOS+uwsgi+django+nginx 环境部署及分析的更多相关文章

  1. 在CentOS 上搭建nginx来部署静态页面网站

    在centOs 上搭建nginx来部署静态页面网站 一.部署服务器环境 nginx:轻量级.高性能的HTTP及反向代理服务器,占用内存少,并发能力强,相比老牌的apache作为web服务器,性能更加卓 ...

  2. Linux——Django 开发环境部署(一)

    Django 开发环境部署(一) 之所以 写这篇文章的原因在于django环境的确轻松搭建,之前Ubuntu上安装了,的确很轻松,但是后期我才知道随便做个环境出来很容易到了后面很麻烦,污 染了系统里的 ...

  3. centos7 nginx配置httpsCenos(6.6/7.1)下从源码安装Python+Django+uwsgi+nginx环境部署(二)

     1.yum安装nginx 下载对应当前系统版本的nginx包(package) # wget  http://nginx.org/packages/centos/7/noarch/RPMS/ngin ...

  4. python3环境搭建(uWSGI+django+nginx+python+MySQL)

    1.系统环境,必要知识 #cat /etc/redhat-release CentOS Linux release (Core) #uname -r -.el7.x86_64 暂时关闭防护墙,关闭se ...

  5. Django +uwsgi+python3+nginx + mysql 部署

    环境: 服务器ip:192.168.0.110 centos服务器 6.4 + mysql 5.6 + django1.11 +nginx 1.13.7 + uwsgi 2.0.18 uwsgi介绍 ...

  6. uWSGI+django+nginx 的工作原理流程与部署历程

    一.前言 献给和我一样懵懂中不断汲取知识,进步的人们. 霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光 二.必要的前提 2.1 准备知识 django 一个基于python的开源web框架,请 ...

  7. uWSGI+django+nginx的工作原理流程与部署历程

    一.前言献给和我一样懵懂中不断汲取知识,进步的人们. 霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光 二.必要的前提2.1 准备知识 django一个基于python的开源web框架,请确保自 ...

  8. 【转】uWSGI+django+nginx的工作原理流程与部署历程

    一.前言献给和我一样懵懂中不断汲取知识,进步的人们. 霓虹闪烁,但人们真正需要的,只是一个可以照亮前路的烛光 二.必要的前提 2.1 准备知识 1.django 一个基于python的开源web框架, ...

  9. uWSGI+django+nginx的工作原理流程与部署

    二.必要的前提 2.1 准备知识 django 一个基于python的开源web框架,请确保自己熟悉它的框架目录结构. uWSGI 一个基于自有的uwsgi协议.wsgi协议和http服务协议的web ...

随机推荐

  1. react native 导航路由组件react-navigation的使用

    navigation的几个难点和问题: 1.底部tab是否可以加上中间的大按钮? 如果加上,如何触发事件? js文件放哪? 2.navigation的登录注册页面.成功后应该不能返回刚刚的登录页面?清 ...

  2. Ubuntu下U盘只读文件系统,图标上锁,提示无法修改

    资料来源于网络,自己总结 问题 Ubuntu下有时候插入U盘,发现不能修改其中的内容.例如不能新建文件和文件夹,不能向U盘中复制文件等,系统提示:只读文件系统. 原因大概是U盘的文件系统信息出错(保存 ...

  3. c# windows服务的制作

    一.创建一个Windows Service )创建Windows Service项目 )对Service重命名 将Service1重命名为你服务名称,这里我们命名为Servicetest. 二.创建服 ...

  4. centos7安装kubernetes 1.1

    原文地址:http://foxhound.blog.51cto.com/1167932/1717105 前提:centos7 已经update yum update -y 一.创建yum源 maste ...

  5. JMS规范简介

    一.JMS规范 Java消息服务定义: Java消息服务(Java Message Service)即JMS,是一个Java平台中面向消息中间件的API,用于在两个应用程序之间或分布式系统中发送/接受 ...

  6. cmake 语法

    语法说明 CMakeLists.txt 文件遵循一种简单的语法包括 注释,命令和空格字符.注释使用#符号,从符号开始之后的一行都表示注释.命令包括命令名,左括号,分隔参数的空白字符和右括号.命令既可以 ...

  7. Class 'App\Http\Controllers\DB' not found and I also cannot use a new Model

    使用laravel的db插入数据 DB::table('tags')->insert( ['name'=>'test'] ); 报错Class 'App\Http\Controllers\ ...

  8. 微信小程序Wepy框架的三个事件交互($broadcast,$emit,$invoke)

    $broadcast: $broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消.事件广播的顺序为广度优先搜索顺序,如上图,如果页面Page_Index发起一个$bro ...

  9. Layout布局源码浅析之——FrameLayout

    一直想研究下安卓各种布局控件,FrameLayout是安卓最简单的界面布局,所以就从FrameLayout讲起. 1.属性.frameLayout继承ViewGroup,除了拥有ViewGroup的属 ...

  10. java并发编程实战:第十二章---并发程序的测试

    并发程序中潜在错误的发生并不具有确定性,而是随机的. 安全性测试:通常会采用测试不变性条件的形式,即判断某个类的行为是否与其规范保持一致 活跃性测试:进展测试和无进展测试两方面,这些都是很难量化的(性 ...