【问题标题】:FlaskApp returning http 500 in apache with mod_wsgiFlaskApp 使用 mod_wsgi 在 apache 中返回 http 500
【发布时间】:2014-06-18 21:54:25
【问题描述】:

我正在尝试通过 apache 和 mod_wsgi 托管我的 python 3.4 烧瓶应用程序。通过烧瓶自己的服务器运行应用程序工作正常。该应用是在虚拟环境 pyvenv-3.4 中制作的。

但是,当尝试在浏览器中连接到 apache 服务器时,它会引发 500 http 错误。附加配置和日志。我认为这与使用 pyvenv 而不是 virtualenv(来自 pip)有关。 Flask 文档告诉我使用这一行来激活虚拟环境

activate_this = '/path/to/env/bin/activate_this.py'

但是,由于文件不存在,这会产生 IOError。我尝试将其指向“激活”文件,然后激活.csh、激活.fish,但没有成功。所有文件都会在 deactivate 行产生 SyntaxError。

如何使用我的 virtualenv 通过 Apache 运行这个应用程序?

flaskapp.wsgi

#!/usr/bin/python
activate_this = '/var/www/FlaskApp/FlaskApp/bin/activate'
execfile(activate_this, dict(__file__=activate_this))
import sys
import logging

logging.basicConfig(stream=sys.stderr)
sys.path.insert(0,"/var/www/FlaskApp/")

from FlaskApp import app as application
application.secret_key = 'some secret key'

Apache 虚拟主机

<VirtualHost *:80>
            ServerName example.org # my server name
            ServerAlias gallifrey 192.168.0.84
            ServerAdmin admin@example.org # my admin
            WSGIScriptAlias /flask /var/www/FlaskApp/flaskapp.wsgi
            <Directory /var/www/FlaskApp/FlaskApp/>
                    Order allow,deny
                    Allow from all
            </Directory>
            Alias /static /var/www/FlaskApp/FlaskApp/static
            <Directory /var/www/FlaskApp/FlaskApp/static/>
                    Order allow,deny
                    Allow from all
            </Directory>
            ErrorLog ${APACHE_LOG_DIR}/error.log
            LogLevel warn
            CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

层次结构

/var/www/FlaskApp
  flaskapp.wsgi
  FlaskApp/
    bin/
      activate
      activate.csh
      activate.fish
      easy_install, easy_install-3.4
      pip, pip3, pip3.4
      python, python3, python3.4
    include/
    lib/
    scripts/
    static/
    templates/
    app.py
    __init__.py

尝试打开网页时出现 http 500 错误:

Apache 错误日志

[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81] mod_wsgi (pid=31629): Target WSGI script '/var/www/FlaskApp/flaskapp.wsgi' cannot be loaded as Python module.
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81] mod_wsgi (pid=31629): Exception occurred processing WSGI script '/var/www/FlaskApp/flaskapp.wsgi'.
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81] Traceback (most recent call last):
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81]   File "/var/www/FlaskApp/flaskapp.wsgi", line 3, in <module>
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81]     execfile(activate_this, dict(__file__=activate_this))
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81]   File "/var/www/FlaskApp/FlaskApp/bin/activate", line 4
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81]     deactivate () {
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81]                   ^
[Fri May 02 10:22:58 2014] [error] [client 192.168.0.81] SyntaxError: invalid syntax

【问题讨论】:

  • 你为什么要在 Python WSGI 文件中使用 virtualenv activate shell 脚本?那是行不通的。请参阅code.google.com/p/modwsgi/wiki/VirtualEnvironments
  • @Sklirg 您能否使用工作配置更新答案。我正在尝试复制此设置,但它不起作用,仍然出现 500 个错误。

标签: python apache flask virtualenv mod-wsgi


【解决方案1】:

您可以遵循VirtualEnvironments instructions,也可以复制virtualenvactivate_this.py 脚本的作用:

import sys
import os

old_os_path = os.environ['PATH']
os.environ['PATH'] = os.path.dirname(os.path.abspath(__file__)) + os.pathsep + old_os_path
base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if sys.platform == 'win32':
    site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
    site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

你可以把它变成一个更通用的函数:

import sys
import os

