zoukankan      html  css  js  c++  java
  • django 多并发,多线程。

    参考http://blog.csdn.net/u013378306/article/details/76215982

    django 原生为单线程序,当第一个请求没有完成时,第二个请求辉阻塞,知道第一个请求完成,第二个请求才会执行。

    可以使用uwsgi  编程多并发的

    django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发

    nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地方,由于其底层使用 epoll 异步IO模型进行处理,使其深受欢迎

    做过运维的应该都知道,php 需要使用 nginx + fastcgi 提供高并发,java 需要使用 nginx + tomcat 提供 web 服务

    下面介绍如何使用 nginx + uwsgi 为 django 提供高并发 web 服务

    1、系统环境

    [root@crazy-acong ~]# uname -a
    Linux crazy-acong 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
    [root@crazy-acong ~]# cat /etc/redhat-release 
    CentOS release 6.6 (Final)

    2、python 及 django 版本

    [root@crazy-acong ~]# django-admin --version
    1.10.6

    3、安装 uwsgi 及 测试 uwsgi

    3.1 安装

    [root@crazy-acong ~]# pip install uwsgi

    3.2 测试 uwsgi 提供 web 服务的功能

    复制代码
    # 创建 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 服务
    [root@crazy-acong ~]# uwsgi --http :8000 --wsgi-file test.py 
    
    # 查看启动进程
    [root@crazy-acong ~]# netstat -lnpt | grep uwsgi
    tcp        0      0 127.0.0.1:26685             0.0.0.0:*                   LISTEN      22120/uwsgi         
    tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      22120/uwsgi  
    
    # 在浏览器中访问 http://ip:8000 就可以看到 Hello World 字样了
    复制代码

    3.3 将启动参数写入到配置文件中,然后进行启动 django 程序

    3.3.1 创建 uwsgi 配置文件

    复制代码
    [root@crazy-acong ~]# cd /data/django_test   # 进入到 django 的主目录
    
    [root@crazy-acong django_test]# cat test-uwsgi.ini 
    [uwsgi]
    # 对外提供 http 服务的端口
    http = :9000
    
    #the local unix socket file than commnuincate to Nginx   用于和 nginx 进行数据交互的端口
    socket = 127.0.0.1:8001
    
    # the base directory (full path)  django 程序的主目录
    chdir = /data/django_test
    
    # Django's wsgi file
    wsgi-file = django_test/wsgi.py
    
    # maximum number of worker processes
    processes = 4
    
    #thread numbers startched in each worker process
    threads = 2
     
    #monitor uwsgi status  通过该端口可以监控 uwsgi 的负载情况
    stats = 127.0.0.1:9191
    
    
    # clear environment on exit
    vacuum          = true
    
    # 后台运行,并输出日志
    daemonize = /var/log/uwsgi.log
    复制代码

    3.3.2 通过 uwsgi 配置文件启动 django 程序

    # 通过配置文件启动 django 程序
    [root@crazy-acong django_test]# /usr/local/bin/uwsgi test-uwsgi.ini # 在浏览器中 通过访问 http://ip:9000 可以看到发布的 django 程序

     到这里就可以支持多并发了,不会阻塞了。如果要使用更好的性能,可以使用nginx

     4、安装 nginx

    nginx 安装参考 http://www.cnblogs.com/CongZhang/p/6548570.html

    5、配置 nginx 的配置文件

    在 django 的主目录下创建下面的 nginx 配置文件,然后做软连接到 nginx 的配置文件目录,或者直接在 nginx 配置文件目录中添加该文件也可以

    5.1 创建 nginx 配置文件

    复制代码
    [root@crazy-acong django_test]# cat /data/django_test/django-nginx.conf 
    # 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 /data/django_test/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     /data/django_test/uwsgi_params; # the uwsgi_params file you installed
        }
    }
    复制代码

    5.2 重启nginx 服务

    复制代码
    [root@crazy-acong django_test]# nginx -t
    nginx: the configuration file /data/application/nginx-1.10.3/conf/nginx.conf syntax is ok
    nginx: configuration file /data/application/nginx-1.10.3/conf/nginx.conf test is successful
    [root@crazy-acong django_test]# nginx -s reload
          
    [root@crazy-acong django_test]# netstat -lnpt | grep 8000
    tcp        0      0 0.0.0.0:8000                0.0.0.0:*                   LISTEN      43492/nginx      
    复制代码

    这个时候就可以通过 http://ip:8000 访问 django 程序了,不过目前还存在一个问题,访问 http://ip:8000/admin 发现静态文件貌似没读取到,需要通过下面的方法解决静态文件的问题

    6、解决 django 多 app 静态文件的问题

    复制代码
    # 在 django 程序的 settings.py 文件中添加以下内容
    
    STATIC_ROOT = os.path.join(BASE_DIR, "static_all")
    
    
    # 然后通过执行该命令,将静态文件整合到一个目录中
    [root@crazy-acong django_test]# python3 manage.py collectstatic
    
    [root@crazy-acong django_test]# ll
    total 40
    drwxr-xr-x 3 nginx games 4096 Mar 14 14:42 app01
    -rw-r--r-- 1 root  root  3072 Mar 14 14:51 db.sqlite3
    -rw-r--r-- 1 root  root  1026 Mar 14 15:18 django-nginx.conf
    drwxr-xr-x 3 nginx games 4096 Mar 14 15:45 django_test
    -rwxr-xr-x 1 nginx games  809 Mar 14 14:37 manage.py
    drwxr-xr-x 2 nginx games 4096 Mar 14 14:42 static
    drwxr-xr-x 3 root  root  4096 Mar 14 15:47 static_all   # 此时会发现多了一个该目录,所有 app 的静态文件都整合到这一个目录中了
    drwxr-xr-x 2 nginx games 4096 Mar 14 14:40 templates
    -rw-r--r-- 1 root  root   565 Mar 14 15:40 test-uwsgi.ini
    -rw-r--r-- 1 root  root   664 Mar 14 15:28 uwsgi_params
    复制代码

    然后需要修改 nginx 配置文件中 指向 django 静态目录的配置文件

    复制代码
    [root@crazy-acong django_test]# cat /data/django_test/django-nginx.conf 
    # 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 /data/django_test/static_all; # your Django project's static files - amend as required
        }
     
        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            include     /data/django_test/uwsgi_params; # the uwsgi_params file you installed
        }
    }
    复制代码

    最后重启 nginx 服务即可

    [root@crazy-acong django_test]# nginx -t
    nginx: the configuration file /data/application/nginx-1.10.3/conf/nginx.conf syntax is ok
    nginx: configuration file /data/application/nginx-1.10.3/conf/nginx.conf test is successful
    [root@crazy-acong django_test]# nginx -s reload


  • 相关阅读:
    Mysql 分页查询sql优化
    观察者模式之spring事件机制
    封装一个按Key排序的Map工具
    SpringBoot java配置类@Configuration 的两种写法
    最基础前端路由实现,事件popstate使用
    mybatis分页插件PageHelper源码浅析
    看看线程特有对象ThreadLocal
    svn提交错误:Commit failed (details follow): Can't create directory
    mac下修复exfat格式外置硬盘
    [twisted] Multiple users
  • 原文地址:https://www.cnblogs.com/1204guo/p/8056641.html
Copyright © 2011-2022 走看看