一、使用nginx+mod_wsgi
参考:http://moodylee.me/2011/10/13/python_web_programming_1/

1、下载软件
mkdir software
# cd software/
http://nginx.org/en/download.html
# wget http://nginx.org/download/nginx-1.2.5.tar.gz
错误:这个是用在apache上面的,不是用在nginx上面的
# wget http://modwsgi.googlecode.com/files/mod_wsgi-3.4.tar.gz
或者
#hg clone https://code.google.com/p/modwsgi/
也就是mod_wsgi-3.2-1.el6.i686包
# rpm -qa|grep mod_wsgi
mod_wsgi-3.2-1.el6.i686

正确为
hg工具需要安装mercurial-hgk
# yum -y install mercurial-hgk
# hg clone http://bitbucket.org/lifeeth/mod_wsgi/

2、安装
1)基本环境
./configure: error: the WSGI addon requires Python library.
# yum -y install python-devel
./configure: error: the HTTP rewrite module requires the PCRE library.
# yum -y install pcre-devel
2)安装nginx+mod_wsgi
#tar -zxvf nginx-1.2.5.tar.gz
#cd nginx-1.2.5
# ./configure --add-module=/root/software/mod_wsgi
config通过
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
# make && make install
3、配置mod_wsgi
1)基本bin和配置文件
# cd /root/software/mod_wsgi
安装好后,先执行mod_wsgi中的配置程序setup.py。它会帮你把一些文件拷贝到nginx配置
mod_wsgi本身带了一些示例,全部放在代码的examples目录中。配置文件也有一个示例在这个目录中就叫做nginx.conf。
如果编译安装nginx不是默认配置,指定了安装目录,则运行本脚本需要指定目录
#python setup.py --prefix=/usr/local/nginx --conf-path=/usr/local/nginx/conf --sbin-path=/usr/local/nginx/sbin
如果是默认,则无需
# python setup.py
using
prefix: /usr/local/nginx
sbin-path: /usr/local/nginx/sbin
conf-path: /usr/local/nginx/conf
done
增加
sbin
# ll /usr/local/nginx/sbin/
total 2908
-rwxr-xr-x 1 root root 2956970 Nov 30 12:09 nginx #原来
-rwxr-xr-x 1 root root 4584 Nov 30 12:18 ngx_wsgi.py
-rwxr-xr-x 1 root root 5322 Nov 30 12:18 ngx_wsgiref.py
-rwxr-xr-x 1 root root 3905 Nov 30 12:18 ngx_wsgitest.py
配置
/usr/local/nginx/conf/wsgi_vars
2)ngxin配置文件

# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf_bak
# cp /root/software/mod_wsgi/examples/nginx.conf /usr/local/nginx/conf/nginx.conf
vim /usr/local/nginx/conf/nginx.conf
worker_processes 2;
daemon off;
master_process on;

error_log logs/error.log info;
pid logs/nginx.pid;

events {
worker_connections 1024;
}

env HOME;
#env PYTHONPATH=/some/path; #修改 项目路径,可不填写
env PYTHON_EGG_CACHE=/tmp; #增加 #解决python执行egg包的权限问题

http {
#include conf/mime.types; #修改 路径问题
include mime.types;
default_type application/octet-stream;

#log_format main '$remote_addr - $remote_user [$time_local] $request '
# '"$status" $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

gzip off;
#ssl on;
#ssl_certificate conf/server.crt;
#ssl_certificate_key conf/server.key;

wsgi_python_optimize 0;
#wsgi_python_executable /usr/bin/python;
#wsgi_python_home /usr/;
wsgi_enable_subinterpreters on;

server {
listen 1234;
server_name localhost;

#include conf/wsgi_vars; # 修改 路径问题
include wsgi_vars;

#wsgi_middleware wsgiref.validate validator;
#wsgi_middleware paste.lint;

location / {
#client_body_buffer_size 50;
wsgi_pass /usr/local/nginx/nginx.py; #默认没有这个文件,需要拷贝,用于测试

wsgi_pass_authorization off;
wsgi_script_reloading on;
wsgi_use_main_interpreter on;
}
}

}
}
125 #gzip_types text/html text/plain; 需要注释
或者下面全部删除
3)测试脚本
# cp mod_wsgi/examples/nginx.py /usr/local/nginx/nginx.py
启动后还报错
没有nginx_module这模版
注释 #import nginx_module
4、启动
# /usr/local/nginx/sbin/nginx
http://172.16.9.252:1234/
会显示一些信息信息
5、部署自己的项目
1) 404 500页面
vim /usr/local/nginx/html/404
# cat /usr/local/nginx/html/404.html
<h1>Oh Noes!</h1>
# cat /usr/local/nginx/html/500.html
<h1>Oh Bad!</h1>
注意确保
#vim /usr/lib/python2.6/site-packages/rsync-api/myproject/settings.py
TEMPLATE_DIRS = (
'/usr/local/nginx/html/',
)
2)自己程序
rpm -vih rsync-api-0.0.1-1.noarch.rpm
2) 入口程序
(1)入口脚本
#vim /usr/lib/python2.6/site-packages/rsync-api/main.wsgi
# -*- coding: utf-8 -*-
import os, sys
sys.path.append('/usr/lib/python2.6/site-packages/rsync-api')
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

