Django + Uwsgi + Nginx 的生产环境部署实战

我们在本地环境开发好我们的Django项目,使用runserver很容易的就能在本地运行起来并访问,但是只能在本地局域网内访问,如果需要生产环境部署我们的web项目就需要多考虑一些问题:

  • 网站的并发
  • 静态文件的处理
  • 网站的性能
  • 服务器如何部署上线
  • ...

带着这些疑问,我们接着往下看。

  • Django:我们的django项目
  • Uswgi:django内置了一个wsgiref web服务器,但是性能并不是很好,Uswgi是一个高性能的Web服务器,支持高并发的。
  • Nginx:出色的web主流服务器。

前提的准备工作:

  • 需要有一个开发好的能够运行起来的django项目
  • 项目的配置:ALLOWED_HOSTS = ['*'] 需要修改为允许任何人访问或者限制IP访问,多个ip逗号隔开。
  • 本教程是在linux服务器上进行,确保有一台可以联网的linux机器
  • django项目已经上传至服务器目录

安装Uwsgi

uwsgi是python的一个模块,安装uwsgi只需简单的pip命令就可以了

pip3 install uwsgi

安装完成后,它提供了两种方式来启动我们的django项目,你任选一种都可以。

一、使用命令来启动django项目

进入我们的django项目中:

[root@192.168.32.130]$ cd /data/app/Library_Management_System/

# 命令启动
[root@192.168.32.130 /data/app/Library_Management_System]$ uwsgi --http 192.168.32.130:8080 --file Library_Management_System/wsgi.py --static-map=/static=static

参数说明:

  • --http:相当于执行runserver指定的 ip:port 可以任意指定端口,只要端口不会冲突
  • --file:指定一个Django项目中的wsgi.py文件,一般在项目名/下,和settings.py在同一个目录下。
  • --static:做一个静态文件目录的映射,并指定你的静态文件目录。

注意:有可能会启动失败,检查指定的路径是否存在,端口是否冲突,

可以使用命令检查端口号:netstat -tunlp|grep xxx

如果需要关闭项目:kullall -9 uwsgi 或者 kill -9 进程号

启动完成之后会夯住不动,提示类似信息,书名启动成功,此时用url访问我们的django项目就可以了。

[uwsgi-static] added mapping for /static => static
*** Starting uWSGI 2.0.18 (64bit) on [Fri Nov 29 21:17:15 2019] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-23) on 30 November 2019 05:13:53
os: Linux-2.6.32-754.23.1.el6.x86_64 #1 SMP Thu Sep 26 12:05:41 UTC 2019
nodename: localhost.localdomain
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /data/app/Library_Management_System
detected binary path: /usr/local/bin/uwsgi

二、使用配置文件来启动我们的Django项目

首先在django项目manage.py 同级目录下创建script目录,用于存放配置文件脚本等。

# 创建script文件夹
[root@192.168.32.130 /data/app/Library_Management_System]$ mkdir script
# 切换到script文件夹内
[root@192.168.32.130 /data/app/Library_Management_System]$ cd script/

新创建一个uwsgi.ini文件:

[root@192.168.32.130 /data/app/Library_Management_System/script]$ vim uwsgi.ini

# uwsig使用配置文件启动
[uwsgi]
# 项目目录 chdir=/data/app/Library_Management_System
# 指定项目的application
module=Library_Management_System.wsgi:application # 指定sock的文件路径
socket=/data/app/Library_Management_System/script/uwsgi.sock
# 进程个数
workers=5
pidfile=/data/app/Library_Management_System/script/uwsgi.pid # 指定IP端口
http=192.168.32.130:8080
# 指定静态文件
static-map=/static=/data/app/Library_Management_System/static
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 启用主进程
master=true
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/data/app/Library_Management_System/script/uwsgi.log

然后可以启动我们的项目,出现以下提示信息,表示启动成功。

[root@192.168.32.130 /data/app/Library_Management_System/script]$ uwsgi --ini uwsgi.ini
[uWSGI] getting INI configuration from uwsgi.ini
[uwsgi-static] added mapping for /static => /data/app/Library_Management_System/static
[root@192.168.32.130 /data/app/Library_Management_System/script]$
[root@192.168.32.130 /data/app/Library_Management_System/script]$ netstat -tunlp|grep 8080
tcp 0 0 192.168.32.130:8080 0.0.0.0:* LISTEN 84518/uwsgi * 启动:uwsgi --ini uwsgi.ini
* 停止:uwsgi --stop uwsgi.pid
* 重启:uwsgi --reload uwsgi.pid

