Pergunta

Estou tentando executar um aplicativo sem descanso no Apache usando mod_wsgi.Isso funciona bem com o servidor de desenvolvimento.Li tudo o que pude encontrar e nenhuma das respostas que vi parece funcionar para mim.O aplicativo lida corretamente com solicitações que não são de banco de dados, mas apresenta o seguinte erro quando tento acessar um URL que requer acesso ao banco de dados:

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

Eu me reduzi basicamente ao início rápido inquieto do frasco com meu config e meus modelos flask-sqlalchemy importados (from flask import models).Aqui está meu código python:

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()

Presumo que mod_wsgi não esteja tendo problemas para encontrar o config arquivo que contém os detalhes de acesso ao banco de dados, pois não recebo erro ao ler a configuração e também não recebo erro ao from app import models.

Minha pesquisa até agora me levou a acreditar que isso tem algo a ver com a conexão sql-alchemy db existente no escopo ou contexto errado e possivelmente complicada pelo gerenciador de API inquieto do flask.Não consigo entender isso.

Foi útil?

Solução

Seu código em Apache/mod_wsgi será executado como um usuário especial do Apache.Esse usuário provavelmente não possui os privilégios necessários para se conectar ao banco de dados.

Mesmo que diga 'localhost' e você pense que isso pode implicar uma conexão de soquete normal, alguns clientes de banco de dados verão 'localhost' e tentarão usar automaticamente o soquete UNIX para o banco de dados.Pode não ter acesso a essa conexão de soquete UNIX.

Alternativamente, ao passar por uma conexão de soquete UNIX, ele está tentando validar se o usuário Apache tem acesso, mas se o banco de dados não tiver sido configurado para permitir o acesso do usuário Apache, ele poderá falhar.

Considere usar o modo daemon do mod_wsgi e configure o modo daemon para ser executado como um usuário diferente do usuário Apache e que você sabe que tem acesso ao banco de dados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top