2012-12-07 6 views
2

Impossible de lancer un serveur bottle.py à l'aide d'une instance EC2 Ubuntu Linux 12.04 avec une adresse IP publique. Le programme (hw.py) provient du tutoriel de la bouteille.EC2, connexion bottle.py

from bottle import route, run 

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

run(host='xxx.xxx.xxx.xxx', port=80) 

Exécuter en tant:

> python hw.py 
or 
> sudo python hw.py 

génère l'erreur:

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 

L'adresse IP publique EC2 est rattaché à aucun autre processus. Le port 80 n'est pas connecté à un autre processus.

> 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 

Changer: exécuter (host = 'xxx.xxx.xxx.xxx', port = 8080)

L'erreur est socket.error: [Errno 99] peut assigner l'adresse demandée.

Modification à: run (host = '0.0.0.0', port = 8080)

... qui se lie au serveur pour toutes les adresses IP/interfaces. En tapant l'adresse IP publique EC2 dans le navigateur avec et sans: 8080 affiche "Cette page n'est pas disponible".

Idéalement, la première option à savoir. run (host = 'xxx.xxx.xxx.xxx', port = 80) devrait fonctionner car c'est ainsi que d'autres serveurs web sont lancés. Quelqu'un at-il des idées pour résoudre celui-ci?

EDIT: ajouté dernière série de lignes de 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

Avez-vous essayé d'exécuter Python en tant que root? – Blender

+0

> sudo python hw.py donne l'erreur Impossible d'attribuer l'adresse demandée. –

+0

Exécuter avec 'strace -f', coller les bits pertinents avant l'erreur. – soulseekah

Répondre

5

essayer. Je l'utilise pour tester le réseau.

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 
     ) 

Exécuter ce fichier (hw.py) au fond de votre serveur:

$ cd path/to/your/file 
$ nohup python server.py & 

Je pense que vous pouvez visiter maintenant.


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".

cas de cette erreur, je pense que vous devez visiter avec /hello à la fin de l'URL de votre racine.

+0

Essayé mais n'a pas fonctionné. Tout d'abord, la connexion à EC2 en utilisant l'adresse IP publique (xxx.xxx.xxx.xxx) fonctionne parce que je suis en train de tester avec un autre serveur web Python et connecté. Mais, bottle.py ne fonctionne pas. Également essayé avec xxx.xxx.xxx.xxx:8080/hello et cela ne fonctionne pas non plus. J'ai essayé à la fois Chrome et FF - pas de chance! –

+1

@dbv Vous pouvez essayer '$ ps aux | grep hw.py' pour vérifier s'il est en cours d'exécution ou non. Et b.t.w, êtes-vous sûr que vous avez ouvert le port pour votre service? – Kjuly

+0

ouvert 0.0.0.0:8080 port via EC2 et il fonctionne maintenant. Merci! btw, savez-vous pourquoi bottle.py ne lie pas avec l'adresse IP publique EC2 au port 80 dans hw.py ie. xxx.xxx.xxx.xxx:80? aussi, cette limitation s'applique-t-elle lorsque le serveur de flacons standard est remplacé par say, un serveur multithread? –

Questions connexes