使用 cx_Oracle 和 mod_wsgi 在 AWS Ubuntu (EC2) 上托管 Python Flask 应用程序
Hosting a Python Flask App on AWS Ubuntu (EC2) using cx_Oracle and mod_wsgi
我正在尝试托管一个连接到 Oracle 数据库的简单 Python Flask 网站。
到目前为止,我已经成功地在 Ubuntu 主机上安装了 cx_Oracle(以及 Oracle 客户端和 SDK),并成功地使用 Apache2 和 mod_wsgi 托管了 Flask 应用程序。
我按照本指南安装了 cx_Oracle:https://blogs.oracle.com/opal/entry/configuring_python_cx_oracle_and
我按照本教程主持:
http://blog.garethdwyer.co.za/2013/07/getting-simple-flask-app-running-on.html
当 运行 从实例本地运行时,整个应用程序运行完美。我已经使用 x-forwarding 和 firefox 对此进行了测试。
但是,当我尝试公开托管时,运行通过 wsgi,它可以加载 flask 应用程序,但在被要求访问 Oracle 数据库时失败。我无法获取错误日志,因为 Apache 日志仅显示我通过 Python 手动打印的内容。 (如果有人对此有解决办法,请告诉)。
我花了太多时间尝试托管 - 这应该比现在简单得多。解决方案?
我的目录结构
->/var/www/SACK
->app.py
->app.wsgi
->satic/
->templates/
->/etc/apache2/sites-available
->sitename.com.config
->/opt/oracle/instant_client_12_1
->... Oracle client stuff. SDK included.
app.py
app = Flask(__name__)
...
def connectToDB():
ip = '...'
port = ...
SID = '...'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
global connection
connection = cx_Oracle.connect('...', '...', dsn_tns)
print "connection successful"
global cursor
cursor = connection.cursor()
def closeConnection():
cursor.close()
connection.close()
print "connection closed"
def main():
connectToDB()
app.run()
closeConnection()
if __name__ == '__main__':
main()
根据这些指南,我的应用程序是如何为 wsgi 设置的:
app.wsgi
import sys
sys.path.insert(0, '/var/www/SACK')
from app import app as application
站点配置:
sitename.com.config
<VirtualHost *:80>
WSGIDaemonProcess SACK
WSGIScriptAlias / /var/www/SACK/app.wsgi
<Directory /var/www/SACK>
WSGIProcessGroup SACK
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
LogLevel info
ErrorLog "/var/log/apache2/error.log"
CustomLog "/var/log/apache2/access.log" combine
</VirtualHost>
我的 wsgi 配置为仅 运行 实际的 Flask 应用程序本身,也就是 app.run()
中包含的代码,因此 connectToDB()
函数实际上从未 运行s当 wsgi 创建应用程序时。
我没有在我的 wsgi 配置中解决这个问题,而是使用 flask 的 @app.before_request() and @app.teardown_request 注释来创建和销毁数据库连接。
代码改动:
@app.before_request()
def connectToDB():
....
@app.teardown_request()
def closeConnection(e):
....
我正在尝试托管一个连接到 Oracle 数据库的简单 Python Flask 网站。
到目前为止,我已经成功地在 Ubuntu 主机上安装了 cx_Oracle(以及 Oracle 客户端和 SDK),并成功地使用 Apache2 和 mod_wsgi 托管了 Flask 应用程序。
我按照本指南安装了 cx_Oracle:https://blogs.oracle.com/opal/entry/configuring_python_cx_oracle_and 我按照本教程主持: http://blog.garethdwyer.co.za/2013/07/getting-simple-flask-app-running-on.html
当 运行 从实例本地运行时,整个应用程序运行完美。我已经使用 x-forwarding 和 firefox 对此进行了测试。
但是,当我尝试公开托管时,运行通过 wsgi,它可以加载 flask 应用程序,但在被要求访问 Oracle 数据库时失败。我无法获取错误日志,因为 Apache 日志仅显示我通过 Python 手动打印的内容。 (如果有人对此有解决办法,请告诉)。
我花了太多时间尝试托管 - 这应该比现在简单得多。解决方案?
我的目录结构
->/var/www/SACK
->app.py
->app.wsgi
->satic/
->templates/
->/etc/apache2/sites-available
->sitename.com.config
->/opt/oracle/instant_client_12_1
->... Oracle client stuff. SDK included.
app.py
app = Flask(__name__)
...
def connectToDB():
ip = '...'
port = ...
SID = '...'
dsn_tns = cx_Oracle.makedsn(ip, port, SID)
global connection
connection = cx_Oracle.connect('...', '...', dsn_tns)
print "connection successful"
global cursor
cursor = connection.cursor()
def closeConnection():
cursor.close()
connection.close()
print "connection closed"
def main():
connectToDB()
app.run()
closeConnection()
if __name__ == '__main__':
main()
根据这些指南,我的应用程序是如何为 wsgi 设置的:
app.wsgi
import sys
sys.path.insert(0, '/var/www/SACK')
from app import app as application
站点配置:
sitename.com.config
<VirtualHost *:80>
WSGIDaemonProcess SACK
WSGIScriptAlias / /var/www/SACK/app.wsgi
<Directory /var/www/SACK>
WSGIProcessGroup SACK
WSGIApplicationGroup %{GLOBAL}
Order deny,allow
Allow from all
</Directory>
LogLevel info
ErrorLog "/var/log/apache2/error.log"
CustomLog "/var/log/apache2/access.log" combine
</VirtualHost>
我的 wsgi 配置为仅 运行 实际的 Flask 应用程序本身,也就是 app.run()
中包含的代码,因此 connectToDB()
函数实际上从未 运行s当 wsgi 创建应用程序时。
我没有在我的 wsgi 配置中解决这个问题,而是使用 flask 的 @app.before_request() and @app.teardown_request 注释来创建和销毁数据库连接。
代码改动:
@app.before_request()
def connectToDB():
....
@app.teardown_request()
def closeConnection(e):
....