5 votes

Django + Apache + mod_wsgi permission denied

J'ai terminé le tutoriel sur le site de Django concernant l'utilisation de mod_wsgi ( aquí ), et après avoir remplacé mes chemins d'accès comme il se doit, j'obtiens un gros "Permission denied" lorsque j'essaie d'accéder à /. Voici ce que j'ai ajouté à httpd.conf ( mod_wsgi est activé plus tôt dans le fichier conf) :

# Django configuration

WSGIScriptAlias / /usr/local/django/billing/apache/django.wsgi

<Directory /usr/local/django/billing/apache/django.wsgi>
Order allow,deny
Allow from all
</Directory>

AliasMatch ^/([^/]*\.css) /usr/local/wsgi/static/styles/$1

Alias /media/ /usr/local/django/billing/media/
Alias /static/ /usr/local/django/billing/static/

<Directory /usr/local/django/billing/static>
Order deny,allow
Allow from all
</Directory>

<Directory /usr/local/django/billing/media>
Order deny,allow
Allow from all
</Directory>

Éditer #1 :

J'ai parcouru les diapositives plusieurs fois, depuis le début : toujours rien. Même après avoir ouvert le chemin vers le script, chmodé tous les répertoires concernés pour qu'ils soient lisibles, et chmodé le .wsgi script, j'obtiens toujours un refus de permission. Si je change le chemin du répertoire de /usr/local/django/billing/apache/django.wsgi d'avoir le django.wsgi tronqué, le serveur renvoie une erreur de configuration, bien que ce soit la façon dont il est configuré dans les diapositives.

19voto

pedwards Points 393

Même configuration, même environnement... mais tout fonctionnait sauf un simple appel à Popen() dans une de mes routines django/python...

"Permission refusée"

Il s'est avéré que SELINUX (enforcing mode) bloquait apache.

Vous pouvez faire en sorte que SELINUX soit satisfait de votre application en exécutant les commandes suivantes :

# semanage fcontext -a -t httpd_sys_rw_content_t '/path/to/your/app(/.*)?'
# restorecon -R -v /path/to/your/app

6voto

dm03514 Points 20748

6voto

Ryu_hayabusa Points 352

J'ai eu le même problème, parfois cela arrive si l'application WSGI est située en dehors de tout répertoire déjà configuré pour être accessible à Apache, en particulier lorsqu'elle se trouve dans votre répertoire personnel, il est bon de spécifier la directive user=username.

/etc/apahe2/sites-avaliable/myvhost [section]

WSGIDaemonProcess localhost python-path=/home/hemanth/ecm:/home/env/lib/python2.7/site-packages  user=hemanth
WSGIProcessGroup localhost

/etc/apahe2/sites-avaliable/myvhost [complet]

    <VirtualHost *:80>
            ServerAdmin xy@gmail.om
            ServerName localhost
            ServerAlias localhost

        DocumentRoot /home/hemanth/ecm

        <Directory /home/hemanth/ecm>
            Order allow,deny
            Allow from all
            </Directory>

           WSGIScriptAlias / /home/hemanth/ecm/index.wsgi       
           WSGIDaemonProcess localhost python-path=/home/hemanth/ecm:/home/env/lib/python2.7/site-packages user=hemanth     
           WSGIProcessGroup localhost

           Alias /static/ /home/hemanth/ecm/static/

           Alias /media/ /home/hemanth/ecm/media/   
           <Directory /home/hemanth/ecm/media/>
           Order allow,deny
           Allow from all
           </Directory>

           <Location "/static/">
            Options -Indexes
            </Location>     

           ErrorLog /home/hemanth/ecm/error.log 
</VirtualHost>

index.wsgi

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('/home/hemanth/env/local/lib/python2.7/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('/home/hemanth/ecm')
sys.path.append('/home/hemanth/ecm/ecm')

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ecm.settings")

# Activate your virtual env
activate_env="/home/hemanth/env/bin/activate_this.py"
execfile(activate_env, dict(__file__=activate_env))

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

1voto

tstoev Points 1

J'ai réussi à le faire fonctionner après avoir installé flask (dans venv) et configuré le WSGISocketPrefix. Je déploie sur centos6.8 avec python3.6 dans venv.

Le dossier du projet auquel il est fait référence ici est l'endroit où le code réel de django est stocké. Le dossier public du projet auquel il est fait référence ici est accessible par Apache et contient des simlinks vers des ressources pertinentes ainsi que les fichiers .htaccess et .wsgi nécessaires à l'exécution.

Le préfixe de socket peut varier en fonction du système d'exploitation et de la configuration d'Apache. Les permissions peuvent varier en fonction de la version d'Apache, si vous avez des problèmes, vous pouvez les modifier :

Order allow,deny
 Allow from all

à

Require all granted

voici ma configuration mod_wsgi (httpd.conf)

LoadModule wsgi_module **path to venv**/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

WSGIPythonHome **path to venv**
WSGIDaemonProcess flask user=**user name** group=**user group**
WSGIProcessGroup flask
WSGISocketPrefix /var/run/wsgi 

<Directory **path-to-project-dir**>
     Options ExecCGI MultiViews Indexes
     MultiViewsMatch Handlers

     AddHandler wsgi-script .py
     AddHandler wsgi-script .wsgi

     DirectoryIndex index.html index.php index.py app.wsgi

     Order allow,deny
     Allow from all
</Directory>

voici l'hôte virtuel (httpd.conf)

<VirtualHost *:80>
    DocumentRoot **project public folder**
    ServerName **www.project.com**
    ServerAlias **project.com**

    WSGIScriptAlias / **project public folder**/site.wsgi

    Alias /media/ **project public folder**/media/
    <Directory **project public folder**/media>
        Order allow,deny
        Allow from all
    </Directory>

    Alias /static/ **project public folder**/static/
    <Directory **project public folder**/static>
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

Voici le fichier site.wsgi

import os
import sys
import site

# Add the site-packages of the chosen virtualenv to work with
site.addsitedir('**path to venv**/lib/python3.6/site-packages')

# Add the app's directory to the PYTHONPATH
sys.path.append('**path to project folder containing manage.py**')
sys.path.append('**path to project folder containing settings.py**')

os.environ['DJANGO_SETTINGS_MODULE'] = '**project name**.settings'

# Activate your virtual env
#activate_venv.py is an empty python file which will activate
#the virtual environment when executed. Create it manually
activate_env=os.path.expanduser("**path to venv**/bin/activate_venv.py")
exec(open(activate_env).read(), dict(__file__=activate_env))

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

J'ai dû déplacer les deux lignes suivantes du fichier wsgi.py vers " init .py" dans le même dossier pour résoudre l'erreur "Applications not ready"

from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

Voici un aperçu des paquets présents dans l'environnement virtuel

Click==7.0
Django==2.2.1
django-debug-toolbar==1.11
django-redis==4.10.0
django-tastypie==0.14.2
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.10.1
MarkupSafe==1.1.1
mod-wsgi==4.6.5
mysqlclient==1.4.2.post1
Pillow==6.0.0
pip==19.1.1
python-dateutil==2.8.0
python-mimeparse==1.6.0
pytz==2019.1
redis==3.2.1
setuptools==41.0.1
simplejson==3.16.0
six==1.12.0
sqlparse==0.3.0
Werkzeug==0.15.4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X