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

一、如何在生产上部署Django?

Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式。

二、uwsgi介绍

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  1. WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx,uWSGI等服务器)与web应用(如用Flask框架写的程序)通信的一种规范。
  2. uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  3. 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。
  4. uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

uwsgi性能非常高

uWSGI的主要特点如下

  1. 超快的性能
  2. 低内存占用(实测为apache2的mod_wsgi的一半左右)
  3. 多app管理(终于不用冥思苦想下个app用哪个端口比较好了-.-)
  4. 详尽的日志功能(可以用来分析app性能和瓶颈)
  5. 高度可定制(内存大小限制,服务一定次数后重启等)

If you are searching for a simple wsgi-only server, uWSGI is not for you, but if you are building a real (production-ready) app that need to be rock-solid, fast and easy to distribute/optimize for various load-average, you will pathetically and morbidly fall in love (we hope) with uWSGI.

三、Django + Uwsgi + Nginx 生产部署

1、准备环境

a、需要linux服务器一台

b、在服务器上面安装好Python和Django

这里安装方法省略。。。。(不懂可以百度解决)

c、uwsgi

# 安装 uwsgi
[[email protected]calhost teacher]# pip3 install uwsgi

测试uwsgi

[[email protected] nulige]# cd /home/nulige

[[email protected] nulige]# mkdir -p uwsgi_test

[[email protected] nulige]# cd uwsgi_test/
#测试文件
[[email protected] uwsgi_test]# vi test.py 

def application(env, start_response):
    start_response(‘200 OK‘, [(‘Content-Type‘,‘text/html‘)])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2

启动uwsgi

[[email protected] uwsgi_test]# uwsgi --http :8000 --wsgi-file test.py
*** Starting uWSGI 2.0.15 (64bit) on [Sat May 27 19:12:58 2017] ***
compiled with version: 4.4.7 20120313 (Red Hat 4.4.7-11) on 27 May 2017 18:48:50
os: Linux-2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014
nodename: web01
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/nulige/uwsgi_test
detected binary path: /usr/local/python3/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 14719
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on :8000 fd 4
spawned uWSGI http 1 (pid: 17972)
uwsgi socket 0 bound to TCP address 127.0.0.1:38831 (port auto-assigned) fd 3
Python version: 3.5.2 (default, May 27 2017, 18:39:42)  [GCC 4.4.7 20120313 (Red Hat 4.4.7-11)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x1ed4a90
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72768 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint=‘‘) ready in 0 seconds on interpreter 0x1ed4a90 pid: 17970 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 17970, cores: 1)

查看启动端口

[[email protected] ~]# ps -ef|grep uwsgi
root      17970   1000  0 19:12 pts/0    00:00:00 uwsgi --http :8000 --wsgi-file test.py
root      17972  17970  0 19:12 pts/0    00:00:00 uwsgi --http :8000 --wsgi-file test.py
root      17996  17973  0 19:14 pts/1    00:00:00 grep uwsgi

根据项目进行配置

# 启动 uwsgi
    **进入项目目录**
    **使用uwsgi启动前确保无代码问题导致通过runserver可以正常启动起来**
    uwsgi --http 192.168.31.123:8080 --file teacher/wsgi.py --static-map=/static=static #测试启动

    # 解释
        --http 这个就和runserver一样指定IP 端口
        --file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的
        -- static   做一个映射,指定静态文件

2、生产环境配置

Nginx + uWSGI + Djangos配置方法:

# uwsig使用配置文件启动
    [uwsgi]
    # 项目目录
    chdir=/opt/project_teacher/teacher/
    # 指定项目的application
    module=teacher.wsgi:application
    # 指定sock的文件路径
    socket=/opt/project_teacher/script/uwsgi.sock
    # 进程个数
    workers=5
    pidfile=/opt/project_teacher/script/uwsgi.pid
    # 指定IP端口
    http=192.168.31.123:8080
    # 指定静态文件
    static-map=/static=/opt/test_project/teacher/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=/opt/project_teacher/script/uwsgi.log

# uwsig常用命令

    # 通过配置文件启动
        uwsgi --ini uwsgi.ini
        # 会生成两个文件
            PID文件 他是标识这个程序所处的状态
            SOCK文件  他是用来和其他程序通信的
    # 停止uwsgi
        uwsgi --stop uwsgi.pid

    # 重载配置
        uwsgi --reload uwsgi.ini

d、nginx

#先换成国内yum源

#以CentOS6.x 系统为例

1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、更换成国内源
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

3、之后运行yum makecache生成缓存

# 安装nginx

yum -y install nginx

# Nginx添加配置文件

#先进入到配置文件:vi /etc/nginx/conf.d/

#编辑配置文件
server {   # 这个server标识我要配置了
        listen 80;  # 我要监听那个端口
        server_name 10.129.205.183 ;  # 你访问的路径前面的url名称
        access_log  /var/log/nginx/access.log  main;  # Nginx日志配置
        charset  utf-8; # Nginx编码
        gzip on;  # 启用压缩,这个的作用就是给用户一个网页,比如3M压缩后1M这样传输速度就会提高很多
        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(r‘^admin/‘, admin.site.urls),
            include uwsgi_params;  # 导入一个Nginx模块他是用来和uWSGI进行通讯的
            uwsgi_connect_timeout 30;  # 设置连接uWSGI超时时间
            uwsgi_pass unix:/opt/project_teacher/script/uwsgi.sock;  # 指定uwsgi的sock文件所有动态请求就会直接丢给他
        }

        # 指定静态文件路径
        location /static/ {
            alias  /opt/project_teacher/teacher/static/;
            index  index.html index.htm;
        }

        }

