2

パブリックIPアドレスを持つEC2UbuntuLinux12.04インスタンスを使用してbottle.pyサーバーを起動できません。プログラム(hw.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

変更先:run(host ='xxx.xxx.xxx.xxx'、port = 8080)

エラーはsocket.errorです:[Errno99]要求されたアドレスを割り当てることができません。

変更先:run(host = '0.0.0.0'、port = 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)                           = ?
4

1 に答える 1

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 &

それなら、今すぐ訪問できると思います。


変更: run(host='0.0.0.0', port=8080)

...サーバーをすべてのIP /インターフェースにバインドします。:8080 を付けて、または付けずに EC2 パブリック IP アドレスをブラウザに入力すると、「このページは利用できません」というメッセージが表示されます。

/helloこのエラーの場合は、ルート URL の最後に でアクセスする必要があると思います。

于 2012-12-07T11:12:48.777 に答える