AWS - 运行web服务 - Cherrypy + Python

2 投票
1 回答
2620 浏览
提问于 2025-04-16 14:53

我在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;
  }
}

撰写回答