2017-06-03 4 views
2

Ich versuche eine REST-API zu erstellen, die den Status von Instanzen im AWS EC2-Dienst überwacht. Wenn ich meine auf Apache gehostete Flask-Anwendung verwende, erhalte ich eine Rückverfolgung, die besagt, dass der Name 'ssl' nicht definiert ist.Flask + Apache (mod_wsgi) + boto3: Name 'ssl' ist nicht definiert

Um zu sehen, was mit meiner Anwendung los war, habe ich es auf einem eigenständigen Server (nur Flask) im Debug-Modus ausgeführt. Zu meiner Überraschung lief die Bewerbung erfolgreich ab.

My Flask Anwendung (flask_endpoint.py)

import json 
import boto3 
from flask import Flask 
from flask_cors import CORS 
from flask import make_response 

WEBAPP = Flask(__name__) 
CORS(WEBAPP) 


@WEBAPP.route('/test_boto', methods=['GET']) 
def handle_teste_boto(): 

    results = [] 
    ec2_res = boto3.resource('ec2') 
    instances = ec2_res.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}]) 

    for inst in instances: 
     inst_dic = {'private_ip': inst.private_ip_address, 
        'instance_type': inst.instance_type, 
        'state': inst.state['Name'] 
        } 
     results.append(inst_dic) 

    response_code = 200 
    response = make_response(json.dumps(results, ensure_ascii=False), response_code) 
    response.headers['Content-Type'] = 'application/json' 
    return response 

if __name__ == '__main__': 
    WEBAPP.run(port=50000, host='0.0.0.0', debug=True) 

erzeugt Ausgabe, wenn ohne Apache läuft

[ 
    { 
     "state": "running", 
     "private_ip": "172.31.56.153", 
     "instance_type": "t2.micro" 
    } 
] 

Apache mit abgeschnittenen Rückverfolgungs log

