Python EC2,瓶式.py接头

Python EC2,瓶式.py接头,python,ubuntu,amazon-ec2,bottle,Python,Ubuntu,Amazon Ec2,Bottle,无法使用带有公共IP地址的EC2 Ubuntu Linux 12.04实例启动瓶子.py服务器。该程序(hw.py)来自瓶子教程ie from bottle import route, run @route('/hello') def hello(): return 'hello world' run(host='xxx.xxx.xxx.xxx', port=80) 运行方式: > python hw.py or > sudo python hw.py 生成错误: T

无法使用带有公共IP地址的EC2 Ubuntu Linux 12.04实例启动瓶子.py服务器。该程序(hw.py)来自瓶子教程ie

from bottle import route, run

@route('/hello')
def hello():
    return 'hello world'

run(host='xxx.xxx.xxx.xxx', port=80)
运行方式:

> python hw.py
or
> sudo python hw.py
生成错误:

Traceback (most recent call last):
  File "hw.py", line 7, in <module>
    run(host='xxx.xxx.xxx.xxx', port=80)
  File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 2700, in run
    server.run(app)
  File "/usr/local/lib/python2.7/dist-packages/bottle.py", line 2382, in run
    srv = make_server(self.host, self.port, handler, **self.options)
  File "/usr/lib/python2.7/wsgiref/simple_server.py", line 144, in make_server
    server = server_class((host, port), handler_class)
  File "/usr/lib/python2.7/SocketServer.py", line 408, in __init__
    self.server_bind()
  File "/usr/lib/python2.7/wsgiref/simple_server.py", line 48, in server_bind
    HTTPServer.server_bind(self)
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
    SocketServer.TCPServer.server_bind(self)
  File "/usr/lib/python2.7/SocketServer.py", line 419, in server_bind
    self.socket.bind(self.server_address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
更改为:运行(主机=xxx.xxx.xxx.xxx',端口=8080)

错误为套接字。错误:[Errno 99]无法分配请求的地址

更改为:运行(主机=0.0.0.0',端口=8080)

。。。它将服务器绑定到所有IP/接口。在浏览器中键入EC2公共IP地址(带或不带:8080)将显示“此页面不可用”

理想情况下,第一个选项即.run(host='xxx.xxx.xxx.xxx',port=80)应该可以工作,因为其他web服务器就是这样启动的。有人知道如何解决这个问题吗

编辑:添加了strace-f中的最后一组行:

write(2, "  File \"/usr/lib/python2.7/Socke"..., 70  File "/usr/lib/python2.7/SocketServer.py", line 419, in server_bind
) = 70
open("/usr/lib/python2.7/SocketServer.py", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=23321, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f434cbfe000
read(4, "\"\"\"Generic socket server classes"..., 4096) = 4096
read(4, "service) is to maintain an\nexpli"..., 4096) = 4096
read(4, "set()\n\n    def shutdown(self):\n "..., 4096) = 4096
read(4, "n't use serve_forever()\n    - fi"..., 4096) = 4096
write(2, "    ", 4    )                     = 4
write(2, "self.socket.bind(self.server_add"..., 38self.socket.bind(self.server_address)
) = 38
close(4)                                = 0
munmap(0x7f434cbfe000, 4096)            = 0
write(2, "  File \"/usr/lib/python2.7/socke"..., 57  File "/usr/lib/python2.7/socket.py", line 224, in meth
) = 57
open("/usr/lib/python2.7/socket.py", O_RDONLY) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=20485, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f434cbfe000
read(4, "# Wrapper module for _socket, pr"..., 4096) = 4096
read(4, "oo long.\"\n    errorTab[10064] = "..., 4096) = 4096
write(2, "    ", 4    )                     = 4
write(2, "return getattr(self._sock,name)("..., 39return getattr(self._sock,name)(*args)
) = 39
close(4)                                = 0
munmap(0x7f434cbfe000, 4096)            = 0
write(2, "socket", 6socket)                   = 6
write(2, ".", 1.)                        = 1
write(2, "error", 5error)                    = 5
write(2, ": ", 2: )                       = 2
write(2, "[Errno 99] Cannot assign request"..., 42[Errno 99] Cannot assign requested address) = 42
write(2, "\n", 1
)                       = 1
rt_sigaction(SIGINT, {SIG_DFL, [], SA_RESTORER, 0x7f434c7d1cb0}, {0x41d920, [], SA_RESTORER, 0x7f434c7d1cb0}, 8) = 0
close(3)                                = 0
exit_group(1)                           = ?

试试这个。我用它来测试网络

from bottle import Bottle, run

app = Bottle()

@app.route('/')
def index():
    return 'Service Running'

run(
        app,                    # Run |app| Bottle() instance
        host     = '0.0.0.0',
        port     = 8080,
        reloader = True,        # restarts the server every time edit a module file
        debug    = True         # Comment out it before deploy
        )
在服务器后台运行此文件(hw.py):

$ cd path/to/your/file
$ nohup python server.py &
那我想你现在可以去看看了


更改为:运行(主机=0.0.0.0',端口=8080)

。。。它将服务器绑定到所有IP/接口。在浏览器中键入EC2公共IP地址(带或不带:8080)将显示“此页面不可用”


如果出现此错误,我认为您需要在根URL末尾使用
/hello
进行访问。

是否尝试以root身份运行Python?>sudo Python hw.py给出了无法分配请求的地址错误。使用
strace-f
运行,在错误之前粘贴相关位。在错误之前添加了最后一组行。thx.试过了,但没用。首先,使用公共IP地址(xxx.xxx.xxx.xxx)与EC2的连接确实有效,因为我正在使用另一台Python web服务器进行测试,并且该服务器已连接。但是,瓶子不起作用。还尝试了xxx.xxx.xxx.xxx:8080/hello,但也不起作用。尝试了Chrome和FF-没有运气@dbv您可以尝试
$ps aux | grep hw.py
检查它是否正在运行。b.t.w,你确定你已经为你的服务打开了端口吗?通过EC2打开了0.0.0.0:8080端口,现在可以工作了。谢谢顺便说一句,你知道为什么在hw.py的端口80(即xxx.xxx.xxx.xxx:80)处,battle.py不与EC2公共IP地址绑定吗?此外,当标准瓶服务器被替换为多线程服务器时,此限制是否适用?@dbv我认为您需要在AWS控制台面板上打开端口80。正在测试的另一个web服务器使用端口80,因此已经打开。我的猜测是,当更换标准瓶服务器时,ip:端口组合是可用的。
$ cd path/to/your/file
$ nohup python server.py &