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


Posted in Python onDecember 25, 2015

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
Python 相关文章推荐
Python中time模块和datetime模块的用法示例
Feb 28 Python
python实现汉诺塔递归算法经典案例
Mar 01 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
Scrapy框架爬取Boss直聘网Python职位信息的源码
Feb 22 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
Jun 27 Python
Python函数参数定义及传递方式解析
Jun 10 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
序列化Python对象的方法
Aug 01 Python
Python configparser模块封装及构造配置文件
Aug 07 Python
Python Sqlalchemy如何实现select for update
Oct 12 Python
Python如何使用ConfigParser读取配置文件
Nov 12 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 Python
Linux下将Python的Django项目部署到Apache服务器
Dec 24 #Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 #Python
在Mac OS上使用mod_wsgi连接Python与Apache服务器
Dec 24 #Python
在Mac OS上搭建Python的开发环境
Dec 24 #Python
详解Python字符串对象的实现
Dec 24 #Python
浅谈Python单向链表的实现
Dec 24 #Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 #Python
You might like
PHP安装攻略:常见问题解答(一)
2006/10/09 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
Laravel模型事件的实现原理详解
2018/03/14 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
直接在JS里创建JSON数据然后遍历使用
2014/07/25 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
值得分享的轻量级Bootstrap Table表格插件
2016/05/30 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
React入门教程之Hello World以及环境搭建详解
2017/07/11 Javascript
浅谈通过JS拦截 pushState和replaceState事件
2017/07/21 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
深入了解响应式React Native Echarts组件
2019/05/29 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
2020/09/21 Javascript
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
python实现爬取百度图片的方法示例
2019/07/06 Python
使用Python实现Wake On Lan远程开机功能
2020/01/22 Python
python ETL工具 pyetl
2020/06/07 Python
使用css实现android系统的loading加载动画
2019/07/25 HTML / CSS
美国最大的旗帜经销商:Carrot-Top
2018/02/26 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
一年级学生期末评语
2014/04/21 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android