zoukankan      html  css  js  c++  java
  • nginx + uwsgi + django 配置经历

    环境:

    centos 7.0 :

    [root@judge soft]# cat /etc/redhat-release
    CentOS Linux release 7.0.1406 (Core)

    [root@judge soft]# uname -r
    3.10.0-123.9.3.el7.x86_64

    nginx 1.8.0  编译安装

    [root@judge ~]# cd /usr/local/nginx/sbin/
    [root@judge sbin]# ls
    nginx
    [root@judge sbin]# ./nginx -v
    nginx version: nginx/1.8.0

    uwsgi: uwsgi --version  

    uwsgi -version 可看到更多的内容

    [root@judge soft]# uwsgi --version
    2.0.11.2

    python 2.7.5

    django :

    >>> import django
    >>> django.__version__
    '1.8.2'

    原理:  client 发送http请求----经过nginx------uwsgi----django----Nosql mysql 可用两张图来说明

    基于软件的发展:

    在过去Python的Web服务器的解决方案基本上只有mod_wsgi。其中最流行的(或理解为时尚)的方法是最近Gunicorn

    如今nginx和uwsgi结合,在基于 Python的Web应用程序上你能获得在线程(或非线程)之上更好的性能体验。暂且先这么认为吧。

    WSGI:

    wsgi:web server gateway interface 。It is a specification for web servers and application servers to communicate with web applications (though it can also be used for more than that)   WSGI是一种Web服务器网关接口。它是一个Web服务器(如nginx)与应用服务器(如uWSGI服务器)通信的一种规范。

    uWSGI

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

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

    • WSGI,是一种通信协议。
    • uwsgi同WSGI一样是一种通信协议。
    • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

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

    为什么有了uWSGI为什么还需要nginx?因为nginx具备优秀的静态内容处理能力,然后将动态内容转发给uWSGI服务器,这样可以达到很好的客户端响应。

    验证uwsgi

    django-admin.py  startproject aaa_pj

    cd /opt/aaa_pj/aaa_pj/

    vi test.py

    #!/usr/bin/env python
    #coding:utf-8

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

    uwsgi --http :8001 --wsgi-file /opt/aaa_pj/aaa_pj/test.py       打开浏览器  ip:8001 出现hello world 则说明uwsgi安装没有问题

    python /opt/aaa_pj/manage.py runserver 0.0.0.0:82     验证django 

    连接django和uwsgi

    编写django_wsgi.py文件,将其放在与文件manage.py同一个目录下。

    #!/usr/bin/env python
    #coding:utf-8

    import os
    import sys
    #将系统的编码设置成UTF8
    reload(sys)

    sys.setdefaultencoding('utf8')

    os.environ.setdefault("DJANGO_SETTINGS_MODULE","aaa_pj.settings")

    uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi

    from django.core.handlers.wsgi import WSGIHandler

    application = WSGIHandler()

    uwsgi --http :8002 --chdir /opt/aaa_pj/ --module django_wsgi

    但是到这样一步,网页始终无法打开, 

    暂且先不管 

    设置uwsgi与Nginx连接

    nginx配置:

    uWSGI 配置

    前面我们是直接使用命令行来启动 uWSGI,在实际部署环境中,我们常用的是配置文件的方式,而非命令行的方式。

    我的 Django 程序目录:/opt/aaa_pj/

    这里让 Nginx 采用 8088 端口与 uWSGI 通讯,请确保此端口没有被其它程序采用。

    uWSGI 支持多种配置文件格式,比如 xml,ini,json 等等都可以。

    1. xml 配置

    请确定你在上一节中的django_wsgi.py文件已经存在了。新建一个XML文件:aaa_pj.xml,将它放在 /opt/aaa_pj 目录下

    <uwsgi>
    <socket>127.0.0.1:8088</socket>
    <listen>80</listen>
    <master>true</master>
    <pythonpath>/opt/aaa_pj</pythonpath>
    <processes>1</processes>
    <logdate>true</logdate>
    <daemonize>/var/log/uwsgi.log</daemonize>
    <plugins>python</plugins>
    </uwsgi>

    执行命令:uwsgi -x /opt/aaa_pj/aaa_pj.xml 

    or   /usr/local/bin/uwsgi -x /opt/aaa_pj/aaa_pj.xml 

    结果报错了:

    [root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
    [uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml
    open("./python_plugin.so"): No such file or directory [core/utils.c line 3675]
    !!! UNABLE to load uWSGI plugin: ./python_plugin.so: cannot open shared object file: No such file or directory !!!

    根据提示 我将xml文件里的 plugin那行删除,结果再执行就没有报错了

    [root@judge aaa_pj]# vi aaa_pj.xml
    [root@judge aaa_pj]# uwsgi -x /opt/aaa_pj/aaa_pj.xml
    [uWSGI] parsing config file /opt/aaa_pj/aaa_pj.xml

    此时我重启nginx 又报错了

    [root@judge sbin]# ./nginx
    nginx: [emerg] unknown log format "/opt/logs/access.log" in /usr/local/nginx/conf/nginx.conf:43

    根据提示  不能用=号


    server {
    listen 80;
    server_name localhost;
    access_log /opt/logs/access.log;
    error_log /opt/logs/error.log;

    location / {
    uwsgi_pass 127.0.0.1:8088;
    include /usr/local/nginx/conf/uwsgi_params;

    }
    access_log off;
    }

    再启动nginx就没有报错了。

    由于前面的错误,网页没有成功打开。因此还需要仔细找找原因。

    加载指定的xml配置文件。当使用命令行参数时,可以使用简化命令“-x”。当然也可以不简写:

    uwsgi --xml /opt/aaa_pj.xml

    甚至如果在命令行的最后一个参数以“.xml”结尾,那么就隐含将加载该xml文件作为配置。

    uwsgi /opt/aaa_pj.xml

    有时候因各种环境问题,-x --xml 命令识别不了,可以使用下面的 ini 配置方式:

    2. ini 配置

     

    然后执行命令:

    [uwsgi]
    vhost = false
    plugins = python
    socket = 127.0.0.1:8088
    master = true
    enable-threads = true
    workers = 1
    wsgi-file = /opt/opt_pj/opt_pj/wsgi.py
    chdir =/opt/opt_pj/

    然后执行命令:

    uwsgi --ini /root/nowamagic_venv/nowamagic_pj.ini&

    uwsgi 这样就启动起来了。如果无意外的话,就能在网上访问你的 Python 项目了。
     
    还有很多问题,需要进一步去检查。今天记录到这。
     
  • 相关阅读:
    java代码,继承。。。主要是传值,赋值。
    java代码继承。。。找出不能继承父类方法的问题
    java代码继承super
    HDU 6114 Chess
    #113. 【UER #2】手机的生产
    uoj 118 赴京赶考
    戏game
    序sort
    迷enc
    Jupyter 同时支持python2、python3 kernel
  • 原文地址:https://www.cnblogs.com/glxsc/p/5141590.html
Copyright © 2011-2022 走看看