[Sat Jun 03 11:59:20.217312 2017] [wsgi:info] [pid 3094] [remote 192.168.0.115:50017] mod_wsgi (pid=3094, process='flask_test', application=''): Loading WSGI script '/var/www/siase/middleend/rest/cmd_server_wsgi.py'. 
[Sat Jun 03 11:59:20.827295 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] mod_wsgi (pid=3094): Exception occurred processing WSGI script '/var/www/siase/middleend/rest/cmd_server_wsgi.py'. 
[Sat Jun 03 11:59:20.829915 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] Traceback (most recent call last): 
[Sat Jun 03 11:59:20.830014 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/flask/app.py", line 2000, in __call__ 
[Sat Jun 03 11:59:20.830017 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  return self.wsgi_app(environ, start_response) 
[Sat Jun 03 11:59:20.830022 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/flask/app.py", line 1991, in wsgi_app 
[Sat Jun 03 11:59:20.830024 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  response = self.make_response(self.handle_exception(e)) 
[Sat Jun 03 11:59:20.830027 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/flask_cors/extension.py", line 161, in wrapped_function 
[Sat Jun 03 11:59:20.830029 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  return cors_after_request(app.make_response(f(*args, **kwargs))) 

** (several lines) ** 

[Sat Jun 03 11:59:20.830194 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  body=body, headers=headers) 
[Sat Jun 03 11:59:20.830197 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/botocore/vendored/requests/packages/urllib3/connectionpool.py", line 341, in _make_request 
[Sat Jun 03 11:59:20.830199 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  self._validate_conn(conn) 
[Sat Jun 03 11:59:20.830202 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/botocore/vendored/requests/packages/urllib3/connectionpool.py", line 761, in _validate_conn 
[Sat Jun 03 11:59:20.830204 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  conn.connect() 
[Sat Jun 03 11:59:20.830207 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/botocore/vendored/requests/packages/urllib3/connection.py", line 206, in connect 
[Sat Jun 03 11:59:20.830209 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  resolved_cert_reqs = resolve_cert_reqs(self.cert_reqs) 
[Sat Jun 03 11:59:20.830213 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] File "/var/www/anaconda3/lib/python3.5/site-packages/botocore/vendored/requests/packages/urllib3/util/ssl_.py", line 157, in resolve_cert_reqs 
[Sat Jun 03 11:59:20.830216 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017]  res = getattr(ssl, candidate, None) 
[Sat Jun 03 11:59:20.830230 2017] [wsgi:error] [pid 3094] [remote 192.168.0.115:50017] NameError: name 'ssl' is not defined 

Dies ist meine wsgi Datei

Das ist mein Conf Datei

<VirtualHost *:8080> 

    ServerName localhost 
    ServerAdmin [email protected] 

    DocumentRoot /var/www/siase/middleend 

    WSGIDaemonProcess flask_test user=studioapp group=www-data lang='en_US.UTF-8' locale='en_US.UTF-8' threads=20 processes=4 python-path=/var/www/anaconda3/lib/python3.5 
    WSGIScriptAlias//var/www/siase/middleend/rest/cmd_server_wsgi.py 
    <Directory /var/www/siase/middleend> 
     WSGIProcessGroup flask_test 
     WSGIApplicationGroup %{GLOBAL} 
     Require all granted 
     Options -Indexes 
    </Directory> 

    <Directory "/"> 
     Options -Indexes 
    </Directory> 

    LogLevel info 
    ErrorLog ${APACHE_LOG_DIR}/flask_test-error.log 
    CustomLog ${APACHE_LOG_DIR}/flask_test-access.log combined 

</VirtualHost> 

folgt hier einige Details, die Umwelt, die ich zur Zeit mit:

Apache/2.4.7 (Ubuntu)
OpenSSL 1.0.1f
mod_wsgi 4.5.5
Python 3.5.2 (Anaconda3 - 4.2.0)
Flask 0.11.1
Boto3 1.4.4

Antwort

1

Wenn Sie das Modul mod_ssl in Apache laden, werden Sie wahrscheinlich nicht in der Lage sein, es zu funktionieren. Das Problem ist, dass Anaconda seine eigenen SSL-Bibliotheken ausgeliefert hat und sie nicht mit den SSL-Bibliotheken des Betriebssystems kompatibel sind.

Was passiert, ist, dass Apache beim Laden des mod_ssl-Moduls in das Betriebssystem SSL-Bibliotheken einzieht. Dann kann Anaconda in Ihrer Python-Webanwendung keine eigenen verwenden und erbt stattdessen die SSL-Bibliotheken, die von der Apache-Bibliothek mod_ssl eingezogen werden. Da sie nicht kompatibel sind, schlägt das Setup des SSL-Moduls in Python fehl und erscheint nicht geladen.

Die einzige Lösung wäre, mod_wsgi-express zu verwenden und hinter Apache zu sitzen, wobei Apache nur als Proxy fungiert. Auf diese Weise gibt es eine richtige Trennung zwischen Apache und Ihrer Python-Webanwendung.

+0

Entschuldigung für eine späte Antwort. Ich habe das Setup, das du erwähnt hast, ausprobiert und es hat wie erwartet funktioniert. Danke für deine Einsichten. Es ist neu für mich, dass Anaconda Apache SSL-Bibliothek erben würde. Aus meinem Verständnis würden die Anweisungen python-path in der Apache-.conf-Datei oder der WSGIPythonPath-Direktive dieses Verhalten überschreiben. Wenn Sie mir erlauben, habe ich noch eine Frage zu Ihrer Antwort: Was sind die Vorteile der Verwendung von mod_wsgi-express über Flask läuft von selbst? –

+0

Die Vererbung der SSL-Bibliothek tritt auf, weil mod_wsgi Python in denselben Prozess einbaut wie Apache. Es ist nicht unterscheidbar, daher gibt es keine Prozess-Exec-Binärdatei, bei der die Vererbung einer gemeinsam genutzten Bibliothek gestoppt würde. –

+0

Was die Verwendung von mod_wsgi-express und nicht von Flask anbelangt, kann ich nur davon ausgehen, dass Sie über den integrierten WSGI-Server von Flask sprechen. Der eingebaute WSGI-Server von Flask ist nur für die Entwicklung gedacht, er ist kein Web-Server in Produktionsqualität.So gut, Flask eingebauten Server für die Entwicklung oder wirklich einfache Sachen zu verwenden, aber nicht für öffentlich zugängliche Websites. –