zoukankan      html  css  js  c++  java
  • Django+Uwsgi+Nginx部署

    一 uwsgi介绍

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

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

    uWSGI的主要特点如下:

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

    二 Uwsgi 安装使用

    # Install the latest stable release:
    pip install uwsgi
    # ... or if you want to install the latest LTS (long term support) release,
    pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz

    基本测试

    Create a file called test.py:

    # 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 --http :8000 --wsgi-file test.py


    用uwsgi 启动django

    uwsgi --http :8000 --module [项目名称.wsgi]
    实例:uwsgi --http 0.0.0.0:8080 --chdir /project/CNBlog/ --module cnblog.wsgi

    可以把参数写到配置文件里

    [uwsgi]
    socket = 172.16.123.203:9000                        # nginx链接的ip和端口
    #http = 172.16.123.203:9000                         # 访问HTTP协议监听IP和端口
    # Django-related settings
    # the django project directory (full path)
    chdir = /project/SchoolInfomationSystem             # 项目根目录
    # Django's wsgi file
    module = SchoolInfomationSystem.wsgi                # django项目下的wsgi文件
    # process-related settings
    client_max_body_size 75M  
    # master
    master  = true
    # maximum number of worker processes
    processes = 4                                        # 开启4个进程(按需更改)
    threads = 2                                          # 每个进程开启2个线程
    max-requests = 6000                             
    #daemonize = /var/log/uwsgi.log                      # 后台启动,并把日志记录到指定文件
    # ... with appropriate permissions - may be needed
    chmod-socket    = 664
    # clear environment on exit
    vacuum          = true
    static-map = /static=/data/www/Order/web/static   # 静态文件
    pidfile=/data/www/logs/order.pid            # pid存放位置
    socket=/data/www/logs/order.sock            # socket存放位置
    daemonize=/data/www/logs/order.log           # 日志文件

    示例中用的是ini配置文件,如需使用xml配置,请另行百度xml配置文件。更多的参数使用也可以自行百度添加上去

    当ini配置文件写好后执行
    uwsgi --ini /project/crazye-uwsgi.ini #--ini 表示使用ini配置文件,xml文件就用--xm

    常用选项:

    http : 协议类型和端口号
    processes : 开启的进程数量
    workers : 开启的进程数量,等同于processes(官网的说法是spawn the specified number ofworkers / processes)
    chdir : 指定运行目录(chdir to specified directory before apps loading)
    wsgi-file : 载入wsgi-file(load .wsgi file)
    stats : 在指定的地址上,开启状态服务(enable the stats server on the specified address)
    threads : 运行线程。由于GIL的存在,我觉得这个真心没啥用。(run each worker in prethreaded mode with the specified number of threads)
    master : 允许主进程存在(enable master process)
    daemonize : 使进程在后台运行,并将日志打到指定的日志文件或者udp服务器(daemonize uWSGI)。实际上最常用的,还是把运行记录输出到一个本地文件上。
    pidfile : 指定pid文件的位置,记录主进程的pid号。
    vacuum : 当服务器退出的时候自动清理环境,删除unix socket文件和pid文件(try to remove all of the generated file/sockets)

    三 Nginx的安装和配置

    安装 nginx yum install -y nginx 

    再接下来要做的就是修改nginx.conf配置文件。打开/etc/nginx/nginx.conf文件,添加如下内容。 

            server {
            listen         8099; 
            server_name    127.0.0.1 
            charset UTF-8;
            access_log      /var/log/nginx/myweb_access.log;
            error_log       /var/log/nginx/myweb_error.log;
    
            client_max_body_size 75M;
    
            location / { 
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;
                uwsgi_read_timeout 2;
            }   
            location /static {
                expires 30d;
                autoindex on; 
                add_header Cache-Control private;
                alias /home/fnngj/pydj/myweb/static/;
             }
         }

    配置二

            # the upstream component nginx needs to connect to
            upstream django {
                # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
                server 127.0.0.1:8001; # for a web port socket (we'll use this first)
            }
             
            # configuration of the server
            server {
                # the port your site will be served on
                listen      8000;
                # the domain name it will serve for
                server_name .example.com; # 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 /path/to/your/mysite/media;  # your Django project's media files - amend as required
                }
             
                location /static {
                    alias /path/to/your/mysite/static; # your Django project's static files - amend as required
                }
             
                # Finally, send all non-media requests to the Django server.
                location / {
                    uwsgi_pass  django;
                    include     /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
                }
            }

    listen 指定的是nginx代理uwsgi对外的端口号。

    server_name 网上大多资料都是设置的一个网址(例,www.example.com),我这里如果设置成网址无法访问,所以,指定的到了本机默认ip。

    在进行配置的时候,我有个问题一直想不通。nginx到底是如何uwsgi产生关联。现在看来大概最主要的就是这两行配置。
    include uwsgi_params;
    uwsgi_pass 127.0.0.1:8000; 注意要和wsgi监听的ip和端口一致
    include 必须指定为uwsgi_params;而uwsgi_pass指的本机IP的端口与myweb_uwsgi.ini配置文件中的必须一直。

  • 相关阅读:
    最简单跨平台的日志库
    linux文件锁
    Linux 获取屏幕分辨率与窗口行列数(c/c++)
    linux 信号机制
    记一次函数异常(getopt_long)
    程序单实例运行
    简单地 Makefile 书写
    学习go的一些笔记
    20200930 10. Netty 核心源码剖析
    20200930 9. TCP 粘包和拆包 及解决方案
  • 原文地址:https://www.cnblogs.com/harryblog/p/9844895.html
Copyright © 2011-2022 走看看