flask-restless с mod_wsgi не может подключиться к серверу MySQL

Я пытаюсь запустить приложение без фляг в apache, используя mod_wsgi. Это отлично работает с сервером разработки. Я прочитал все, что смог найти, и ни один из ответов, которые я видел, не работает для меня. Приложение правильно обрабатывает запросы, не относящиеся к базе данных, но выдает следующую ошибку, когда я пытаюсь получить доступ к URL-адресу, для которого требуется доступ к базе данных:

OperationalError: (OperationalError) (2003, "Can't connect to MySQL server on 'localhost' ([Errno 13] Permission denied)") None None

Я урезал в основном быстрый старт без колбы с моими config и моими импортированными моделями sqlalchemy (from flask import models). Вот мой код на питоне:

import flask
import flask.ext.sqlalchemy
import flask.ext.restless
import sys

sys.path.insert(0, '/proper/path/to/application')

application = flask.Flask(__name__, static_url_path = "")
application.debug=True
application.config.from_object('config')

db = flask.ext.sqlalchemy.SQLAlchemy(application)

from app import models

# Create the Flask-Restless API manager.
manager = flask.ext.restless.APIManager(application, flask_sqlalchemy_db=db)

# Create API endpoints, which will be available at /api/<tablename> by
# default. Allowed HTTP methods can be specified as well.
manager.create_api(models.Asset, methods=['GET'])

# start the flask loop
if __name__ == '__main__':
        application.run()

Я предполагаю, что у mod_wsgi нет проблем с поиском файла config, который содержит сведения о доступе к базе данных, поскольку я не получаю сообщения об ошибке при чтении конфигурации, а также не получаю сообщения об ошибке from app import models.

Мои исследования до сих пор привели меня к мысли, что это как-то связано с соединением sql-alchemy db, существующим в неправильной области или контексте и, возможно, осложненным неугомонным API-менеджером flask. Кажется, я не могу уложить это в голове.


person user3689425    schedule 04.06.2014    source источник


Ответы (1)


Ваш код под Apache/mod_wsgi будет работать от имени специального пользователя Apache. Скорее всего, у этого пользователя нет прав, необходимых для подключения к базе данных.

Несмотря на то, что он говорит «localhost», и вы думаете, что это может подразумевать обычное подключение к сокету, некоторые клиенты базы данных увидят «localhost» и вместо этого автоматически попытаются использовать сокет UNIX для базы данных. У него может не быть доступа к этому сокетному соединению UNIX.

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

Рассмотрите возможность использования режима демона mod_wsgi и настройте режим демона для запуска от имени пользователя, отличного от пользователя Apache, который, как вы знаете, имеет доступ к базе данных.

person Graham Dumpleton    schedule 04.06.2014
comment
Сначала я считал, что это проблема с правами доступа к базе данных, но отклонил ее, потому что я регулярно обращаюсь к mysql с PHP на той же машине. Ваше объяснение заставило меня вернуться. Изменение пользователя для режима демона mod_wsgi не имело значения. Оказывается, selinux блокировал соединение. Решение setsebool httpd_can_network_connect_db 1. Большое спасибо за Вашу помощь. - person user3689425; 04.06.2014
comment
Я тоже собирался предложить это, но решил сначала попробовать самое простое объяснение. SELinux может вызывать всевозможные странные проблемы. SELinux упоминается в документах по адресу code.google.com/p/modwsgi/wiki/ - person Graham Dumpleton; 05.06.2014