我正在嘗試構建一個REST API來監視AWS EC2服務上實例的狀態。當我使用我在Apache上託管的Flask應用程序時,我得到一個回溯,通知名稱'ssl'未定義爲。Flask + Apache(mod_wsgi)+ boto3:未定義名稱'ssl'
要查看我的應用程序出了什麼問題,我使用調試模式將其運行在獨立服務器(僅限Flask)上。令我驚訝的是,應用程序運行成功。
我的瓶的應用程序(flask_endpoint.py)沒有阿帕奇
運行[
{
"state": "running",
"private_ip": "172.31.56.153",
"instance_type": "t2.micro"
}
]
生產
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)
輸出時,Apache日誌被截斷的回溯
[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
這是我WSGI文件
# -*- coding: utf-8 -*-
import sys
APP_MODULE_PATH = '/var/www/siase/middleend'
if APP_MODULE_PATH not in sys.path:
sys.path.insert(0, APP_MODULE_PATH)
from rest.cmd_server import WEBAPP as application
application.debug = True
這是我的.conf文件
<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>
這裏如下,我目前使用環境的一些細節:
的Apache/2.4.7(Ubuntu的)
的OpenSSL 1.0.1f
mod_wsgi 4.5.5
Python 3.5.2(Anaconda3-4.2.0)
燒瓶0.11.1
Boto3 1.4.4
對不起,遲到的迴應。我嘗試了你提到的設置,並按預期工作。感謝您的見解。 Anaconda會繼承Apache SSL庫對我來說是新的。根據我的理解,Apache .conf文件或WSGIPythonPath指令中的指令python-path將覆蓋此行爲。 如果你允許,我還有一個問題關於你的答案:使用mod_wsgi-express比Flask自身運行有什麼好處? –
由於mod_wsgi正在將Python嵌入Apache運行的相同進程中,因此會出現SSL庫的繼承。它並不是獨特的,所以沒有進程執行二進制文件,其中共享庫的繼承將被停止。 –
至於使用mod_wsgi-express而不是Flask,我只能假設你正在討論Flask內置的WSGI服務器。 Flask的內置WSGI服務器僅用於開發,它不是一個生產級的Web服務器。使用Flask內置服務器進行開發或者非常簡單的工作很好,但不適合面向公衆的網站。 –