Nginx + uWSGI + web.py 搭建示例

废话少说,直接书写详细搭建过程,以作记录。

(1)安装Nginx
1.1 下载nginx-1.0.5.tar.gz并解压
1.2 ./configure (也可以增加–prefix= path指定安装路径)
此时有可能会提示缺少pcre支持,如果要安装pcre的话可以通过 yum install pcre-devel 来实现安装
1.3 make
1.4 make install

(2)安装uWSGI
2.1 下载uwsgi-0.9.8.2.tar.gz并解压
2.2 make
在安装uWSGI的时候有可能提示说是libxml2不存在,针对此情况,建议通过 yum install libxml2-devel来解决

(3)安装web.py
可以通过easy_install web.py来安装最新版,不过我在安装0.36的时候出错,而且是语法错误,所以最终回退到0.35版

(4)以一个简单的webpy程序作为示例。以下代码是一个完整的webpy程序(webpytest.py)

import web
urls = (
    '/(.*)', 'hello'
    )
app = web.application(urls, globals())
class hello:
    def GET(self, name):
        if not name:
            name = "World"
        return "Hello" + name + "!"
application = app.wsgifunc()

最后一句的application = app.wsgifunc()是关键,此时才可以通过wsgi进行访问

(5)启动uWSGI
uwsgi -s 127.0.0.1:9000 -w webpytest

(6)更改Nginx相关配置(nginx.conf)

server {
        listen       80;
        server_name  10.0.11.226;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:9000;
            uwsgi_param UWSGI_CHDIR /usr/local/sphinx;
            uwsgi_param UWSGI_SCRIPT webpytest;
        }

注意:uwsgi_pass 的相关配置必须和启动uwsgi时的一致!UWSGI_CHDIR是指程序所在的目录,UWSGI_SCRIPT是指启动哪个程序(注意,这里必须去掉py后缀).测试发现,UWSGI_CHDIR 和UWSGI_SCRIPT也可以不要!

(6)启动nginx
/usr/local/nginx/sbin/nginx
重启nginx命令为(/usr/local/nginx/sbin/nginx -s stop)

(7)通过http即可访问

http://10.0.11.226

以上只是一个非常简单的搭建过程,仅作记录!

via:http://www.cnblogs.com/Jerryshome/archive/2011/07/20/2111683.html

Posted in python | Tagged , , | Leave a comment

redmine+mongrel+nginx+ssl

最近在新公司使用了redmine来进行项目流程和问题管理以及代码的管控。由于boss等需要在外网访问到redmine服务,所以需要将redmine所在服务器映射到外网,为了安全起见使用了ssl,提供客户端证书,通过双向认证的机制来限制访问。

关于redmine的安装,可以参考这里,需要注意的一点是不同的redmine版本对各种组件的需求在版本上要求比较严格,还有ruby推荐使用1.8的,如果使用最新的ruby,目前是1.9版本,则会有mysql中文问题,后来我直接使用了sqlite3作为数据库了。

在安装mongrel的过程中,总是遇到编译错误啊,后来参考了这里才顺利的安装上。不过在nginx+mongrel的模式中,我使用的是redmine-1.4的版本,会出现一个无法登陆的状况,后来在官网看到了解决方法,这个需要打一个补丁,可以参考这里

关于ssl证书如何创建和使用,大家可以google一下,网上有很多相关的介绍说明。这里主要说下我遇到的https协议无法在外网使用的问题。公司内网使用的是飞鱼星路由,我将redmine主机映射到外网,主要是使用了路由的端口映射功能,比如我把外网访问的端口18888映射到内网redmine主机的443端口上,这样当访问公司的出口ip,就必须使用https协议并提供相应的证书才能访问到redmine服务,nginx的配置是这样的:

  server {
listen 443;
server_name redmine.ename.cn;
root /usr/local/nginx/www/redmine-1.4;
index index.html index.htm;
ssl on;
ssl_certificate /usr/local/nginx/conf/keys2/server.crt;
ssl_certificate_key /usr/local/nginx/conf/keys2/server.key;
ssl_client_certificate /usr/local/nginx/conf/keys2/ca.crt;
ssl_session_timeout 5m;
ssl_verify_client on;
ssl_verify_depth 10;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://mongrel;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

这里就遇到一个诡异问题,当我使用https访问redmine的时候它是正常的,可以当我做一些操作,比如新建问题,或者删除问题,或者发布帖子,发现post表单后,redmine自动使用的协议是http而不是https进行跳转,导致redmine直接就无法访问,在google上找到这篇文章说如何解决这个问题,根据里面的代码进行了修改,可是request.scheme取道的协议标识一直是http,就算你使用https访问了,在日志里面打印出来的request.scheme还是http。后来才想到,虽然我们走了https协议,但是实际上这个知道nginx这一层,接下去通过proxy调用的mongrel还是当作普通的http来实现,所以rails一直取道的是http,于是在表单提交后的跳转还是会自动跳转到http上,于是修改了nginx的配置,指定开启ssl,同时将外网访问端口也指定给proxy,这样rails就能夠使用正常的https协议跳转,同时也能取道访问的端口。ngxin配置修改如下:

  server {
listen 443;
server_name redmine.ename.cn;
root /usr/local/nginx/www/redmine-1.4;
index index.html index.htm;
ssl on;
ssl_certificate /usr/local/nginx/conf/keys2/server.crt;
ssl_certificate_key /usr/local/nginx/conf/keys2/server.key;
ssl_client_certificate /usr/local/nginx/conf/keys2/ca.crt;
ssl_session_timeout 5m;
ssl_verify_client on;
ssl_verify_depth 10;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://mongrel;
proxy_redirect off;
proxy_set_header Host $host:18888;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto  https;
proxy_set_header X-Forwarded-Ssl    on;
}
}

