Portál AbcLinuxu, 7. května 2025 07:21
rád bych napsal webovou aplikaci s Django frameworkem, nicméně jsme narazil na problém při nasazení s apachem. Bohužel, podle standardních how-to se mi to nedaří spustit.
Django server (python3 manage.py runserver
) funguje v pořádku.
V /var/log/httpd/error_log
je při každém načtení webu:
End of script output before headers: wsgi.py
Struktura aplikace je vygenerovaná z: python3-django-admin startproject abc
, takže:
/ abc/ manage.py abc/ __init__.py wsgi.py settings.py urls.py test/ __init__.py models.py views.py ...
Do wsgi.py
jsem akorát přidal na první řádek shebang + chmod +x wsgi.py
, jinak dostávám
Exec format error: exec of '/home/michal/www/abc/abc/wsgi.py' failedA ještě jsem přidal
sys.path.append('/home/michal/www/abc') sys.path.append('/home/michal/www')čímž jsem se zbavil ImportError-u.
/etc/httpd/conf/httpd.conf
vypadá takto:
<VirtualHost *:80> ServerName abc.localhost DocumentRoot /home/michal/www/abc WSGIScriptAlias / /home/michal/www/abc/abc/wsgi.py <Directory /home/michal/www/abc> Require all granted Options Indexes FollowSymLinks </Directory> <Directory /home/michal/www/abc/abc> Require all granted Options Indexes FollowSymLinks ExecCGI <Files wsgi.py> Require all granted </Files> </Directory> LogLevel info </VirtualHost>A samotný
wsgi.py
vypadá takto:
#!/usr/bin/python3 import os import sys sys.path.append('/home/michal/www/abc') sys.path.append('/home/michal/www') from django.core.wsgi import get_wsgi_application os.environ.setdefault("DJANGO_SETTINGS_MODULE", "abc.settings") application = get_wsgi_application()
Možná je hloupost volba ExecCGI, když to má být WSGI (moc tomu pořád nerozumím), pak se zobrazí testovací stránka, že httpd funguje, a v logu je:
Options ExecCGI is off in this directory: /home/michal/www/abc/abc/wsgi.py
mod_wsgi jsem instaloval jako: dnf install python3-mod_wsgi
$ httpd -M | grep wsgi wsgi_module (shared)
Nevíte, co by mohlo být špatně? Případně, kde ještě hledat závady?
Řešení dotazu:
wsgi.py
nepotřebuje žádné úpravy, kromě přidání cest k aplikaci.
Žádné ExecCGI
v httpd.conf
nemá být.
V httpd.conf
mi chybělo:
<IfModule mime_module> ... AddHandler wsgi-script .py ... </IfModule> ... WSGISocketPrefix run/wsgiA ještě
/run/httpd
musí mít nastavenou skupinu, pod kterou běží httpd, tedy:
drwx--x--- 3 root <skupina> 120 Aug 22 15:23 /run/httpdkde skupina bude nejčastěji
www-data
nebo apache
Poté lze postupovat podle django dokumentace.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.