import django.core.handlers.wsgi

_application = django.core.handlers.wsgi.WSGIHandler()

DEBUG = True
def application(environ, start_response):
environ['PATH_INFO'] = environ['SCRIPT_NAME'] + environ['PATH_INFO']
return _application(environ, start_response)
(2)nginx配置修改
vim /usr/local/nginx/conf/nginx.conf
location / {
#client_body_buffer_size 50;
#wsgi_pass /usr/local/nginx/nginx.py;修改为程序脚本
wsgi_pass /usr/lib/python2.6/site-packages/rsync-api/main.wsgi;

wsgi_pass_authorization off;
wsgi_script_reloading on;
wsgi_use_main_interpreter on;
}
4)测试
测试访问不存在的页面
测试访问引起500
http://172.16.9.252:1234/rsync/list
500
打开DEBUG可以看到是权限问题,
默认是nobody运行
nobody 18982 0.0 0.2 8024 2188 pts/2 S+ 18:01 0:00 nginx: worker process
nobody 18983 0.0 0.2 8024 2256 pts/2 S+ 18:01 0:00 nginx: worker process
无法对/etc/rsyncd.conf操作
# ll /etc/rsyncd.conf
-r-------- 1 root root 5901 Nov 30 14:14 /etc/rsyncd.conf
配置修改为
# vim /usr/local/nginx/conf/nginx.conf
user root;

二、使用nginx+uWSGI方式
http://projects.unbit.it/uwsgi/
http://projects.unbit.it/uwsgi/wiki/Install
http://projects.unbit.it/uwsgi/wiki/Quickstart
http://www.oschina.net/question/54100_30386
http://wiki.nginx.org/HttpUwsgiModuleMultipleDynamicApplications
http://projects.unbit.it/uwsgi/wiki/Example
1、下载
# cd software/
http://nginx.org/en/download.html
# wget http://nginx.org/download/nginx-1.2.5.tar.gz
http://projects.unbit.it/uwsgi/
# wget http://projects.unbit.it/downloads/uwsgi-1.4.2.tar.gz
2、安装
1) uwsgi
# yum -y install libxml2-dev
# tar -zxvf uwsgi-1.4.2.tar.gz
# cd uwsgi-1.4.2
#####
# make -f Makefile.Py26 #指定你python的版本,如果你的python是2.7 就应该是 make -f Makefile.Py27
cp uwsgi /usr/sbin/uwsgi
####这种方式老版本方式了
# python setup.py --help
# python setup.py build
running build
running build_py
creating build/lib
# python setup.py install
############## end of uWSGI configuration #############
*** uWSGI is ready, launch it with /usr/bin/uwsgi ***
running build
running build_py
running install_lib
copying build/lib/uwsgidecorators.py -> /usr/lib/python2.6/site-packages
byte-compiling /usr/lib/python2.6/site-packages/uwsgidecorators.py to uwsgidecorators.pyc
running install_egg_info
running egg_info
creating uWSGI.egg-info
writing uWSGI.egg-info/PKG-INFO
writing top-level names to uWSGI.egg-info/top_level.txt
writing dependency_links to uWSGI.egg-info/dependency_links.txt
writing manifest file 'uWSGI.egg-info/SOURCES.txt'
reading manifest file 'uWSGI.egg-info/SOURCES.txt'
writing manifest file 'uWSGI.egg-info/SOURCES.txt'
Copying uWSGI.egg-info to /usr/lib/python2.6/site-packages/uWSGI-1.4.2-py2.6.egg-info
running install_scripts
另外一种安装方式
# yum -y install python-pip.noarch
# pip-python install pip
未成功
python uwsgiconfig.py --build

cp uwsgi /usr/sbin/uwsgi

至此 uWSGI 就算是安装完成了,下一步安装 Nginx > 0.8 的版本,因为只有Nginx > 0.8 的版本才支持wsgi

2)、nginx
yum -y install nginx