到现在uwsgi + django 已经完美结合了,但是光有uwsgi还不够,uwsgi处理动态能力高,对于静态文件请求,如css,js文件处理能力就差了,此时就需要结合静态web服务器nginx一起使用

安装Nginx

略。。。。。

自己去网上找去

我已经在机器上配置好了,目录:

[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts]$

配置Nginx

[root@192.168.32.130 ~]$ cd /usr/local/webserver/nginx/conf/vhosts/

vim django.conf
server {
listen 8000; # 访问的端口
server_name 192.168.32.130; # 访问的域名,可以写IP,也可以写ip。
charset utf-8; access_log logs/access.log main;
access_log off;
# 支持压缩的类型
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;
error_page 404 /404.html; # 错误页面
error_page 500 502 503 504 /50x.html; # 错误页面 # 指定项目路径uwsgi location / { # 这个location就相当于和咱们Django的url一样
include uwsgi_params; # 用来和uWSGI进行通讯
uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
uwsgi_pass unix:/data/app/Library_Management_System/script/uwsgi.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
} # 指定静态文件路径
location /static/ {
alias /data/app/Library_Management_System/static/;
index index.html index.htm;
}
} 测试nginx配置是否正确:
[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts]$ /usr/local/webserver/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/webserver/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/webserver/nginx/conf/nginx.conf test is successful 启动nginx:
[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts]$ /etc/init.d/nginx reload
Reloading nginx: [ OK ] # 查看启动的端口:
[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts]$ netstat -tunlp|grep 8080

至此,一个django项目已经部署上线了。

可以访问到url :http://192.168.32.130:8000/app01/home/

[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts/siege-2.67]$ curl -I http://192.168.32.130:8000/app01/home/
HTTP/1.1 200 OK
Server: CWS/3.0
Date: Sat, 30 Nov 2019 06:15:55 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2398
Connection: keep-alive
Vary: Accept-Encoding
X-Frame-Options: SAMEORIGIN

如果说我们的项目是前后端分离的情况,这时候静态文件的目录肯定是不一样的,这时候可以让python自动帮我们收集一些静态文件,然后帮我们放到指定的目录里面去,

  • 修改settings.py文件
STATIC_ROOT='/var/www/static/'
STATIC_URL='/static/'
  • 收集所有静态文件到static_root指定目录:

    python3 manage.py collectstatic
    
    
  • 重启nginx、uwsgi

并发测试

http://192.168.32.130:8000/app01/home/

安装siege:

wget http://soft.vpser.net/test/siege/siege-2.67.tar.gz

tar zxf siege-2.67.tar.gz 

cd siege-2.67

./configure &&  make && make install 

siege -c 10000 -r 10 http://127.0.0.1/

-c是并发量,-r是重复次数。
[root@192.168.32.130 /usr/local/webserver/nginx/conf/vhosts/siege-2.67]$ siege -c 2000 -r 10 http://192.168.32.130:8000/app01/home/

done.
siege aborted due to excessive socket failure; you
can change the failure threshold in $HOME/.siegerc
Transactions: 3722 hits
Availability: 69.69 %
Elapsed time: 21.02 secs
Data transferred: 0.86 MB
Response time: 1.94 secs
Transaction rate: 177.07 trans/sec
Throughput: 0.04 MB/sec
Concurrency: 344.26
Successful transactions: 338
Failed transactions: 1619
Longest transaction: 14.83
Shortest transaction: 0.00 最高并发只有 344。。。
参数介绍:

  transactions:处理的请求数

  Availability: 成功率

  Elapsed Time:需要多少时间

  Data transferred :传输了多少字节

   Response time: 响应时间

   Transaction rate:平均每秒完成多少次处理 (表示后台的处理速度)

  Throughput:平均每秒传输速度

  Concurrency:最高并发量

   Successful transactions :成功的处理数

  Failed transactions:失败的处理数
   
  Longest transactions:传输最长的时间   Shortest transactions:传输最短的时间

