图像

Django 1.7 with Nginx and uwsgi

本来我觉得自己离Nginx挺远的,因为无论是我们内部的服务器和客户的服务器全部是Apache,但是有时候计划和实际不同,客户扔给我们的机子是个x86的redhat5.5小型机,上面还部署了一个流媒体应用,一个投诉咨询平台,直接告诉我们不能乱动,最奇葩的是,它的应用是直接通过ip访问的,让我们不能动,我们本想给他搞个政府域名的子域名,结果中间还要审批流程,一分钟搞定的事情,结果审批两天也下不来,我们只有让django应用也通过IP直接访问。

下面是redhat5.5的各种环境:

python 2.4
Django No
Apache (lampp Apache/2.4.9 (Unix))
mod_wsgi No

于是我就开始安装python 2.7.9,安装时记得配置时加上–enable-share,然后再make&make install;
接着是pip(这个很好用,大家应该都装的有),提一句,这东西是方便,但在安装某些应用时得注意,比如PIL,最好用源代码来编译,因为你要手动指定zib和jpeg的lib,不然用起来有问题;
接着是Django;
然后我安装mod_wsgi,因为机子上已经有lampp,但机子本身的httpd并没有安装,我就直接用了lampp的apache,
在编译mod_wsgi时指定了新版本python的路径和httpd aspx的路径,然后没有任何以外的make和make install;
中间过程异常顺利,然后我就happy了,这挺简单的一事,和我预期完全一样,然后我就开始apache配置文件了,如下所示:

WSGIRestrictStdout Off
WSGIPythonPath /opt/lampp/htdocs/courb
WSGISocketPrefix /var/run/wsgi
NameVirtualHost tong.connove.com
<VirtualHost tong.connove.com>
    ServerAdmin dev@connove.com
    ServerName tong.connove.com
    #ServerAlias tong.connove.com
    DocumentRoot /opt/lampp/htdocs/courb
    Alias /favicon.ico /opt/lampp/htdocs/courb/s/favicon.ico

    Alias /media/ /opt/lampp/htdocs/courb/media/
    Alias /static/ /opt/lampp/htdocs/courb/s/

    <Directory /opt/lampp/htdocs/courb/s>
        Order allow,deny
        Allow from all
    </Directory>

    <Directory /opt/lampp/htdocs/courb/media>
        Order allow,deny
        Allow from all
    </Directory>

    WSGIDaemonProcess courb user=daemon threads=10 maximum-requests=500 python-path=/opt/lampp/htdocs/courb/courb/:/usr/local/lib/python2.7$
    WSGIProcessGroup courb

    WSGIScriptAlias / /opt/lampp/htdocs/courb/courb/wsgi.py

    ErrorLog logs/py_error

    <Directory /opt/lampp/htdocs/courb/courb>
    <Files wsgi.py>
        Order allow,deny
        Allow from all
    </Files>
    </Directory>
</VirtualHost>

结果这样配置看起来很成功,但总是跑不起来,你想我在两个OS配置都一样都可以跑起来,就是在redhat上跑步起来,这肯定是OS本身的大环境有问题,然后我就各种尝试,最后还是搞不定,一直报wsgi.py错误(End of script output before headers: wsgi.py)和http 500 error,google了半天,也不行。我首先注释了WSGIDaemonProcess,结果不报wsgi.py错误,但500 error错误仍在,我就去看日志,发现mod_wsgi的日志文件如下:

mod_wsgi (pid=5342, process='', application=''): Loading WSGI script '/opt/lampp/www/courb/courb/wsgi.py'.

而正确的加载应该如下:

mod_wsgi (pid=9818, process='courb', application='tong.connove.com|'): Loading WSGI script '/var/www/courb/courb/wsgi.py'.

我的其它和debian及centos一样,结果就是跑不起来,我又编译了mod_wsgi的最新版本的源代码,还安装了redhat x86的apache系统版,把两个本版的wsgi扔到里面还是不行,然后我找不出原因了,估计是整个os大环境的原因,国外有个家伙和我一样,他最后把yum update运行了,然后卸载了所有的应用,重新安装貌似才可以,这样的做法我们肯定不能尝试,因为客户的小型机上有其它应用,我们真不能更新,没办法我只有尝试nginx和uwsgi,结果这个只用了两个小时就全部搞定,
uwsgi的安装很简单:

pip install uwsgi

下面是配置文件:

# courb_nginx.conf

# the upstream component nginx needs to connect to
upstream django {
    # server unix:///tmp/courb.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  tong.connove.com:8000;
    # the domain name it will serve for
    server_name tong.connove.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 /opt/lampp/www/courb/media;  # your Django project's media files - amend as required
    }

    location /static {
        alias /opt/lampp/www/courb/s; # your Django project's static files - amend as required
    }

    # Finally, send all non-media requests to the Django server.
    location / {
        uwsgi_pass  django;
        include     /opt/lampp/www/courb/uwsgi_params; # the uwsgi_params file you installed
    }
}

这里我用的是端口模式,还有另一种sock模式我稍后会讲到,sock更利于高性能。
这里有个文件uwsgi_params,这个就是一些设置,大家可以去usgi docs上copy,这样再运行bash:

uwsgi --socket :8001 --module courb.wsgi --uid daemon --gid daemon --enable-threads

再运行

/etc/init.d/nginx restart

这样就可以把应用跑起来。具体的uwsgi配置可以参考django官方网站uwsgi

发表评论