# 启动Nginx通过Nginx访问

/etc/init.d/nginx start
/etc/init.d/nginx stop

# 这里有个命令configtest,Nginx配置是重启生效的,如果你修改完了,不知道对不对又担心影响其他人可以使用它测试
/etc/init.d/nginx configtest

# 如果是生产环境的话Nginx正在运行,就不要直接stop start 或者 restart  直接reload就行了
# 对线上影响最低(生产环境用的方法)
/etc/init.d/nginx reload 

e、Django Admin静态文件配置

有一个小bug:

# 解决Django静态配置文件丢失

问题原因:
    是因为admin所需的js,css等静态文件都在django的安装目录内,但是我们并没有配置指向Django的配置文件。

解决办法:
    我们可以通过配置 STATIC_ROOT = os.path.join(BASE_DIR, "static_all")来指定静态文件的默认家目录是那里,然后把项目里所有的静态文件都收集起来放到这个目录下面。

收集命令:
    python3 manage.py collectstatic --noinput

修改Nginx 指定静态路径
    alias  /opt/test_project/teacher/static_all/;
时间: 2024-10-25 06:26:48

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

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

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了.比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署 准备条件: 1.确保有一个能够用runserver正常启动的django项目 2.项目已上传到linux 3.linux上已部署好python环境,且已安装好项目所需的模块 安装uwsgi uwsgi是python的一个模块,安装u

Django1.11+Uwsgi+Nginx的生产环境部署

思路:使用runserver可以使我们的django项目很便捷的在本地运行起来,但是这只能在局域网内访问.正式环境部署的话比较安全,而且静态文件的处理方式会比较友好.nginx作为服务器的最前端,负责接收client的所有请求,静态请求由nginx自己处理,非静态请求通过uwsgi传递给django,由django来进行处理. 准备:1  一个django项目,能用runserver启动: 2 服务器基础环境,python2.7+uwsgi:使用pip install uwsgi安装,nignx

django+nginx+python3 生产环境部署

一.安装python基础环境 1.安装各类基础模块 yum install  gcc-c++ wget openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel libxml*  -y 2.安装python3环境 2.1)下载python3.6包 wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz 2.2)解压.安装python3

django+uwsgi+nginx阿里云服务器部署

一.环境介绍: (1)阿里云cms(ubumtu18.0.1) (2) git (3)mysql5.7 (4)python (5) uwsgi (6) nginx (7)django2.0二:环境配置:1.安装前准备工作: (1)因为阿里云服务器安全要求比较高,因此,需要登录后台服务器,去安全组设置开放接口,需要开放3306(数据库),22(22)ssh后续连接,80(http)服务,此外打开3000-9000端口. (2)开启FTP服务,方便后续上传文件和安装包.2.git安装以及相关设置 s

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

Django Nginx+uWSGI 安装配置 链接:?? https://www.runoob.com/django/django-nginx-uwsgi.html yum update yum install gcc pip install uwsgi 查看uwsgi动态链接库是否有问题: which uwsgi ldd /root/anaconda3/bin/uwsgi 发现:libicui18n.so.58 => not found libicuuc.so.58 => not foun

Centos7 django+uwsgi+nginx+python3.6.8部署

安装依赖 yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make 下载python安装包 https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz 安装niginx yum源 rpm -Uvh http://nginx.org/packages/centos/7/noarch/RP

Django+uWsgi+nginx部署

一.环境 操作系统:Ubuntu 14.04 64位 python:2.7.6 Django:1.8.2 项目源码:https://github.com/youchuancong/django.git 部署方式:Django+uWsgi+nginx 二.部署 1.Django安装 官网:https://www.djangoproject.com/ 安装 wget https://www.djangoproject.com/m/releases/1.8/Django-1.8.2.tar.gz ta

[linux]centos7.4部署django+Uwsgi+Nginx

前言:我已经写了几个接口用来部署在服务器上的,首先选择django+Uwsgi+Nginx因为配置简单,比较符合python的简单操作功能强大的特点 然后对于django的一些版本在之前的文章写了 参考:https://www.cnblogs.com/Jack-cx/p/9351633.html  根据版本,服务器pip3 install xxx 安装下 我的django项目大概结构: TestWebApi ----TestWebApi ----Apiso(创建的应用) ----manage.p

django+uwsgi+nginx部署(非常详细)

django+uwsgi+nginx部署 1.介绍: 在网上看了很多教程,但自己部署了很久都没有成功,这篇博文记录自己所踩过得坑. 2.环境: 1 Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-130-generic x86_64) 3.下载uwsgi以及nginx 1 apt-get install uwsgi 2 apt-get install nginx (注:如果下载异常出现权限问题,在命令前添加sudo) 4.创建Django项目 例如:项目名为mysite