Django + Uwsgi + Nginx 的生产环境部署实战的更多相关文章

  1. 10: Django + Uwsgi + Nginx 的生产环境部署

    1.1 一些重要概念 1.Web协议介绍 Web协议出现顺序: CGI -> FCGI -> WSGI -> uwsgi 1. CGI:  最早的协议 2. FCGI:  比CGI快 ...

  2. Django + Uwsgi + Nginx 的生产环境部署

    使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归 ...

  3. ubuntu Django + Uwsgi + Nginx 的生产环境部署

    一.概述 使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇 ...

  4. Django + Uwsgi + Nginx 实现生产环境部署

    本节内容 uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django? Django的部署可以有很多方式,采用nginx+uwsgi的方 ...

  5. 11: Django + gunicorn + Nginx 的生产环境部署

    1.1 gunicorn介绍   1.Gunicorn 1. Gunicorn是使用Python实现的WSGI服务器, 直接提供了http服务, 并且在woker上提供了多种选择, gevent, e ...

  6. Django + Uwsgi + Nginx 实现生产环境 项目部署

    内容: uwsgi 介绍 uwsgi安装使用 nginx安装配置 django with nginx 如何在生产上部署Django项目? Django项目的部署可以有很多方式,采用nginx+uwsg ...

  7. Django+uwsgi+nginx+angular.js项目部署

    这次部署的前后端分离的项目: 前端采用angular.js,后端采用Django(restframework),他俩之间主要以json数据作为交互 Django+uwsgi的配置可以参考我之前的博客: ...

  8. django+nginx+python3 生产环境部署

    一.安装python基础环境 1.安装各类基础模块 yum install  gcc-c++ wget openssl-devel bzip2-devel expat-devel gdbm-devel ...

  9. CentOs Linux 对于Django uwsgi + Nginx 的安装与部署

    Django Nginx+uWSGI 安装配置 链接:

随机推荐

  1. CVE-2017-3248简单复现

    我是这样操作的 目标跟windows在一个段,linux是另一个段的,我的虚拟机 windows主机上 `java -cp ysoserial.jar ysoserial.exploit.JRMPLi ...

  2. 好消息:Dubbo & Spring Boot要来了

    Duboo和Spring Boot都是非常优秀的框架,现在它们要结合了.为了简化Dubbo开发集成,阿里Dubbo团队将发布基于Spring Boot的版本,可快速上手Dubbo的分布式开发,并提供了 ...

  3. spring boot资源文件配置读取

    一般业务配置,尽量新建自己的配置文件,来读取,而不是配置在application.properties或application-*.properties或yml/yaml配置中. applicatio ...

  4. SSM 整合 Shiro

    1. 导包 <!-- spring --> <dependency> <groupId>org.springframework</groupId> &l ...

  5. 17-MySQL-Ubuntu-数据表的查询-分页(六)

    分页(limit) 注: (1)limit位于SQL语句的最后面; (2)limit 2; 2表示查询前两条数据; (3)limit 0,2;  0表示查询第1页的起始数据的下标,2表示每页有两条数据 ...

  6. uoj139 【UER #4】被删除的黑白树

    题目 不难发现有一个暴力\(dp\) 设\(dp[x][l]\)表示\(x\)点子树内所有叶子节点到\(x\)的路径上都有\(l\)和黑点时最多能染多个黑点 转移就是 \[dp[x][l]=\max( ...

  7. USACO2008 Cow Cars /// oj23323

    题目大意: N (1 ≤ N ≤ 50,000)头牛被编号为1-N,牛i可以在M(1 ≤ M ≤ N)条不同的高速路上以Si (1 ≤ Si ≤ 1,000,000) km/h的速度飞驰 为了避免相撞 ...

  8. 使用CSS3开启GPU硬件加速提升网站动画渲染性能

    遇到的问题: 网站本身设计初衷就没有打算支持IE8及以下版本浏览器,并不是因为代码兼容性问题,而是真的不想迁就那些懒得更新自己操作系统和浏览器的用户,毕竟是我自己的网站,所以我说了算!哈哈~ 没有了低 ...

  9. Vue项目如何关闭Eslint检测

    找到build/webpack.base.config.js文件,修改如下 将图中第二个红色框的内容 "createLintingRule()" 清空,然后保存重新启动项目即可.

  10. iphone11系统输入框的光标位置不正常

    本人的系统是11.3的是正常的,却发现测试机的11.1和11.2的光标位置在输入框的下边.百度一下,很多人有同样的问题,在此记录一下 解决办法一: //弹框弹出后执行如下代码 $('body').cs ...