2017-06-03 41 views
2

我正在嘗試構建一個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

回答

1

如果您正在將mod_ssl模塊加載到Apache中,您可能無法使其工作。問題是Anaconda已經發布了自己的SSL庫,並且它們與操作系統SSL庫不兼容。

發生什麼事是Apache在加載mod_ssl模塊時拉入操作系統SSL庫。然後在你的Python web應用程序中,Anaconda不能使用它自己的,而是繼承由Apache mod_ssl庫引入的SSL庫。由於它們不兼容,Python中ssl模塊的設置失敗,因此顯示爲未加載。

唯一的解決方案是使用mod_wsgi-express並將它放在Apache後面,而Apache僅充當代理。這樣,Apache和Python Web應用程序之間就有了適當的分離。

+0

對不起,遲到的迴應。我嘗試了你提到的設置,並按預期工作。感謝您的見解。 Anaconda會繼承Apache SSL庫對我來說是新的。根據我的理解,Apache .conf文件或WSGIPythonPath指令中的指令python-path將覆蓋此行爲。 如果你允許,我還有一個問題關於你的答案:使用mod_wsgi-express比Flask自身運行有什麼好處? –

+0

由於mod_wsgi正在將Python嵌入Apache運行的相同進程中,因此會出現SSL庫的繼承。它並不是獨特的,所以沒有進程執行二進制文件,其中共享庫的繼承將被停止。 –

+0

至於使用mod_wsgi-express而不是Flask,我只能假設你正在討論Flask內置的WSGI服務器。 Flask的內置WSGI服務器僅用於開發,它不是一個生產級的Web服務器。使用Flask內置服務器進行開發或者非常簡單的工作很好,但不適合面向公衆的網站。 –