Linux系统上Nginx+Python的web.py与Django框架环境

985次阅读  |  发布于5年以前

1.编译nginx
在网上买了一本《实战nginx-取代Apache的高性能服务器》,写的比较浅,主要是些配置方面的东西,不过却正是目前我所需要的。由于需要支持https和rewrite,所以除了nginx的源码之外,又下载了 openssl-0.9.8r.tar.gz 和 pcre-8.12.tar.gz,把他们和nginx-1.0.4.tar.gz放到同一个目录。
为了方便编译,笔者写了一个脚本,代码如下:


    #!/bin/bash

    #=============================================================================
    #脚本所在绝对目录
    abs_path(){
     local path=$1
     local basename=$( basename $path )
     local dirname=$( dirname $path )
     cd $dirname
     if [ -h $basename ]; then
      path=$( readlink $basename )
      abs_path $path
     else
      pwd
     fi
    }

    #=============================================================================
    #依赖的目录
    src_base_dir=$( abs_path $0 )
    src_openssl_dir=$src_base_dir'/openssl-0.9.8r'
    src_pcre_dir=$src_base_dir'/pcre-8.12'
    src_nginx_dir=$src_base_dir'/nginx-1.0.4'

    #=============================================================================
    #目标的目录
    dest_base_dir=$src_base_dir'/release'
    dest_nginx_dir=$dest_base_dir'/nginx'

    #=============================================================================
    #把所有的tar.gz解压
    find . -name "*.tar.gz" | xargs -IX tar zxvf X

    #=============================================================================
    #编译nginx
    cd $src_nginx_dir
    chmod u+x ./configure
    ./configure --with-http_stub_status_module --with-http_ssl_module --with-openssl=$src_openssl_dir --with-pcre=$src_pcre_dir --prefix=$dest_nginx_dir
    make && make install

2.配置nginx
在server配置项下增加


    location / {
     #这两种方法都可以,只不过spawn-cgi启动的方法不同
     #fastcgi_pass 127.0.0.1:9002;
     fastcgi_pass unix:webpy.sock;

     fastcgi_param REQUEST_METHOD $request_method;
     fastcgi_param QUERY_STRING $query_string;
     fastcgi_param CONTENT_TYPE $content_type;
     fastcgi_param CONTENT_LENGTH $content_length;
     fastcgi_param GATEWAY_INTERFACE CGI/1.1;
     fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
     fastcgi_param REMOTE_ADDR $remote_addr;
     fastcgi_param REMOTE_PORT $remote_port;
     fastcgi_param SERVER_ADDR $server_addr;
     fastcgi_param SERVER_PORT $server_port;
     fastcgi_param SERVER_NAME $server_name;
     fastcgi_param SERVER_PROTOCOL $server_protocol;
     fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_script_name;
    }

这里的3个location配置分别解决了,与python进程通信、django后台管理端样式存放、网站样式存放的问题。对照着apache的配置来看,就很容易明白了


    WSGIPythonEggs /tmp
    <VirtualHost *>
     ServerName fuload.qq.com
     WSGIScriptAlias / /home/dantezhu/htdocs/fuload/conf/setting.wsgi
     <Directory />
      Options FollowSymLinks
      AllowOverride
      Order allow,deny 
      Allow from all 
     </Directory>
     <Directory "/home/dantezhu/htdocs/fuload/mysite">
      Order Deny,Allow 
      Deny from all 
     </Directory>
     Alias /admin_media "/usr/local/lib/python2.7/site-packages/django/contrib/admin/media"
     <Directory "/usr/local/lib/python2.7/site-packages/django/contrib/admin/media">
      Order allow,deny 
      Options Indexes
      Allow from all 
      IndexOptions FancyIndexing
     </Directory>

     #AliasMatch /site_media/(.*\.(css|gif|png|jpg|jpeg)) /home/dantezhu/htdocs/fuload/media/$1 
     Alias /site_media /home/dantezhu/htdocs/fuload/media/
     <Directory "/home/dantezhu/htdocs/fuload/media/">
      Order allow,deny 
      Options Indexes
      Allow from all 
      IndexOptions FancyIndexing
     </Directory>
    </VirtualHost>

3.安装fastcgi依赖
需要到 http://trac.saddi.com/flup下载安装,之后fastcgi才能够正常启动。

4.启动django
创建django project的过程我们就不说了,只列出启动/停止的命令:
启动:


    #python manage.py runfcgi daemonize=true pidfile=`pwd`/django.pid host=127.0.0.1 port=9001 maxrequests=1 &
    python manage.py runfcgi daemonize=true pidfile=`pwd`/django.pid socket=/home/dantezhu/nginx/sbin/django.sock maxrequests=1 &

停止:


    kill -9 `cat django.pid`

启动nginx
启动:


    ./nginx -p /home/dantezhu/nginx/

停止:


    kill -QUIT `cat ../logs/nginx.pid`

重新载入配置:


    ./nginx -t -c `pwd`/../conf/nginx.conf
    kill -HUP `cat ../logs/nginx.pid`

成功显示了django的后台界面:
PPPPPPPPPPPPPPPPPPPPP1

5.部署web.py版
安装依赖
spawn-cgi
flup
配置nginx
在server配置项下增加


    location / {
     #这两种方法都可以,只不过spawn-cgi启动的方法不同
     #fastcgi_pass 127.0.0.1:9002;
     fastcgi_pass unix:webpy.sock;

     fastcgi_param REQUEST_METHOD $request_method;
     fastcgi_param QUERY_STRING $query_string;
     fastcgi_param CONTENT_TYPE $content_type;
     fastcgi_param CONTENT_LENGTH $content_length;
     fastcgi_param GATEWAY_INTERFACE CGI/1.1;
     fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
     fastcgi_param REMOTE_ADDR $remote_addr;
     fastcgi_param REMOTE_PORT $remote_port;
     fastcgi_param SERVER_ADDR $server_addr;
     fastcgi_param SERVER_PORT $server_port;
     fastcgi_param SERVER_NAME $server_name;
     fastcgi_param SERVER_PROTOCOL $server_protocol;
     fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
     fastcgi_param PATH_INFO $fastcgi_script_name;
    }

一个简单的index.py


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

    import web 

    urls = ("/.*", "hello")
    app = web.application(urls, globals())

    class hello:
     def GET(self):
      return 'Hello, world!'

    if __name__ == "__main__":
     web.wsgi.runwsgi = lambda func, addr=None: web.wsgi.runfcgi(func, addr)
     app.run()

并执行:


    chmod +x index.py

.启动web.py
启动:


    #spawn-fcgi -P `pwd`/webpy.pid -f /home/dantezhu/htdocs/ngx_web/index.py -a 127.0.0.1 -p 9002 &
    spawn-fcgi -P `pwd`/webpy.pid -f /home/dantezhu/htdocs/ngx_web/index.py -s /home/dantezhu/nginx/sbin/webpy.sock &

停止:


    kill -9 `cat webpy.pid`

启动nginx
加入到rc.local中,自动启动


    /home/dantezhu/nginx/sbin/start.sh
    sudo -u dantezhu /home/dantezhu/htdocs/ngx_django/mysite/start.sh
    sudo -u dantezhu /home/dantezhu/htdocs/ngx_web/start.sh

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8