11: Django + gunicorn + Nginx 的生产环境部署
1.1 gunicorn介绍
1、Gunicorn
1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, eventlet这些都支持
2. 在多worker最大化里用CPU的同时, 还可以使用协程来提供并发支撑, 对于网络IO密集的服务比较有利.
说明:
1)同时Gunicorn也很容易就改造成一个TCP的服务, 比如doge重写worker类。
2)在针对长连接的服务时, 最好开启reuse_port, 避免worker进程负载不均。
2、uWSGI 与 Gunicorn
1. 不同于Gunicorn, uWSGI是使用C写的, 它的socket fd创建, worker进程的启动都是使用C语言系统接口来实现的
2. 在worker进程处理循环中, 解析了http请求后, 使用python的C接口生成environ对象
3. 再把这个对象作为参数塞到暴露出来的WSGI application函数中调用.
4. 而这一切都是在C程序中进行, 只是在处理请求的时候交给python虚拟机调用application.
5. 完全使用C语言实现的好处是性能会好一些.
3、uWSGI与Gunicorn性能比较
1)说明
压力测试工具为ab test,前置了nginx把静态文件剥离了,
两者都是用了2process+2thread,压力为100-1000。
2)测试结果
参考博客:https://jinzhao.me/archives/470
1. 总共耗时上差的微乎其微,这点差别不能说明什么;
2. 两者都完成了所有请求,这里说一下,之所以选1000就是因为2000两种方式都会崩溃;
3. 平均时间uwsgi胜出,这里差别不明显,但是也说明总体性能上uwsgi做的彻底;
4. 连接时间上,两者明显在1000下都吃力了,但是uwsgi表现更好,除了c我觉得使用uwsgi自己的协议也有关系;
5. 最后也是最重要的,在高并发下,明显uwsgi的表现更好一点,
6. 很有意思的是在80%以下的正常流量范围内反倒gunicorn更好,而且效果显著
7. 100ms还是比较可观的,我想这才是大家都用gunicorn的主要原因吧。
1.2 Django + Gunicorn + Nginx 的生产环境部署
1、在centos 7中安装python3环境
# 1、yum更新yum源
yum update
# 2、安装Python 3.7所需的依赖否则安装后没有pip3包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 3、在官网下载所需版本,这里用的是3.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
1、安装依赖&下载python3.7
# 1、yum更新yum源
yum update
# 2、安装Python 3.7所需的依赖否则安装后没有pip3包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel libffi-devel gcc make
# 3、在官网下载所需版本,这里用的是3.7.0版本
wget https://www.python.org/ftp/3.7.0/Python-3.7.0.tgz
2、安装Python # 1、解压
tar -xvf Python-3.7.0.tgz #2、配置编译
cd Python-3.7.0
./configure --prefix=/usr/local/python3 # 配置编译的的路径(这里--prefix是指定编译安装的文件夹)
./configure --enable-optimizations # 执行该代码后,会编译安装到 /usr/local/bin/ 下,且不用添加软连接或环境变量
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3 # 添加软连接
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #3、将/usr/local/python3/bin加入PATH
[root@linux-node1 testProj]# vim /etc/profile
#然后在文件末尾添加
export PATH=$PATH:/usr/local/python3/bin [root@linux-node1 testProj]# source /etc/profile # 修改完后,还需要让这个环境变量在配置信息中生效,执行命令
2、安装Python
2、初始化一个django项目
[root@linux-node1 /]# pip3 install django==2.0.4
[root@linux-node1 /]# mkdir /code/
[root@linux-node1 /]# cd /code/
[root@linux-node1 testProj]# django-admin startproject mmcsite
[root@linux-node1 testProj]# cd /code/mmcsite
[root@linux-node1 testProj]# python3 manage.py runserver 0.0.0.0:8000
# 页面中访问:http://192.168.56.11:8000/
初始化一个django项目
3、安装Gunicorn并使用uWSGI启动这个服务
[root@linux-node1 mmcsite]# pip3 install gunicorn # 安装Gunicorn
[root@linux-node1 mmcsite]# gunicorn mmcsite.wsgi -b 0.0.0.0:8000 -w 3 # 命令行下测试
-c # 指定一个配置文件(py文件)
-b # 与指定的socket进行绑定
-D # 以守护进程形式来运行Gunicorn进程,其实就是将这个服务放到后台去运行
-w # 工作的进程数量
-k # 工作进程类型,sync(默认), eventlet, gevent, or tornado, gthread, gaiohttp.
# 参考:http://docs.gunicorn.org/en/latest/settings.html
[root@linux-node1 mmcsite]# ps -ef|grep gunicorn # 查看Gunicorn进程已经运行
安装Gunicorn
[root@linux-node1 mmcsite]# vim /code/mmcsite/gunicorn_config.py # Gunicorn配置文档
# gunicorn_config.py
import logging
import logging.handlers
from logging.handlers import WatchedFileHandler
import os
import multiprocessing
bind = '0.0.0.0:8000' #绑定ip和端口号
backlog = 512 #监听队列
chdir = '/code/mmcsite' #gunicorn要切换到的目的工作目录
timeout = 30 #超时
worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式 workers = multiprocessing.cpu_count() * 2 + 1 #进程数
threads = 2 #指定每个进程开启的线程数
loglevel = 'info' #日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
accesslog = "/code/mmcsite/gunicorn_access.log" #访问日志文件
errorlog = "/code/mmcsite/gunicorn_error.log" #错误日志文件
/mmc/site/gunicorn_config.py Gunicorn配置文件
[root@linux-node1 mmcsite]# gunicorn mmcsite.wsgi -c gunicorn_config.py -D # 在后台使用Gunicorn运行项目
[root@linux-node1 mmcsite]# ps -ef|grep gunicorn # 查看Gunicorn进程已经运行
http://192.168.56.11:8000/
4、安装配置nginx
'''1. 配置nginx YUM源'''
[root@linux-node1 /] vim /etc/yum.repos.d/nginx.repo
```
[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
```
'''2. 安装nginx'''
[root@linux-node1 /] yum -y install nginx
安装nginx
[root@linux-node1 mmcsite]# vim /etc/nginx/conf.d/dj_gunicorn.conf # 配置nginx代理Gunicorn
server {
listen 8005;
root /www/demo;
server_name 127.0.0.1;
location / {
proxy_set_header x-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://localhost:8000/; # gunicorn绑定的端口号
}
# 配置static的静态文件:
location ~ ^\/static\/.*$ {
root /www/demo;
}
}
[root@linux-node1 mmcsite]# gunicorn mmcsite.wsgi -c gunicorn_config.py -D # 在后台使用Gunicorn运行项目
[root@linux-node1 mmcsite]# ps -ef|grep gunicorn # 查看Gunicorn进程已经运行
http://192.168.56.11:8005/
11: Django + gunicorn + Nginx 的生产环境部署的更多相关文章
- 10: Django + Uwsgi + Nginx 的生产环境部署
1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI: 最早的协议 2. FCGI: 比CGI快 ...
- Django + Uwsgi + Nginx 的生产环境部署实战
目录 Django + Uwsgi + Nginx 的生产环境部署实战 安装Uwsgi 一.使用命令来启动django项目 二.使用配置文件来启动我们的Django项目 安装Nginx 配置Nginx ...
- Django + Uwsgi + Nginx 的生产环境部署
使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...
- ubuntu Django + Uwsgi + Nginx 的生产环境部署
一.概述 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇 ...
- Django + Uwsgi + Nginx 实现生产环境部署
本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方 ...
- Django+Nginx+uWSGI生产环境部署
生产环境中的数据流 参考文档: wsgi详解:https://blog.csdn.net/li_101357/article/details/52748323 wsgi协议介绍(萌新版):https: ...
- Django + Uwsgi + Nginx 实现生产环境 项目部署
内容: uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django项目? Django项目的部署可以有很多方式,采用nginx+uwsg ...
- django+nginx+python3 生产环境部署
一.安装python基础环境 1.安装各类基础模块 yum install gcc-c++ wget openssl-devel bzip2-devel expat-devel gdbm-devel ...
- 第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置
第四百零二节,Django+Xadmin打造上线标准的在线教育平台—生产环境部署,uwsgi安装和启动,nginx的安装与启动,uwsgi与nginx的配置文件+虚拟主机配置 软件版本 uwsgi- ...
随机推荐
- 11g RAC添加用户表空间(数据文件)至文件系统(File System)的修正
前提:非TEMP.UNDO和SYSTEM表空间,这仨是大爷,您得搂着点.来自博客园AskScuti .客户是添加临时表空间数据文件时,不小心 ADD 到了文件系统中,然后发现,后悔了,还在OS层面 R ...
- Resharper快捷键使用
1: Alt+F7将你光标所在位置的变量的所有使用以列表的方式显示出来,显示结果的窗体可以像其他窗体那样停靠. 它的优点包括: 可以从所有使用中挑选只显示read usage或者write usa ...
- jQuery的主要使用方法
一.在html中添加jquery,可以使用cdn加载jquery 1.网址:https://www.bootcdn.cn/jquery/ 2.推荐使用3.4左右版本的,建议使用min.js后缀的,mi ...
- codeforce F - Three Paths on a Tree
F. Three Paths on a Tree time limit per test 2 seconds memory limit per test 256 megabytes input sta ...
- beego登录退出与检查登录过滤器
// ShowLogin 登陆显示 func (c *UserController) ShowLogin() { username := c.Ctx.GetCookie("username& ...
- 题解【洛谷P1046】[NOIP2005普及组] 陶陶摘苹果
[NOIP2005] 陶陶摘苹果 首先,我们用一个数组s[11]存储每个苹果的高度. 然后,用a表示陶陶的身高. 接着,用a+30与s[i]比较,大于则计数器加一. 最后,输出计数器的值即可. #in ...
- 问题 D: 家庭问题
问题 D: 家庭问题 时间限制: 1 Sec 内存限制: 128 MB[命题人:admin] 题目描述 有n个人,编号为1,2,……n,另外还知道存在K个关系.一个关系的表达为二元组(α,β)形式, ...
- scrapy 框架基本使用
scrapy简介: Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 ...
- SRAM速度提升思路及方法
SRAM总体分为两大部分,一部分是存储阵列,另一部分是外围辅助电路.提高SRAM工作速度从这两大方面着手. ·存储阵列 对于存储阵列,首先可以通过降低工艺节点,以达到提高器件本身速度,从而提高整体SR ...
- TXT文件也能挂木马
什么?TXT文件也能挂马?是的!TXT文件不仅有挂马的危险,而且有时候可能非常的危险!不过,严格说来,应该给这个所谓的"TXT"文件加个引号,因为它们是看起来是TXT文件,实则是隐 ...