Portál AbcLinuxu, 30. října 2025 00:34
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/wsgi
A 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.