2012-12-07 54 views
2

无法使用具有公共IP地址的EC2 Ubuntu Linux 12.04实例启动bottle.py服务器。程序(hw.py)来自瓶子教程即。EC2,bottle.py连接

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 

的EC2公共IP地址没有被连接到任何其它过程。端口80未连接到其他进程。

> sudo netstat -lp 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 *:ssh     *:*      LISTEN  629/sshd 
tcp6  0  0 [::]:ssh    [::]:*     LISTEN  629/sshd 
udp  0  0 *:bootpc    *:*         463/dhclient3 
Active UNIX domain sockets (only servers) 
Proto RefCnt Flags  Type  State   I-Node PID/Program name Path 
unix 2  [ ACC ]  STREAM  LISTENING  7190  667/dbus-daemon  /var/run/dbus/system_bus_socket 
unix 2  [ ACC ]  STREAM  LISTENING  5888  1/init    @/com/ubuntu/upstart 
unix 2  [ ACC ]  STREAM  LISTENING  7312  741/acpid   /var/run/acpid.socket 
unix 2  [ ACC ]  SEQPACKET LISTENING  26855 21843/udevd   /run/udev/control 

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

该错误是socket.error:[错误99]无法分配请求的地址。

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

...结合所述服务器到所有IP /接口。将EC2公共IP地址输入到带有或不带有8080的浏览器中将显示“此页面不可用”。

理想情况下,第一个选项,即。运行(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)       = ? 
+0

你有没有尝试过以root身份运行Python? – Blender

+0

> sudo python hw.py给出了无法分配请求的地址错误。 –

+0

使用'strace -f'运行,在出错前粘贴相关位。在错误发生之前, – soulseekah

回答

5

试试这个。我用它来测试网络。在服务器的后台

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 & 

那么我认为你现在可以访问。


Changing to: run(host='0.0.0.0', port=8080)

... which binds the server to all IPs/interfaces. Typing the EC2 public IP address into browser with and without :8080 displays a "This page is not available".

情况下,该错误的,我认为你需要在你的根URL的一端与/hello参观。

+0

试过但没有工作。首先,使用公共IP地址(xxx.xxx.xxx.xxx)与EC2的连接确实起作用,因为我正在使用另一个Python Web服务器进行测试并且已连接。但是,bottle.py不起作用。也试着用xxx.xxx.xxx.xxx:8080/hello,那也不管用。试过Chrome和FF - 没有运气! –

+1

@dbv你可以试试'$ ps aux | grep hw.py'来检查它是否正在运行。而b.t.w,你确定你已经为你的服务开通了港口吗? – Kjuly

+0

通过EC2打开了0.0.0.0:8080端口,现在可以工作。谢谢!顺便说一句,你知道为什么bottle.py不绑定在端口80的EC2公共IP地址在hw.py即ie。 xxx.xxx.xxx.xxx:80?此外,当标准瓶服务器被替换为多线程服务器时,这个限制是否适用? –