Question

J'essaie d'exécuter une application sans repos dans Apache en utilisant mod_wsgi.Cela fonctionne bien avec le serveur de développement.J'ai lu tout ce que je peux trouver et aucune des réponses que j'ai vues ne semble fonctionner pour moi.L'application gère correctement les requêtes non liées à la base de données, mais affiche l'erreur suivante lorsque j'essaie d'accéder à une URL nécessitant un accès à la base de données :

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

Je me suis réduit à un démarrage rapide et agité avec mon config et mes modèles flask-sqlalchemy importés (from flask import models).Voici mon code 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()

Je suppose que mod_wsgi n'a pas de problème à trouver le config fichier qui contient les détails d'accès à la base de données puisque je n'obtiens pas d'erreur lors de la lecture de la configuration et je n'obtiens pas non plus d'erreur sur from app import models.

Mes recherches jusqu'à présent m'ont amené à croire que cela a quelque chose à voir avec la connexion à la base de données SQL-Alchemy existant dans une portée ou un contexte incorrect et peut-être compliquée par le gestionnaire d'API flask-restless.Je n'arrive pas à comprendre cela.

Était-ce utile?

La solution

Votre code sous Apache/mod_wsgi s'exécutera en tant qu'utilisateur Apache spécial.Cet utilisateur ne dispose probablement pas des privilèges requis pour se connecter à la base de données.

Même s'il est indiqué « localhost » et que vous pensez que cela peut impliquer une connexion socket normale, certains clients de base de données verront « localhost » et essaieront automatiquement d'utiliser le socket UNIX pour la base de données.Il se peut qu'il n'ait pas accès à cette connexion socket UNIX.

Alternativement, lors d'une connexion socket UNIX, il essaie de valider si l'utilisateur Apache a accès, mais si la base de données n'a pas été configurée pour autoriser l'accès de l'utilisateur Apache, elle peut alors échouer.

Pensez à utiliser le mode démon de mod_wsgi et configurez le mode démon pour qu'il s'exécute en tant qu'utilisateur différent de l'utilisateur Apache et que vous savez qu'il a accès à la base de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top