主要增加了上面红色区域的配置。在这个问题处理过程中,我还试图去不断修改redmine程序,都以失败告终,最后以这样的简单的设置解决了,甚是郁闷啊。。。。

Posted in rails | Tagged , , | Leave a comment

命令行下查看php函数说明的好工具——pman

在pear上面有这样一个工具,叫pman,它实现了可以直接在命令行下使用类似于man ls这样的查看命令,来了解php的一些函数使用说明和例子。

首先从pear上面安装:

pear install doc.php.net/pman

安装成功后,我们就可以使用这样到命令来查看相关的php函数使用说明了

pman substr

有了这个工具后,对于我们在类unix系统下编写php的人来说,简直是太有用了,直接省略掉了从终端和手册或者浏览器之间的不断切换的过程。对于经常使用vim的,那就有福了,我们可以把这个工具映射到某个按键上,在vim编辑php文件的时候,如果遇到需要查看了解的函数,直接按该按键,就可以直接看到该函数的详细说明了。我在.vimrc里面是这样配置的

autocmd FileType php setlocal keywordprg=pman “设置pman手册(只对vim哦,vi不行的,亲要注意)

pman被映射到了K字母上,只要按K就可以调用并显示。

ps:人生就是各种懒啊,,,懒人是推动科技进步的重要因素。。。^=^

 

Posted in php | Tagged , , | 1 Comment

PHP输入流php://input

在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input

对一php://input介绍,PHP官方手册文档有一段话对它进行了很明确地概述。

php://input allows you to read raw POST data. It is a less memory intensive alternative to $HTTP_RAW_POST_DATA and does not need any special php.ini directives. php://input is not available with enctype=”multipart/form-data”.
翻译过来,是这样:
“php://input可以读取没有处理过的POST数据。相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-data” Continue reading

Posted in php | Tagged , , | 1 Comment

木头,木头,请告诉我时间是什么??

关于木头总是有很多的故事,而且故事本身总是和时间离不开关系。苍天巨树,它的年轮告诉我们时间的流逝,告诉我们生命的轮回,那一轮一轮的圆圈,虽然静止无语,却似乎在跟我们诉说着无尽的关于时间的故事。。。

今天我们家木头很兴奋,似乎它也对我手上的这个新玩意很感兴趣,一个木质的LED时钟,从外观上看似乎就是一块普通的木头,其实里面大有玄机:1、它能告诉你日期和时间,这是必须的。2、它能告诉你当前温度,这个有点高级。3、它能感应声音自动休眠和唤醒。我把它放在卧室的书桌上,装上三节AA电池,调整当前时间,顺带的调整一下闹钟,soone总是无休止的赖床,必须用这个治一治。下面上上这个LED时钟的真面目

木质LED时钟

木质LED时钟

想和soone一样拥有一个?soone是在这里淘的,赶紧去淘一个吧。

 

Posted in 极客屋 | Tagged , , | Leave a comment

[转载]Python 的虛擬環境及多版本開發利器─Virtualenv 與 Pythonbrew

Virtualenv 和 Pythonbrew 都是可以創造虛擬(獨立)Python 環境的工具,只是虛擬(獨立)標的不同。

Virtualenv 可以隔離函數庫需求不同的專案,讓它們不會互相影響。在建立並啟動虛擬環境後,透過 pip 安裝的套件會被放在虛擬環境中,專案就可以擁有一個獨立的環境。

簡而言之,Virtualenv 可以幫你做到:

  • 在沒有權限的情況下安裝新套件
  • 不同專案可以使用不同版本的相同套件
  • 套件版本升級時不會影響其他專案

Pythonbrew 則可以在家目錄中安裝多個 Python,並迅速地切換版本;也可以在指定的 Python 版本下批次測試你的 Python 程式;另外更整合了 Virtualenv。

這篇文章會詳細介紹這兩個工具,讓你在多人開發及多版本開發的環境中更得心應手。 Continue reading

Posted in python | Tagged , , | 1 Comment

functools模块

