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
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? –
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. –
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. –