2017-03-16 3 views
1

Ich versuche, einen einfachen Python-Webserver aus einem Tutorial in einer Fedora-Box mit Nginx einzurichten; Ich möchte, dass Nginx den Python-Server reversiert. Ich muss allerdings etwas falsch zu machen, sein, denn wenn ich den Server laufen und versuchen, die Seite durch Nginx zu laden, kehrt Nginx ein 502 an den Browser und druckt die folgenden in das Protokoll:Verbindung verweigert - Nginx zu Python BaseHTTPServer

2017/03/16 00:27:59 [Fehler] 10613 # 0: * 5284 connect() fehlgeschlagen (111: Verbindung abgelehnt) während der Verbindung zum Upstream, Client: 76.184.187.130, Server: tspi.io, Anfrage: "GET/Leaderboard/index.html HTTP/1.1" stromaufwärts "http://127.0.0.1:8063/leaderboard/index.html", host: "tspi.io"

Hier ist mein python-Server:

#!/bin/env python 
# with special thanks to the good folks at 
# https://fragments.turtlemeat.com/pythonwebserver.php 
# who generous taught me how to do all this tonight 

import cgi 

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 
from os import curdir, sep 

class BaseServer (BaseHTTPRequestHandler): 

    def do_GET (self): 
     try: 
      print ('Serving self.path=' + self.path) 
      if 'leaderboard' in self.path: 
       self.path = self.path[12:] 
       print ('self.path amended to:' + self.path) 

      if self.path == '/': 
       self.path = '/index.html' 

      if self.path.endswith ('.html'): 
       # maybe TODO is wrap this in a file IO exception handler 
       f_to_open = curdir + sep + self.path 
       f = open (f_to_open) 
       s = f.read() 
       f.close() 

       self.send_response (200) 
       self.send_header ('Content-type', 'text/html') 
       self.end_headers() 
       self.wfile.write (s) 

      return 

     except IOError: 
      self.send_error (404, 'File Not Found: ' + self.path) 

    def do_POST (self): 
     try: 
      cytpe, pdict = cgi.parse_header(self.headers.getheader ('content-type')) 
      if ctype == 'multipart/form-data': 
       query=cgi.parse_multipart (self.rfile, pdict) 
      self.send_response (301) 

      self.endheaders() 


     except: 
      pass # What *do* you do canonically for a failed POST? 

def main(): 
    try: 
     server = HTTPServer (('', 8096), BaseServer) 
     print ('Starting BaseServer.') 
     server.serve_forever() 
    except KeyboardInterrupt: 
     print ('Interrupt recieved; closing server socket') 
     server.socket.close() 

if __name__ == '__main__': 
    main() 

Und mein nginx.conf:

server { 
    listen 443 ssl; 
    server_name tspi.io; 
    keepalive_timeout 70; 

    ssl_certificate /etc/letsencrypt/live/tspi.io/fullchain.pem; 
    ssl_certificate_key /etc/letsencrypt/keys/0000_key-certbot.pem; 
    ssl_protocols TLSv1.2; 

    location/{ 
     root /data/www; 
    } 

    location ~ \.(gif|jpg|png)$ { 
     root /data/images; 
    } 

    location /leaderboard { 
     proxy_pass http://localhost:8063; 
    } 
} 

Ich versuche, die proxy_pass zu verwenden, keinen Verkehr zu übergeben, die in kommt zu dem Python-Server tspi.io/leaderboard auf, während der HTML-Basis ermöglicht Seiten, die unter/data/www liegen, werden normalerweise von Nginx bedient.

Wenn ich google, sehe ich Tonnen von Sachen über Reverse-Proxying PHP nicht PHP-FPM richtig konfiguriert, und da ich überhaupt nicht PHP verwende, scheint das unwahrscheinlich. Ich sehe auch Dinge über die Konfiguration von uwsgi, von denen ich keine Ahnung habe, ob das ein Problem ist oder nicht. Ich weiß nicht, ob BaseHTTPServer uswgi verwendet; als ich versuchte, uswgi nachzuschlagen, schien es wie eine ganz andere Reihe von Klassen und eine ganz andere Art, einen Python-Server zu schreiben.

Jede Hilfe würde sehr geschätzt werden!

Antwort

1

Die Portnummern sind in Ihrem Python-Code im Vergleich zu dem, was in Ihrer Nginx-Reverse-Proxy-Konfiguration angegeben ist.

Ich würde auch empfehlen, die Host-und Remote-Adresse Werte an Ihre interne Anwendung zu senden, falls die Notwendigkeit für sie entsteht.

proxy_set_header Host $host; 
proxy_set_header X-Real-IP $remote_addr; 
+0

Vielen Dank! Außerdem bemerkte ich, dass mein Python zusätzlich zu diesem Tippfehler das "Leaderboard" -Präfix im URL-Pfad nicht richtig gehandhabt hat. Aktualisierter Code im ursprünglichen Post. –

Verwandte Themen