Django Start: 1_Environment Construction Django Start: 2_Create Project Django-Start: 3_Apache-Integration Django-Start: 4_MySQL-Integration
Letztes Mal habe ich den Start von Django auf dem einfachen Entwicklungsserver über den Browser bestätigt. In Anbetracht der Tatsache, dass es später veröffentlicht wird, ist es notwendig, mit einem Webserver wie Apache zusammenzuarbeiten.
Hier ist es in Form von Apache + mod_wsgi + Django. Dies ist die offiziell empfohlene Methode.
Wie benutzt man Django mit Apache und mod_wsgi?
Ich habe auf verschiedene Arten im Internet gesucht, aber es hat nicht geklappt und es war ein schwieriger Ort. Ich bin sicher, andere Leute werden süchtig danach sein, diesen Artikel irgendwo zu lesen.
Wenn es nicht funktioniert, empfehle ich Ihnen, die Formel einmal zu lesen. Es ist schwierig, aber die primären Informationen sind die zuverlässigsten.
Dann werde ich es so viel wie möglich aufschreiben.
Es ist ein Webserver. Wahrscheinlich die am häufigsten verwendete. Standardmäßig kann Python nicht interpretiert werden, daher müssen Sie es separat anpassen.
wsgi scheint als withgie gelesen zu werden. Es ist ein Apache-Modul, mit dem Sie Python ausführen können.
Wenn Apache nicht auf dem Server installiert ist, installieren Sie es zuerst.
yum install httpd httpd-devel
systemctl start httpd
systemctl enable httpd
Geben Sie für alle Fälle die IP-Adresse in den Browser ein und überprüfen Sie, ob Apache ausgeführt wird.
Es ist erforderlich, sich zum Zeitpunkt der Installation mit Python zu verbinden. Wenn Sie pyenv verwenden, müssen Sie es sagen.
Wenn Sie es versehentlich einfach mit yum installieren, wird es mit dem integrierten Python verknüpft, und Sie müssen am Ende von vorne beginnen. Seien Sie also vorsichtig.
Laden Sie die Quelle herunter und entpacken Sie sie.
wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.14.tar.gz
tar -zxvf 4.5.14.tar.gz
cd mod_wsgi-4.5.14/
./configure --with-python=/usr/local/bin/pyenv/versions/anaconda3-4.3.0/bin/python
make
make install
Möglicherweise wird der folgende Fehler angezeigt.
/bin/ld: /usr/local/bin/pyenv/versions/3.6.0/lib/libpython3.6m.a(abstract.o): relocation R_X86_64_32S against `_Py_NotImplementedStruct' can not be used when making a shared object; recompile with -fPIC
In diesem Fall müssen Sie Python neu kompilieren.
CONFIGURE_OPTS="--enable-shared" CFLAGS="-fPIC" pyenv install X.X.X
Dann installieren Sie es erneut. Setzen Sie die Einstellungen einmal mit "sauber machen" zurück.
make clean
./configure CFLAGS=-fPIC --enable-shared
make
make install
Hinzugefügt zu / etc / httpd / conf / httpd.conf
,
Die ganze Beschreibung sieht so aus. Bitte ersetzen Sie gegebenenfalls. Dies ist der Fall, wenn unter / home / django / ein Projekt namens xxx erstellt wird.
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /home/django/xxx/xxx/wsgi.py
WSGIPythonHome /usr/local/bin/pyenv/versions/anaconda3-4.3.0/
WSGIPythonPath /home/django/xxx
<Directory /home/django/xxx/xxx>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /home/django/xxx/static/
<Directory /home/django/xxx/static>
Require all granted
</Directory>
Ich werde jeden Punkt erklären.
*Hinweis
In der Apache 2.4-Serie
Require all granted
In früheren Versionen schreiben Sie jedoch:
Order allow,deny
Allow from all
Mod_wsgi.so braucht Python, aber ich kann es nicht finden. Überprüfen Sie die Details mit dem Befehl ldd.
ldd /etc/httpd/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fff8c9fe000)
libpython3.6m.so.1.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4c9e548000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4c9e344000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f4c9e141000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4c9df38000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4c9dc36000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4c9d875000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4c9e9a8000)
Ich kann libpython3.6m.so.1.0 nicht finden. Suchen Sie in Ihrem Python-Verzeichnis und fügen Sie den symbolischen Link ein.
ls /usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/ | grep python
libpython3.6m.so
libpython3.6m.so.1.0
libpython3.so
python3.6
ln -s /usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/libpython3.6m.so.1.0 /lib64/
Sobald Sie diesen Punkt erreicht haben, starten Sie Apache einmal neu.
systemctl restart httpd
Möglicherweise tritt ein Fehler auf. Greifen Sie daher auf den Browser zu, während Sie das Fehlerprotokoll anzeigen.
tail -f /var/log/httpd/error_log
Die Ursache wird für jeden Fehler beschrieben.
[Thu Mar 09 16:32:51.315916 2017] [core:notice] [pid 9301] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
Current thread 0x00007ff5dd6d8840 (most recent call first):
Could not find platform independent libraries <prefix>
Could not find platform dependent libraries <exec_prefix>
Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
Überprüfen Sie den Speicherort von WSGIPythonHome. Überprüfen Sie, ob der Python, den Sie verwenden möchten, von pyenv oder vom System stammt und ob die Version korrekt ist.
[Thu Mar 09 15:53:52.797174 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] mod_wsgi (pid=9535): Target WSGI script '/home/django/plagiarism/plagiarism/wsgi.py' cannot be loaded as Python module.
[Thu Mar 09 15:53:52.797231 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] mod_wsgi (pid=9535): Exception occurred processing WSGI script '/home/django/plagiarism/plagiarism/wsgi.py'.
[Thu Mar 09 15:53:52.800163 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] Traceback (most recent call last):
[Thu Mar 09 15:53:52.800196 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] File "/usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/django/db/backends/mysql/base.py", line 25, in <module>
[Thu Mar 09 15:53:52.800199 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] import MySQLdb as Database
[Thu Mar 09 15:53:52.800213 2017] [wsgi:error] [pid 9535] [client 192.168.10.1:65448] ModuleNotFoundError: No module named 'MySQLdb'
Sie sollten MySQLdb importieren.
Lass es uns installieren. Beachten Sie, dass der Name nicht identisch ist.
pip install mysqlclient
[Thu Mar 09 16:46:51.598855 2017] [mpm_prefork:notice] [pid 9476] AH00163: Apache/2.4.6 (CentOS) mod_wsgi/4.5.14 Python/xxx configured -- resuming normal operations
Wenn sich der Python / xxx-Teil von der Version von Python unterscheidet, die Sie verwenden möchten, sind mod_wsgi und der Python, den Sie verwenden möchten, nicht verknüpft. Lassen Sie uns mod_wsgi einmal neu installieren.
12. März 15:42:31 ip-172-31-32-130 systemd[1]: Starting The Apache HTTP Server...
12. März 15:42:31 ip-172-31-32-130 httpd[22078]: httpd: Syntax error on line 353 of /etc/httpd/conf/httpd.conf: Syntax error on line ...: Cannot load modules/mod_wsgi.so into server: libpython3.6m.so.1.0: cannot open shared object file: No such file or directory
mod_wsgi.so braucht Python, aber ich kann es nicht finden. Überprüfen Sie die Details mit dem Befehl ldd.
ldd /etc/httpd/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fff8c9fe000)
libpython3.6m.so.1.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4c9e548000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4c9e344000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f4c9e141000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4c9df38000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4c9dc36000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4c9d875000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4c9e9a8000)
Ich kann libpython3.6m.so.1.0 nicht finden. Suchen Sie in Ihrem Python-Verzeichnis und fügen Sie den symbolischen Link ein.
ls /usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/ | grep python
libpython3.6m.so
libpython3.6m.so.1.0
libpython3.so
python3.6
ln -s /usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/libpython3.6m.so.1.0 /lib64/
Wenn Sie auf die Django-Seite zugreifen, aber den folgenden Fehler erhalten:
You are linking against OpenSSL 1.0.0, which is no longer support by the OpenSSL project. You need to upgrade to a newer version of OpenSSL.
Es scheint, dass sich die Anzeige von der durch "openssl version" bestätigten Version unterscheidet.
Ich habe viel recherchiert, aber haben Sie Anacondas openssl in der gleichen Situation verwendet? [Über die Unterstützung von pyenv für Anaconda / Miniconda](http://qiita.com/yyuu@github/items/7de957838437eaecdc8a#pyenv-%E3%81%AB%E3%81%8A%E3%81%91%E3%82 % 8B-Anacondaminiconda-% E5% AF% BE% E5% BF% 9C% E3% 81% AE% E5% 95% 8F% E9% A1% 8C% E7% 82% B9)
pip install -U cryptography
Gelöst mit.
Not Found: /static/admin/css/base.css, referer: http://xxx.xxx.xxx.xxx/
Wenn Sie eine von Django bereitgestellte Vorlage auf Ihrem Entwicklungsserver verwenden Wenn Sie auf einem Webserver veröffentlichen, müssen Sie ihn erneut festlegen. Stellen wir dies auch dann ein, wenn kein Fehler vorliegt.
Sie können die Django-Datei kopieren oder einen symbolischen Link in Ihr Projektverzeichnis einfügen, aber Django verfügt über einen eigenen Befehl. Verwenden Sie diesen Befehl.
Entscheiden Sie in der folgenden Form, wo die statischen Dateien in settings.py im Projektverzeichnis abgelegt werden sollen.
STATIC_ROOT = '/home/django/xxx/static/'
Die statische Datei wird in das mit dem folgenden Befehl angegebene Verzeichnis kopiert.
python manage.py collectstatic
Die Fehlerbehebung ist ein Punkt müde, kann aber nur veröffentlicht werden, wenn dies überwunden ist. Nur daran zu denken, machte mich schmerzhaft.
Wenn Sie die zu verwendende Python-Version ändern möchten, müssen Sie mod_wsgi einmal deinstallieren und die obigen Schritte erneut ausführen. Um es zu deinstallieren, löschen Sie einfach mod_wsgi.so.
vhosts Schließlich erhalten Sie eine Domain und verwenden die vhosts von Apache. Notieren Sie sich nur die Einstellungen, die vorerst funktionierten.
httpd.conf
LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome /usr/local/bin/pyenv/versions/anaconda3-4.3.0/
vhosts.conf
<VirtualHost *:80>
ServerName MY_DOMAIN
WSGIDaemonProcess PROCESS_GROUP user=apache group=apache python-path=/path/to/project
WSGIProcessGroup PROCESS_GROUP
WSGIScriptAlias / /path/to/project/app/wsgi.py process-group=PROCESS_GROUP
<Directory /path/to/project/app/>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /path/to/project/static/
<Directory /path/to/project/static/>
Require all granted
</Directory>
CustomLog /path/to/project/log/access_log common
ErrorLog /path/to/project/log/error_log
</VirtualHost>
Je nach Umgebung entsprechend lesen.
Recommended Posts