[PYTHON] Erste Schritte mit Django: 3_Apache-Integration

Inhaltsverzeichnis

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.

mod_wsgi offiziell

Dann werde ich es so viel wie möglich aufschreiben.

Umgebung

Ein kleiner Kommentar

Was ist Apache?

Es ist ein Webserver. Wahrscheinlich die am häufigsten verwendete. Standardmäßig kann Python nicht interpretiert werden, daher müssen Sie es separat anpassen.

Was ist mod_wsgi?

wsgi scheint als withgie gelesen zu werden. Es ist ein Apache-Modul, mit dem Sie Python ausführen können.

Apache-Installation

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.

mod_wsgi Installation

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

Installationsfehler von mod_wsgi

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

Apache-Einstellungen

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

Erfüllen Sie die Abhängigkeiten von mod_wsgi.so

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/

Apache-Startbestätigung => Fehlerbehebung

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.

Die WSGIPythonHome-Einstellungen sind falsch

[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.

Nicht genug Module

[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

Python kann nicht angegeben werden

[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.

Die Abhängigkeit von mod_wsgi.so ist nicht zufriedenstellend

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/

Ist die Version von OpenSSL alt?

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.

Statische Dateien veröffentlichen

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.


mod_wsgi deinstallieren

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.

Referenz

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

Erste Schritte mit Django: 3_Apache-Integration
Erste Schritte mit Django: 4_MySQL-Integration
Erste Schritte mit apache2
Erste Schritte mit Django 1
Erste Schritte mit Django 2
Django Erste Schritte: 2_ Erstellen eines Projekts
Django Erste Schritte: 1_Umgebungsgebäude
Erste Schritte mit Python Django (1)
Erste Schritte mit Python Django (4)
Erste Schritte mit Python Django (3)
Einführung in Python Django (6)
Erste Schritte mit Django mit PyCharm
Erste Schritte mit Python Django (5)
Erste Schritte mit Docker Apache Hadoop
Grale fangen an
Django Erste Schritte Teil 2 mit dem Eclipse Plugin (PyDev)
Erste Schritte mit Django Teil 3 über Python3 und MySQL Connector
Django 1.11 wurde mit Python3.6 gestartet
Erste Schritte mit Android!
1.1 Erste Schritte mit Python
Erste Schritte mit Python
Einführung in die Optimierung
Erste Schritte mit Numpy
Erste Schritte mit Spark
Erste Schritte mit Python
Erste Schritte mit Pydantic
Erste Schritte mit Jython
Materialien zum Lesen, wenn Sie mit Apache Beam beginnen
Übersetzen Erste Schritte mit TensorFlow
Einführung in Python-Funktionen
Einführung in Tkinter 2: Button
Fangen Sie mit Django an! ~ Tutorial ⑤ ~
[Linux] [Grundeinstellung] Einführung
Erste Schritte mit PKI mit Golang ―― 4
Python3 + Django ~ Mac ~ mit Apache
Fangen Sie mit Django an! ~ Tutorial ④ ~
Erste Schritte und Verwendung von auf Klassenklassen basierenden generischen Ansichten in Django
Fangen Sie mit Django an! ~ Tutorial ⑥ ~
Django - Bereitstellung des virtuellen Hosts Apache mod_wsgi
Erste Schritte mit Heroku-Viewing Hello World in Python Django mit Raspberry PI 3
Erste Schritte mit Python Responder v2
Einführung in Git (1) History-Speicher
Erste Schritte mit Sphinx. Generieren Sie Docstring mit Sphinx
Erste Schritte mit Python-Webanwendungen
Erste Schritte mit Python für PHPer-Klassen
Erste Schritte mit Sparse Matrix mit scipy.sparse
Erste Schritte mit Julia für Pythonista
Erste Schritte mit Python Grundlagen von Python
Wie fange ich mit Django an?
Erste Schritte mit der Cisco Spark REST-API
Beginnend mit USD unter Windows
Erste Schritte mit genetischen Python-Algorithmen
Erste Schritte mit Python 3.8 unter Windows
Erste Schritte mit Python für PHPer-Funktionen
Erste Schritte mit der CPU-Diebstahlzeit