在看tornado的源代码的时候发现了functools模块,google一下,发现这里有相关的介绍,很简单,稍微摘录了一下

functools模块提供了两个装饰器。这个模块是Python 2.5后新增的

wraps(wrapped[, assigned][, updated])

total_ordering(cls)

Continue reading

Posted in python | Tagged , , | Leave a comment

[转]Python:os模块的进程管理

  1. 有两种方式来实现并发性,一种方式是让每个“任务”或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待另一个时间片的到来。另一种方式是在在程序中指定多个“执行线程”,让它们在相同的内存空间中工作。这称为“多线程处理”。线程比进程更有效,因为操作系统不必为每个线程创建单独的内存空间。
  2. Continue reading

Posted in python | Tagged , , | Leave a comment

gf3在天安门附近试拍

幸福路人

王府井小吃街

钟楼

钟楼

看起来很忧郁的狮子

仰望的角度

仰望的角度

老北京布鞋

老北京布鞋

同仁堂

同仁堂

热闹的电话亭

热闹的电话亭

这里缺少一个人

这里缺少一个人

无题

无题

老宅第

老宅第

铺首

铺首

小溪

小溪

白椅

白椅

狮头

狮头

华表

华表

Posted in 心语 | Tagged , , | 2 Comments

[翻译]关于python的“with”声明

从com.lang.python以及其他的一些论坛上看来,一些有经验的python开发者对于在2.5版本新增加的with似乎有一点迷惑。

如同Python的其他方面一样,一旦你了解了with是用来试图解决哪些问题的时候,你会发现其实它很简单。

看看下面的代码片段:

set things up
try:
    do something
finally:
    tear things down

在这里,”set things up” 可以是打开一个文件或者获得一些外部资源,而”tear things down”可能是相对应的关闭打开的文件或者释放或移除一些资源。try-finally结构保证了就算”do something”代码没有真正执行完成,”tear thigs down”部分也总是会被执行。

如果你经常如上面那样编写一些代码,那么将“set things up”和”tear things down“这些代码放到库函数里以便重用是比较方便的。你可以如下面那样作:

def controlled_execution(callback):
    set things up
    try:
        callback(thing)
    finally:
        tear things down

def my_function(thing):
    do something

controlled_execution(my_function)

但上面的代码有一点冗长,特别是在你需要修改局部变量的时候。另一种方法是使用一次性生成器(译者:one-shot generator是这样翻译?),用for-in声明来”包装“这段代码:

def controlled_execution(callback):
    set things up
    try:
        yield thing
    finally:
        tear things down

for thing in controlled_execution():
    do something with thing

当你只想一次性执行一些代码的时候,上面的代码使用循环结构实现仍然有一点奇怪。所以在考虑了一些备选方案后,GvR和python的开发团队最后终于想出了后面的方法,使用对象来代替生成器来控制一个外埔代码片段的行为:

class controlled_execution:
    def __enter__(self):
        set things up
        return thing
    def __exit__(self, type, value, traceback):
        tear thigs down
with controlled_execution() as thing:
    some code

现在,当执行with语句,python解释器评估with后面的表达式,调用该表达式的__enter__方法,并且将__enter__的返回值赋值给as后面的变量,并且不管发生什么,python一定会执行表达式里面定义的__exit__方法。

作为一个额外的好处,__exit__可以在有异常的时候抑制异常或者做一些必要的异常处理。如果是抑制异常的话只要返回true值就可以。比如下面定义的__exit__方法就仅仅判断了TypeError类型的异常,并放弃处理其他所有的异常:

def __exit__(self, type, value, traceback):
    return isinstance(value, TypeError)

在python2.5里面,文件对象已经被预置了__enter__和__exit__方法了:前者简单的返回了文件对象本身而后者则关闭文件:

>>> f = open("x.txt")
>>> f
<open file 'x.txt', mode 'r' at 0x00AE82F0>
>>> f.__enter__()
<open file 'x.txt', mode 'r' at 0x00AE82F0>
>>> f.read(1)
'X'
>>> f.__exit__(None, None, None)
>>> f.read(1)
Traceback (most recent call last):
File "", line 1, in
ValueError: I/O operation on closed file

所以如果要打开一个文件,处理里面的内容并保证关闭打开的文件,你可以简单的这样作:

with open('x.txt') as f:
    data = f.read()
    do something with data

with声明语法看起来不是那么困难,不是吗?

[[补充]]

  1. 如果with后面没带as的话,__enter__返回值将被忽略
  2. __exit__函数的返回值用来指示with-block部分发生的异常是否要re-raise,如果返回False,则会re-raise with-block的异常,如果返回True,则就像什么都没发生

ps:本人不小心看到这篇文章,并很强烈的想做个备份,鉴于是英文的,就自作主张的想翻译一下,可能有很多地方翻译不周到,请指出,谢谢

英文地址:http://effbot.org/zone/python-with-statement.htm

Posted in python | Tagged , | Leave a comment