【问题标题】:Running Flask with mod_Wsgi through virtualenv通过 virtualenv 使用 mod_Wsgi 运行 Flask
【发布时间】:2017-12-10 07:44:40
【问题描述】:

在工作服务器(Apache 2.2.3)上,我正在尝试使用 Flask 激活我的第一个 Hello World。我在任何典型的推荐位置都找不到错误日志。

我在/home/nrDee/public_html/rrfexpire做了一个virtualenv

这是我的 rrfexpire.wsgi 脚本:

activate_this = 
'/home/nrDee/public_html/rrfexpire/venv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

from rrfexpire import app as application

这已添加到 Apache httpd.conf:

WSGIDaemonProcess rrfexipre user=apache group=apache threads=5
WSGIScriptAlias /blog /home/nrDee/public_html/rrfexpire/rrfexpire.wsgi

<Directory /home/nrDee/public_html/rrfexpire>
WSGIProcessGroup rrfexpire
WSGIApplicationGroup %{GLOBAL}
Order allow,deny
Allow from all
</Directory>

这是我的 Hello World 测试 (rrfexpire.py):

from flask import Flask, render_template

app = Flask(__name__)

@app.route("/")
def hello_world():
  return "Hello, World!"

print hello_world()

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

当我在http://departmentServer.company.com/rrfexpire/ 使用 Chrome 浏览器时,我希望能看到结果,但我什么也没得到。整个 nrDee 目录设置为 777 权限,以消除阻止此运行的权限。并且我尝试确认 Python 版本(2.7.13)和 mod_wsgi 与命令的兼容性

#ldd venv/lib/python2.7/site-packages/mod_wsgi/server/mod_wsgi-py27.so

该结果中的一行显示“libpython2.7.so.1.0 => /usr/local/bin/anaconda/lib/libpython2.7.so.1.0”,我将其解释为 mod_wsgi 已为 Python2 正确编译.7

我是新来的,并且一直在大量使用 Flask 和 mod_wsgi 文档并且感觉卡住了。
您能否就下一步检查的内容提供指导?
谢谢! -nrDee

【问题讨论】:

  • 您的应用程序安装在/blog 而不是/rrfexpire,因此需要更改您的URL 或WSGIScriptAlias
  • 谢谢!我将WSGIScriptAlias 更新为/rrfexpire,重新启动Apache,并收到500 Internal Server Error
  • 你敏锐的眼光让我发现了另一个错别字。我将WSGIDaemonProcess更新为/rrfexpire,重新启动httpd服务,仍然出现500 Internal Server Error
  • 为什么要更新WSGIDaemonProcess?这不需要匹配挂载点。它确实需要匹配用于WSGIProcessGroup 的内容。如果您收到 500 个错误,原因将在 Apache 错误日志中,因此请确保您正在查看并添加错误的详细信息(如果不明显)。
  • 抱歉@GrahamDumpleton 下面的格式很糟糕

标签: python flask server virtualenv mod-wsgi


【解决方案1】:

我有一个可行的解决方案,但它并不完美,因为除非重新启动 httpd 服务,否则我的 URL 不会更新。但至少我现在可以看到我的 HelloWorld 了!

我当前的 rrfexpire.wsgi 脚本让我感到困惑,因为它在 py2.7 virtualenv 中使用 Python3 语法:

activate_this = 
'/home/nrDee/public_html/rrfexpire/venv/bin/activate_this.py'
with open(activate_this) as file_:
    exec(file_.read(), dict(__file__=activate_this))

import sys
sys.path.insert(0, '/home/nrDee/public_html/rrfexpire')
from rrfexpire import app as application

这是我的 httpd.conf

<VirtualHost *>
  ServerName company.server.com:80

  WSGIDaemonProcess rrfexpire user=apache group=apache
  WSGIScriptAlias /rrfexpire /home/nrDee/public_html/rrfexpire/rrfexpire.wsgi

<Directory /home/nrDee/public_html/rrfexpire>
WSGIProcessGroup rrfexpire
WSGIApplicationGroup %{GLOBAL}
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

【讨论】:

【解决方案2】:

不使用“晦涩脚本”的最简单解决方案是简单地在 .wsgi 文件开头引用 venv 中的 python:

#!/path/to/your/venv/bin/python

简单。合乎逻辑。没有魔法。真希望我早点想到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2017-07-15
    • 2018-08-21
    • 2015-02-11
    • 2017-11-12
    相关资源
    最近更新 更多