最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

使用Nginx+uWsgi实现Python的Django框架站点动静分离

来源:懂视网 责编:小采 时间:2020-11-27 14:35:41
文档

使用Nginx+uWsgi实现Python的Django框架站点动静分离

使用Nginx+uWsgi实现Python的Django框架站点动静分离:由于: Django处理静态文件不太友好; 以后有可能需要处理php或者其他资源的请求; 所以考虑结合nginx,使用nignx做它擅长的路由分发功能;同时做动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uW
推荐度:
导读使用Nginx+uWsgi实现Python的Django框架站点动静分离:由于: Django处理静态文件不太友好; 以后有可能需要处理php或者其他资源的请求; 所以考虑结合nginx,使用nignx做它擅长的路由分发功能;同时做动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uW

由于:

Django处理静态文件不太友好;
以后有可能需要处理php或者其他资源的请求;

所以考虑结合nginx,使用nignx做它擅长的路由分发功能;同时做动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uWsgi,由uWsgi再分发给Django进行处理。即客户端 <-> nginx <-> socket <-> uwsgi <-> Django

一、环境

系统:centOS 6

  • python: 2.7(注意:Django要在2.7版本或以上的python来 )
  • nginx
  • uswgi
  • 所以,安装前,先在控制台输入python —version查看当前python的默认版本,如果在2.7以下,则修改默认版本。(详见附录)

    二、安装nginx、uWsgi

    安装

    nginxsudo yum install nginx
    

    安装

    pipsudo yum install python-pip
    

    安装

    uWsgisudo pip uwsgi
    


    三、测试nginx、uWsgi
    1. 测试nginx启动测试nginx,看是否安装成功启动 sudo service nginx start然后在浏览器中,输入ip地址,看是否出现nginx的欢迎页面,出现则说明安装成功
    2. 测试uWsgi在服务器上做任意目录下(一般在home下的某一目录),新建test.py,如下:

    # test.pydef 
    application(env, start_response):
     start_response('200 OK', [('Content-Type','text/html')])
     return "Hello World"
    

    启动以Http方式访问的uWsgi,在test.py同一目录下,输入如下命令行(8001是监听的端口,可以改成你想要的端口)

    uwsgi --http :8001 --wsgi-file test.py
    

    然后在浏览器中,输入ip地址:8001,看是否响应hello world,是则说明安装成功
    P.S. 由于开始时,uwsgi的安装使用了错误的python版本,所以在我的服务器上,uwsgi正确地可执行命令暂时是:/usr/src/download/uwsgi-2.0.10/uwsgi即完整的命令行是(本文所有的uwsgi命令同此):/usr/src/download/uwsgi-2.0.10/uwsgi --http :8001 --wsgi-file test.py
    --http :8001 --wsgi-file test.py至此,uwsgi和nginx安装成功。接下来把nginx、uwsgi、django关联起来。在它们的协作之下,达到我们想要的目标。

    四、连接Django和uWsgi
    如上uWsgi的测试那样,uWsgi监听8001端口,并把请求分发给test.py,python会执行这个文件,如果我们把test.py分给Django的入口文件,那么就实现了Django和uWsgi的连接。所以,要做的事情有两步:

    在项目目录下创建wsgi.py文件
    启动uWsgi,使用它的wsgi-file指向wsgi.py

    wsgi.py内容如下:

    """
    WSGI config for WHPAIWechat project.
    It exposes the WSGI callable as a module-level variable named ``application``.
    For more information on this file, see https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/
    """
    
    import osfrom django.core.wsgi import 
    get_wsgi_applicationos.environ.setdefault("DJANGO_SETTINGS_MODULE", "WHPAIWechat.settings")
    application = get_wsgi_application()
    
    

    启动以Http方式访问uWsgiuwsgi --http :8000 --chdir /home/jiayandev/WHPAIWechat/ --wsgi-file WHPAIWechat/wsgi.py
    浏览器访问 ip地址:8000,加上必要的路由,即可访问之前写好的python程序:例如[http://112.74.73.31:8000/wechat/call]
    P.S. 你是否关注到,启动uwsgi即可,而无需再启动Django了?

    五、连接uWsgi和nginx
    接下来,打通 uWsgi和 nginx之间的连接,它们是通过socket来连接的。第四节所讲的链接 swgi和Django,我们用浏览器访问是能得到正确的响应的,说明连接成功。那么只要在nginx上,实现某些规则下,把前端的请求转发到此端口即可。要做的事情非常简单,即配置nginx的配置文件即可,一般在 /etc/nginx/conf.d/default.conf中。这里,我只设置几条简单的规则

    url包含.css、.js等服务器特定目录,设置根目录
    以上都不匹配的的访问分发到uwsgi上的, nginx转发给uswgi处理

    更多规则可以视业务情况而定,完整的配置如下:

    upstream django {
     server 127.0.0.1:8000; # 注意8000是上述uwsgi监听的端口
    }
    server {
     listen 80 default_server;
     server_name _;
    
     #charset koi8-r;
    
     #access_log logs/host.access.log main;
    
     # Load configuration files for the default server block.
     include /etc/nginx/default.d/*.conf;
    
     location = /404.html {
     root /usr/share/nginx/html;
     }
    
     # redirect server error pages to the static page /50x.html
     #
     error_page 500 502 503 504 /50x.html;
     location = /50x.html {
     root /usr/share/nginx/html;
     }
    
     location ~ .html$ {
     root /usr/share/nginx/html/front;
     index index.html index.htm;
     }
    
     location ~ .(png|jpg|jpeg|css|img|js|flv|swf|download|eot|svg|ttf|woff|woff2|otf)$ {
     root /usr/share/nginx/html/front;
     }
    
    
     # 以上都不匹配的的访问分发到uwsgi上
     location / {
     include /etc/nginx/uwsgi_params; #详细看下文
     uwsgi_pass django;
     }
    
     * # PHP分到 9000端口**
     #
     #location ~ .php$ {
     # root html;
     # fastcgi_pass 127.0.0.1:9000;
     # fastcgi_index index.php;
     # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
     # include fastcgi_params;
     #}*
    }
    
    

    同时,uswgi_param内容如下,照抄即可

    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 REMOTE_ADDR $remote_addr;
    uwsgi_param REMOTE_PORT $remote_port;
    uwsgi_param SERVER_PORT $server_port;
    uwsgi_param SERVER_NAME $server_name;
    
    

    配置完成后,重启或者reload nginx配置即可生效
    重启:

    sudo service nginx restart
    

    reload:

    sudo service nginx reload
    

    然后直接访问,看看有什么不一样:
    http://youIP/front/index.html
    http://youIP/statics/index.html
    http://youIP/(加上路由信息),例如 http://112.74.73.31/wechat/call
    我们这里主要先关注访问django,如果http://112.74.73.31/wechat/call返回的信息跟第四节的一样,说明nginx和uwsgi也连接起来了,至此,nginx、uwsgi、django顺利连接完成。

    六、优化uwsgi的启动
    第三节、第四节介绍的启动uwsgi服务时,我们都是使用命令行的方式启动和设置参数的,这样不好记,有可能会忘记参数 等等。这里介绍另一种设置参数的方式,即用配置文件记录uwsgi的参数,启动时,从配置文件里加载参数。参数如下

    #WHPAIWechat_uwsgi.ini[uwsgi]
    socket = 127.0.0.1:8000
    chdir = /home/jiayandev/WHPAIWechat/
    wsgi-file = WHPAIWechat/wsgi.py
    processes = 4
    threads = 2
    master=True #设置此参数,有一个主进程
    pidfile= pidfile/project-master.pid #主进程id写入文件里
    vacuum=True #退出时,清理环境
    daemonize = uwsgi.log #守护进程的方式运行,log日志存在此log文件里
    

    启动uwsgi命令变成uwsgi WHPAIWechat_uwsgi.ini

    声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文档

    使用Nginx+uWsgi实现Python的Django框架站点动静分离

    使用Nginx+uWsgi实现Python的Django框架站点动静分离:由于: Django处理静态文件不太友好; 以后有可能需要处理php或者其他资源的请求; 所以考虑结合nginx,使用nignx做它擅长的路由分发功能;同时做动静分离,即Http请求统一由Nginx进行分发,静态文件由Nginx处理,并返回给客户端;而动态的请求,则分发到uW
    推荐度:
    标签: 实现 python nginx
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top