nginx、uwsgi部署django项目理论+实战

  • 基本环境:
    • Ubuntu 16.04.4 LTS
    • python 3.5 virtualenv
    • django project deployable

理论分析

  部署django项目有很多方法,方法推荐可见 django官方文档-deployment,作为一个强迫症患者,当然是要选择一个既简单又高效的部署方式了。在网上找到了一张这个对比图:
这里写图片描述
  由此我就基本决定用uwsgi部署我的django项目了,下面我们正式来介绍一下uwsgi以及相关必要理论。

WSGI

  WSGI,the Python Web Server Gateway Interface, 也就是说WSGI 是作为 Web 服务器与Web 应用程序或应用框架之间的一种低级别的接口,完成协议之间的转换。WSGI 是基于现存的 CGI 标准而设计的。Django框架自带了WSGI_Server,但是性能不好,所以自带的web server更多的是测试(debug)用途,发布时则使用生产环境的WSGI server。
WSGI功能图
  从上图来看WSGI就像一个桥梁连接服务器和应用程序。当浏览器发送请求时,服务方调用应用方并提供环境信息,以及一个回调函数(提供给应用程序用来将消息头传递给服务器方),并接收Web内容作为返回值。故,我们可称WSGI是一个中间件,主要功能如下:

  • 重写环境变量后,根据目标URL,将请求消息路由到不同的应用对象。

  • 允许在一个进程中同时运行多个应用程序或应用框架。

  • 负载均衡和远程处理,通过在网络上转发请求和响应消息。

  • 进行内容后处理,例如应用XSLT样式表。

uWSGI

  uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。而前述WSGI是一种Web服务器网关接口,是一个Web服务器(如nginx,uWSGI等服务器)与web应用通信的一种规范。

uWSGI的主要特点如下:
- 超快的性能
- 低内存占用
- 多app管理
- 详尽的日志功能
- 高度可定制(内存大小限制,服务一定次数后重启等)

uwsgi

  uwsgi是一个协议,是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述。而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

nginx

  所以到现在你应该清楚的明白一点,我们要配置一个 django项目,配置一个uWSGI服务器就够了。但是考虑到性能问题,我们在uWSGI服务器之前再加一个nginx服务器。为什么呢?原因很简单,因为nginx具备优秀的静态内容处理能力,所以静态内容由nginx自己处理;动态内容转发给uWSGI服务器,这样就可以达到更好的客户端响应。

部署实战

  根据上面的分析,我们的部署架构如下图所示:
图片来源于某站

uWSGI部署

  uwsgi部署更详细请参考uwsgi官方文档,这里我就简单列出条目:

# Django-related settings
[uwsgi]
socket = 127.0.0.1:8001

# the base directory (full path)
chdir           = /share_dir/newsite/

# Django s wsgi file
wsgi-file          = newsite/wsgi.py

# process-related settings
# master
master          = true

# maximum number of worker processes
processes       = 10
enable-threads = true
threads = 1

# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true
daemonize = /share_dir/newsite/uwsgi.log
pidfile=/share_dir/newsite/uwsgi.pid
# 启动uwsgi的用户名和用户组
uid=root
gid=root

nginx

server {
    # the port your site will be served on
    listen      80 default_server;
    # the domain name it will serve for
    #server_name 127.0.0.1; # substitute your machine's IP address or FQDN
    charset     utf-8;

    # max upload size
    client_max_body_size 75M;   # adjust to taste

    # Django media
    location /media  {
        alias /share_dir/newsite/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /share_dir/newsite/global_static; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        include    /etc/nginx/uwsgi_params; # the uwsgi_params file you installed
        uwsgi_pass 127.0.0.1:8001;
    }
}

uwsgi和nginx参数映射文件(uwsgi_params):

uwsgi_param QUERY_STRING        $query_string;
uwsgi_param REQUEST_METHOD      $request_method;
uwsgi_param CONTENT_TYPE        $content_type;
uwsgi_param CONTENT_LENGTH      $content_length;

uwsgi_param REQUEST_URI     $request_uri;
uwsgi_param PATH_INFO       $document_uri;
uwsgi_param DOCUMENT_ROOT       $document_root;
uwsgi_param SERVER_PROTOCOL     $server_protocol;
uwsgi_param UWSGI_SCHEME        $scheme;

uwsgi_param REMOTE_ADDR     $remote_addr;
uwsgi_param REMOTE_PORT     $remote_port;
uwsgi_param SERVER_PORT     $server_port;
uwsgi_param SERVER_NAME     $server_name;

然后再介绍几个常用命令:

ps -ax | grep uwsgi //查看uwsgi运行进程
uwsgi yourfile.ini //启动uwsgi服务,必须说明这是其中一种方式,其他的请参考官方文档
uwsgi --stop uwsgi.pid // 停止服务
uwsgi --reload uwsgi.pid // 重启服务

  必须说这个总结的太简单,当时部署我是做了大量的工作,比如了解nginx的工作模型等,有时间我再总结!

猜你喜欢

转载自blog.csdn.net/jeffery0207/article/details/80348640