def activate_venv(path):
    if sys.platform == 'win32':
        bin_dir = os.path.join(path, 'Scripts')
        site_packages = os.path.join(base, 'Lib', 'site-packages')
    else:
        bin_dir = os.path.join(path, 'bin')
        site_packages = os.path.join(BASE, 'lib', 'python%s' % sys.version[:3], 'site-packages')
    os.environ['PATH'] = bin_dir + os.pathsep + os.environ['PATH']
    prev_sys_path = list(sys.path)
    import site
    site.addsitedir(site_packages)
    sys.prefix, sys.real_prefix = path, sys.prefix

    # Move the added items to the front of the path:
    new_sys_path = []
    for item in list(sys.path):
        if item not in prev_sys_path:
            new_sys_path.append(item)
            sys.path.remove(item)
    sys.path[:0] = new_sys_path

将其放入默认 Python 模块搜索路径的模块中,导入 activate_venv 并传入 os.path.dirname(os.path.abspath(__file__)) 的结果:

from somemodule import activate_venv
import os.path
activate_venv(os.path.dirname(os.path.abspath(__file__)))

【讨论】:

    【解决方案2】:

    你试过了吗:

    WSGIPythonHome /var/www/FlaskApp
    

    只是让 mod_wsgi 处理设置它还是你?

    【讨论】:

      【解决方案3】:

      我尝试在 /etc/httpd/conf/httpd.conf 的上方和外部添加它并且它有效。

      WSGIPythonPath /your_virtualenv/lib/python2.7/site-package
      

      【讨论】:

      • 当提到Python虚拟环境时,首选的方式是使用WSGIPythonHome。在引用与 Python 安装无关的独立目录时,您应该只使用 WSGIPythonPath
      • 我试过 WSGIPythonHome 但没用,我关注了这个网站:docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi
      • 您将WSGIPythonHome 设置为什么?它应该是您在 Python 解释器中为 sys.prefix 获得的值。如果您使用的是 mod_wsgi 守护程序模式,则无论如何您都应该使用 python-home 选项而不是 WSGIDaemonProcess 选项。
      • 这里是我的设置是 httpd.conf WSGIPythonHome /home/kuthoong248/dnsrecordschecking/flaskapp/env WSGIDaemonProcess flaskapp python-path=/home/kuthoong248/dnsrecordschecking/flaskapp/env/lib/python2.7/site-packages user=kuthoong248 group=kuthoong248 threads=5
      • 它引发错误:无法导入“站点”模块(我在文件 activate_this.py 中看到一行导入站点)。但是当我激活virtualenv并输入python,然后导入站点时,它导入正常。 @GrahamDumpleton
      【解决方案4】:

      当您使用 Python 虚拟环境以及 Django 或 Flask 等应用程序时,您必须确保 Apache 获取 WSGI 路径的位置。

      如果你有一个 Debian 发行版并使用包管理器来安装 Apache,你应该有这样的配置文件目录结构: /etc/apache2/.

      编辑“/etc/apache2/sites-available/AppName.conf”下的 VirtualHost 配置文件(例如 AppName.conf),并按照以下示例在 Python v3.5 下创建 Flask 应用:

      WSGIPythonPath /<PATH_OF_PYTHON_VIRTUAL_ENVIRONMENT>/lib/python3.5/site-packages
      <VirtualHost *:80>
              ServerName <HOST or IP_ADDRESS>
              ServerAdmin your-email@domain.com
              WSGIScriptAlias / /var/www/app_name/your_wsgi_app.wsgi
              WSGIPassAuthorization On
              <Directory /var/www/app_name/AppName/>
                      Order allow,deny
                      Allow from all
              </Directory>
              Alias /static /var/www/app_name/AppName/static
              <Directory /var/www/app_name/AppName/static/>
                      Order allow,deny
                      Allow from all
              </Directory>
      
              ErrorLog ${APACHE_LOG_DIR}/error.log
              # e.g. LogLevel debug
              LogLevel <info|warn|error|debug>
              CustomLog ${APACHE_LOG_DIR}/access.log combined
      </VirtualHost>
      

      【讨论】:

      猜你喜欢
      • 2014-07-27
      • 2013-02-12
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 2017-08-03
      • 1970-01-01
      相关资源
      最近更新 更多