Развертывание приложения Bottle.py с Apache mod_wsgi в Ubuntu 16.04

Мне трудно развернуть приложение Бутылка. Я пытался использовать некоторые из предложенных ответов в прошлых вопросах, но я не могу заставить это работать. Я получаю 500 Внутренняя ошибка сервера

Это моя установка.

  • Ubuntu 16.04
  • апаш
  • libapache2-мод-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'

Я сделал это на чистой установке Ubuntu под бутылкой пользователя с привилегиями sudo. Вероятно, это уже десятый раз, когда я перестраивался, используя различные предложения от других вопросов от пользователей, у которых были подобные проблемы. Я пытался избежать публикации вопроса, который выглядел бы как дубликат. Любая помощь будет принята с благодарностью.

1 ответ

Решение

Прежде чем импортировать модуль приложения в файл app.wsgi, попробуйте:

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

Более чистым способом может быть использование параметров home или python-path для записи WSGIDaemonProcess в конфигурации Apache.

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__)))
Другие вопросы по тегам