3、配置nginx
如果没有
# cp ./nginx/uwsgi_params /etc/nginx/
#vi /etc/nginx/conf.d/test-uwsgi.conf
server {
listen 12345;
server_name test.skylog.com;
access_log /data/logs/sitelogs/test.skylog.com-access.log ;
error_log /data/logs/sitelogs/test.skylog.com-error.log ;

location / {
uwsgi_pass 127.0.0.1:8630;
include uwsgi_params;
}
}
全部
/etc/nginx/nginx.conf
user root;
worker_processes 2;
daemon off;
master_process on;

#error_log logs/error.log info;
pid /data/logs/nginx.pid;

events {
use epoll;
worker_connections 1024;
}

#env HOME;
#env PYTHONPATH=/var/www/rsync;
#env PYTHON_EGG_CACHE=/tmp;

http {
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_port - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

#access_log logs/access.log main;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

gzip off;
#ssl on;
#ssl_certificate conf/server.crt;
#ssl_certificate_key conf/server.key;

##wsgi_python_optimize 2;
##wsgi_python_executable /usr/bin/python;
#wsgi_python_home /usr;
#wsgi_enable_subinterpreters on;
server {
listen 12345;
server_name test.skylog.com;
access_log /data/logs/sitelogs/test.skylog.com-access.log ;
error_log /data/logs/sitelogs/test.skylog.com-error.log ;

location / {
uwsgi_pass 127.0.0.1:8630;
include uwsgi_params;
}
}

}

4、配置uwsgi
socket方式,比http方式好
1)配置文件
# vim /usr/lib/python2.6/site-packages/rsync-api/myproject.xml
<uwsgi>
<socket>127.0.0.1:8630</socket>
<listen>20</listen>
<master>true</master>
<pidfile>/tmp/uwsgi.pid</pidfile>
<processes>2</processes>
<module>wsgi</module> #就是wsgi.py
<pythonpath>/usr/lib/python2.6/site-packages/rsync-api/</pythonpath> #项目目录
<profiler>true</profiler>
<memory-report>true</memory-report>
<enable-threads>true</enable-threads>
<logdate>true</logdate>
<limit-as>6048</limit-as>
</uwsgi>
2)加载脚本
作用通过加载项目加载到项目和应用
也就是上面的<module>wsgi</module>
# vi /usr/lib/python2.6/site-packages/rsync-api/wsgi.py
import os,sys

if not os.path.dirname(__file__) in sys.path[:1]:
sys.path.insert(0, os.path.dirname(__file__))
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproject.settings'

from django.core.handlers.wsgi import WSGIHandler
application = WSGIHandler()

说明:
os.path.dirname(__file__):本文件所在目录
sys.path系统路径
3)启动
#uwsgi -x /usr/lib/python2.6/site-packages/rsync-api/myproject.xml
不行
成功的提示
Sat Dec 1 13:00:01 2012 - WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x9596c78 pid: 21343 (default app)
未成功的提示
Sat Dec 1 13:00:44 2012 - unable to load app 0 (mountpoint='') (callable not found or import error)
Sat Dec 1 13:00:44 2012 - *** no app loaded. going in full dynamic mode **

问题原因<module>jin</module>不能项目名相同,不能设置为<module>myproject</module>,也就是加载的脚本也不能设置为myproject.py
也不能叫uwsgi
myproject.xml 可以和项目相同

规范:
加载脚本:uwsgi 不能是uwsgi或者项目名,不然无法加载
完整xml:myproject.xml

测试nginx是root这种方式无法读取/etc/rsyncd.conf文件

快速启动方式
uwsgi --socket 127.0.0.1:8630 --pythonpath /usr/lib/python2.6/site-packages/rsync-api --module wsgi --processes 2
启动之后杀进程关不掉
# kill -9 `cat /tmp/uwsgi.pid`
5、启动
# /etc/init.d/nginx start
6、测试
http://192.168.78.250:12345/
7、也可以使用unix socket模式
socket = /tmp/i_am_a_unix_socket.sock
#vim /usr/lib/python2.6/site-packages/rsync-api/myproject1.xml
# cp /usr/lib/python2.6/site-packages/rsync-api/wsgi.py /usr/lib/python2.6/site-packages/rsync-api/rsync.py
uwsgi -x /usr/lib/python2.6/site-packages/rsync-api/myproject1.xml
uwsgi --socket /tmp/i_am_a_unix_socket.sock --pythonpath /usr/lib/python2.6/site-packages/rsync-api --module rsync --processes 2
module是其中一个app名称也报错
# uwsgi --socket /tmp/uwsgi.sock --pythonpath /usr/lib/python2.6/site-packages/rsync-api --module wsgi --processes 2
# vim /etc/nginx/nginx.conf
uwsgi_pass unix:///tmp/uwsgi.sock;