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

发布时间:2020-03-01 13:47:03编辑:admin阅读(2818)

    一、概述

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

     

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

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

    • WSGI是一种通信协议。

    • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。

    • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

    uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

     

    准备条件

    默认ubuntu已经有了python3,但是pip没有安装。

    apt-get install -y python3-pip

     

    安装虚拟环境

    pip3 install virtualenv

     

    创建虚拟环境

    sudo mkdir /virtualenvs
    cd /virtualenvs
    sudo /usr/local/bin/virtualenv -p /usr/bin/python3 --no-site-packages venv

    安装django

    /virtualenvs/venv/bin/pip3 install django

     

    二、运行django项目

    创建django项目

    root@ubuntu:~# mkdir /www
    root@ubuntu:~# cd /www/
    root@ubuntu:/www# /virtualenvs/venv/bin/django-admin startproject mysite1
    root@ubuntu:/www# cd mysite1/
    root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/python manage.py startapp blog
    root@ubuntu:/www/mysite1# mkdir static

     

    编辑配置文件

    root@ubuntu:/www/mysite1# vim mysite1/settings.py

    允许监听所有IP,注意:'*'必须用引号包起来

    ALLOWED_HOSTS = ['*']

     

    原生启动方式

    /virtualenvs/venv/bin/python manage.py runserver 0.0.0.0:8000

     

    访问页面

    http://192.168.10.104:8000/

     

    效果如下:

    1.png

     

    三、基于uwsgi+django的实现

    安装uwsgi

    /virtualenvs/venv/bin/pip3 install uwsgi

     

    使用命令启动uwsgi

    先关闭上面启动的Django项目,使用Ctrl+c,就可以取消。

    第一步:进入django项目

    cd /www/mysite1/

     

    第二步:命令测试启动

    /virtualenvs/venv/bin/uwsgi --http 0.0.0.0:8000 --file mysite1/wsgi.py --static-map=/static=static

     

    参数说明:

    --http 这个就和runserver一样指定IP 端口

    --file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的

        注意:mysite1是一个相对路径。--file它的绝对路径是/www/mysite1/mysite1/wsgi.py

    --static 做一个映射,指定静态文件。

     

    此时,访问http://192.168.10.104:8000/

    如果访问正常,表示项目启动成功

     

    uwsgi配置文件

    使用Ctrl+c,取消uwsgi启动。

    第一步:在django项目同级目录创建uwsgi目录,用于存放相关文件

    cd /www/mysite1mkdir uwsgi

     

    项目结构如下:

    mysite1/
    ├── blog
    │   ├── admin.py
    │   ├── apps.py
    │   ├── __init__.py
    │   ├── migrations
    │   │   └── __init__.py
    │   ├── models.py
    │   ├── tests.py
    │   └── views.py
    ├── db.sqlite3
    ├── manage.py
    ├── mysite1
    │   ├── __init__.py
    │   ├── settings.py
    │   ├── urls.py
    │   └── wsgi.py
    ├── uwsgi
    └── static

     

    第二步:进入script目录,创建一个uwsgi.ini文件

    cd /www/mysite1/uwsgi
    vim uwsgi.ini

     

    编辑uwsgi.ini文件内容如下:

    [uwsgi]
    
    # Django-related settings
    # the base directory (full path)
    chdir           = /www/mysite1
    # Django's wsgi file
    module          = mysite1.wsgi
    # the virtualenv (full path)
    home            = /virtualenvs/venv
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 1
    # pid file
    pidfile         = /www/mysite1/uwsgi/uwsgi.pid
    # The address and port of the monitor
    http            = :8000
    # clear environment on exit
    vacuum          = true
    #The process runs in the background and types the log to the specified log file
    daemonize       = /www/mysite1/uwsgi/uwsgi.log

     

    注意几个很重要的参数

    chdir 项目目录,写绝对路径

    module Django的 wsgi 文件,表示mysite1/wsgi.py

    home 虚拟环境目录,写绝对路径

    daemonize 进程在后台运行,并将日志打到指定的日志文件

     

    启动django项目

    root@ubuntu:~# cd /www/mysite1/
    root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/uwsgi --ini uwsgi/uwsgi.ini 
    [uWSGI] getting INI configuration from uwsgi/uwsgi.ini

    查看文件

    root@ubuntu:/www/mysite1# ll uwsgi/
    总用量 20
    drwxr-xr-x 2 root root 4096 8月  10 11:47 ./
    drwxr-xr-x 6 root root 4096 8月  10 11:27 ../
    -rw-r--r-- 1 root root  717 8月  10 11:41 uwsgi.ini
    -rw-r----- 1 root root 2021 8月  10 11:47 uwsgi.log
    -rw-rw-rw- 1 root root    6 8月  10 11:47 uwsgi.pid

     

    刷新页面,查看访问是否正常。

     

    uwsgi 常用的启动命令

    uwsgi --ini uwsgi.ini # 启动
    uwsgi --reload uwsgi.pid # 重启
    uwsgi --stop uwsgi.pid # 关闭

     

    四、Nginx代理uwsgi

    安装nginx

    apt-get install -y nginx

     

    编辑配置文件

    cd /etc/nginx/sites-enabled
    vim mysite1.conf

     

    内容如下:

    server {
        listen 8000;
        server_name localhost;
    
        # 指定项目路径uwsgi
        location / {
            include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
            uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
            uwsgi_pass unix:/www/mysite1/uwsgi/mysite1.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
        }
    
        # 指定静态文件路径
        location /static/ {
            alias /www/mysite1/static/;
        }
    
    }

     

    更改uwsgi配置

    改为socket方式

    cd /www/mysite1/uwsgi
    vim uwsgi.ini

    内容如下:

    [uwsgi]
    
    # Django-related settings
    # the base directory (full path)
    chdir           = /www/mysite1
    # Django's wsgi file
    module          = mysite1.wsgi
    # the virtualenv (full path)
    home            = /virtualenvs/venv
    # process-related settings
    # master
    master          = true
    # maximum number of worker processes
    processes       = 1
    # pid file
    pidfile         = /www/mysite1/uwsgi/uwsgi.pid
    # socket file path (full path)
    socket          = /www/mysite1/uwsgi/mysite1.sock
    # clear environment on exit
    vacuum          = true
    #The process runs in the background and types the log to the specified log file
    daemonize       = /www/mysite1/uwsgi/uwsgi.log

     

    重新加载uwsgi

    /virtualenvs/venv/bin/uwsgi --reload uwsgi.pid

     

    加载nginx配置文件

    nginx -s reload

     

    查看端口,8000已经为nginx接管了

    root@ubuntu:/etc/nginx/sites-enabled# netstat -anpt|grep 8000
    tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      18895/nginx -g daem
    tcp        0      0 192.168.10.102:8000     192.168.10.105:52556    ESTABLISHED 19135/nginx: worker
    tcp        0      0 192.168.10.102:8000     192.168.10.105:52557    ESTABLISHED 19135/nginx: worker

     

    刷新页面,效果同上!

     

    进入目录 /www/mysite1/static ,放一张图片 girl.jpg

    访问图片

    http://192.168.10.102:8000/static/girl.jpg

     

    效果如下:

    1.png

     

     

    本文参考链接:

    http://www.py3study.com/Article/details/id/323.html

    https://www.jianshu.com/p/07458e99198a


关键字