【问题标题】:Deploying a Bottle.py app with Apache mod_wsgi on Ubuntu 16.04在 Ubuntu 16.04 上使用 Apache mod_wsgi 部署 Bottle.py 应用程序
【发布时间】:2016-08-22 11:08:43
【问题描述】:

我很难部署 Bottle 应用。我已经尝试在过去的问题中使用一些建议的答案,但我似乎无法让它发挥作用。我最终得到 500 内部服务器错误

这是我的设置。

  • Ubuntu 16.04
  • 阿帕奇
  • libapache2-mod-wsgi-py3
  • Python 3.5

我的 .wsgi 和 app.py 文件位于:

/var/www/bottle_app/

  • app.wsgi
  • app.py

app.wsgi如下

import os
# Change working directory so relative paths (and template lookup) work again
os.chdir(os.path.dirname(__file__))

import bottle
# ... build or import your bottle application here ...
import app
application = bottle.default_app()

app.py如下

from bottle import route
@route('/')
def hello():
    return 'Hello world'

Apache .conf 文件:

<VirtualHost *:80>
ServerName example.com 

WSGIDaemonProcess bottle_app user=bottle group=www-data processes=1 threads=5
WSGIScriptAlias / /var/www/bottle_app/app.wsgi

<Directory /var/www/bottle_app>
    WSGIProcessGroup bottle_app
    WSGIApplicationGroup %{GLOBAL}
    Require all granted
</Directory>

当我运行 python3 app.py 时,没有返回任何内容(我假设这是预期的) 当我运行 python3 app.wsgi 时,我得到:

Traceback (most recent call last):
File "app.wsgi", line 3, in <module>
  os.chdir(os.path.dirname(__file__))
FileNotFoundError: [Errno 2] No such file or directory: ''

我的 Apache 错误日志显示以下错误。

Target WSGI script '/var/www/bottle_app/app.wsgi' cannot be loaded as Python module
Exception occurred processing WSGI script '/var/www/bottle_app/app.wsgi
Traceback (most recent call last):
File "/var/www/bottle_app/app.wsgi", line 7, in <module>
   import app
ImportError: No module named 'app'

我在具有 sudo 权限的用户瓶下进行了干净的 Ubuntu 安装。这可能是我第 10 次使用来自有类似问题的用户的其他问题的不同建议进行重建。我试图避免发布一个看似重复的问题。任何帮助将不胜感激。

【问题讨论】:

    标签: python apache mod-wsgi bottle


    【解决方案1】:

    在 app.wsgi 文件中导入应用模块之前,请尝试:

    import sys
    sys.path.insert(0, '/var/www/bottle_app')
    

    更简洁的方法可能是使用 Apache 配置中的 WSGIDaemonProcess 条目的 homepython-path 参数。

    WSGIDaemonProcess bottle_app user=bottle group=www-data processes=1 threads=5 python-path=/var/www/bottle_app
    

    __file__ 不是绝对的,所以如果您需要获取它的位置来实现这种类型的目的(像 Apache 这样的控制进程可能会用路径做一些有趣的事情),请尝试:

    os.chdir(os.path.dirname(os.path.abspath(__file__)))
    

    【讨论】:

    • 感谢您的回复。我对我的 app.wsgi 进行了您建议的更改,现在当我运行 python3 app.wsgi 时没有返回任何内容,我假设现在一切都很好。我的 Apache 日志仍然显示相同的错误。
    • 另一篇文章明确建议在路径中包含您的应用目录:sys.path.insert(0, '/var/www/bottle_app')link。不过,我猜整体配置还有其他问题。不需要这么复杂。
    • import sys sys.path.insert(0, '/path/to/application/app/folder') 是这样的吗?
    • 伙计,我无法表达我的感激之情。我将您的建议添加到 app.wsgi 并且它有效。您能否更改您的答案以包含 sys.path.insert 以便我接受?
    • 一般来说,将当前工作目录作为 Web 应用程序中的特定位置是一种不好的做法。您应该始终致力于为您需要的任何东西构建绝对路径。如果它在代码库中,您可以通过锚定 __file__ 来做到这一点,如图所示,但不要使用它来更改工作目录,使用它来为资产创建绝对路径等。
    猜你喜欢
    • 2018-03-30
    • 2017-08-11
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多