AWS - 运行web服务 - Cherrypy + Python
我在ec2上有一台运行Ubuntu 10.10服务器版的Linux机器。我用cherrypy框架写了一个网络服务。假设这是我写的代码。
import sys
sys.path.insert(0,'cherrypy.zip')
import cherrypy
from cherrypy import expose
class Service:
@expose
def index(self):
return 'Hello World'
cherrypy.quickstart(Service())
我把这个文件,也就是cherrypy.zip文件,复制到了ec2实例的/var/www目录下。[我得说明一下,这个www目录是我手动创建的,因为原本没有这个目录]。然后我运行了
python webservice.py
并得到了这个信息
[01/Apr/2011:13:50:04] ENGINE Bus STARTED
但是,当我在浏览器中尝试运行
(I have masked my public ip)
ec2-1**-2**-1**-**.ap-southeast-1.compute.amazonaws.com/
时,却出现了连接失败的情况。有人能告诉我我哪里出错了吗?或者我该怎么做?
编辑:
好吧,我发现了一些有趣的事情。当我执行
python webservice.py
时,我看到
ENGINE Serving on 127.0.0.1:8080
这意味着,网络服务只会在本地机器上运行。我该如何设置服务为0.0.0.0(也就是说,让它能服务任何IP地址)呢?
希望这些细节足以让我理解我面临的问题。请帮帮我 :)
编辑2:
哦,找到了解决办法 :-) 在cherrypy.quickstart()调用之前需要加上这个
cherrypy.config.update({'server.socket_host': '0.0.0.0',
'server.socket_port': 80,
})
1 个回答
1
cherrypy.quickstart 函数可以接收一个配置参数,这个参数可以是一个字典、一个打开的配置文件,或者是一个配置文件的路径。我个人比较喜欢用配置文件的路径,因为这样可以减少在代码里写死一些设置,这些设置其实可以通过启动脚本来控制。
另外,因为你掌控着服务器,你可以设置一个反向代理来把请求转发到 CherryPy 应用上。这样你就有了很大的灵活性。例如,如果你想的话,可以同时运行多个 CherryPy 应用实例,每个实例监听不同的端口。
下面是一个 nginx 的示例配置文件,它告诉 nginx 将请求转发到你 CherryPy 应用的一个实例:
server
{
server_name your.hostname.com;
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
还有一个示例配置文件,它告诉 nginx 在两个应用实例之间进行负载均衡,这两个实例监听的是回环地址的 33334 和 33335 端口:
upstream myapps {
server 127.0.0.1:33334;
server 127.0.0.1:33335;
}
server {
server_name your.hostname.com;
location / {
proxy_pass http://myapps;
}
}