[PYTHON] Django Getting Started: intégration 3_Apache

table des matières

Django Start: 1_Environment Construction Django Start: 2_Create Project Django start: intégration 3_Apache Django start: intégration 4_MySQL

La dernière fois, j'ai confirmé le démarrage de Django sur le serveur de développement simple depuis le navigateur. Étant donné qu'il sera publié plus tard, il est nécessaire de coopérer avec un serveur Web tel qu'apache.

Ici, c'est sous la forme d'Apache + mod_wsgi + Django. C'est la méthode officiellement recommandée.

Comment utiliser Django avec Apache et mod_wsgi?

Cependant, j'ai cherché sur le Web de différentes manières, mais cela n'a pas fonctionné et c'était un endroit difficile. Je suis sûr que d'autres personnes seront accro à la lecture de cet article quelque part.

Si cela ne fonctionne pas, je vous recommande de lire la formule une fois. C'est difficile, mais l'information principale est la plus fiable.

officiel mod_wsgi

Ensuite, je l'écrirai autant que possible.

environnement

Un petit commentaire

Qu'est-ce qu'Apache

C'est un serveur Web. Probablement le plus utilisé. Par défaut, il n'a pas la capacité d'interpréter Python, vous devrez donc le personnaliser séparément.

Qu'est-ce que mod_wsgi

wsgi semble être lu comme withgie. C'est un module Apache qui vous permet d'exécuter Python.

Installation d'Apache

Si Apache n'est pas installé sur le serveur, installez-le d'abord.

yum install httpd httpd-devel
systemctl start httpd
systemctl enable httpd

Au cas où, saisissez l'adresse IP dans le navigateur et vérifiez si Apache est en cours d'exécution.

installation de mod_wsgi

Il est nécessaire de s'associer à Python au moment de l'installation. Si vous utilisez pyenv, vous devez le dire.

Si vous l'installez facilement par inadvertance avec yum, il sera lié au Python intégré, et vous finirez par devoir recommencer, alors soyez prudent.

Téléchargez et décompressez la source.

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

Erreur d'installation de mod_wsgi

Vous pouvez obtenir l'erreur suivante.

/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

Dans ce cas, vous devez recompiler Python.

CONFIGURE_OPTS="--enable-shared" CFLAGS="-fPIC" pyenv install X.X.X

Puis réinstallez-le. Réinitialisez les paramètres une fois avec make clean.

make clean
./configure CFLAGS=-fPIC --enable-shared
make
make install

Paramètres Apache

Ajouté à / etc / httpd / conf / httpd.conf,

La description entière ressemble à ceci. Veuillez remplacer selon le cas. C'est le cas lorsqu'un projet nommé xxx est créé sous / home / django /.

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>

Je vais expliquer chaque élément.

*Mise en garde Dans la série Apache 2.4 Require all granted Cependant, dans les versions antérieures, écrivez:

Order allow,deny
Allow from all

Satisfaire les dépendances mod_wsgi.so

En l'état, mod_wsgi.so a besoin de python, mais je ne le trouve pas. Vérifiez les détails avec la commande 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)

Je ne trouve pas libpython3.6m.so.1.0. Recherchez dans votre répertoire Python et collez le lien symbolique.

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/

Confirmation de démarrage Apache => Résolution des erreurs

Une fois que vous avez atteint ce point, redémarrez Apache une fois. systemctl restart httpd

Une erreur se produira probablement, alors accédez au navigateur tout en consultant le journal des erreurs. tail -f /var/log/httpd/error_log

La cause est décrite pour chaque erreur.

Les paramètres WSGIPythonHome sont incorrects

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

Vérifiez l'emplacement de WSGIPythonHome. Assurez-vous que le Python que vous souhaitez utiliser provient de pyenv, de votre système et si la version correspond.

Pas assez de modules

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

Vous devez importer MySQLdb. Installons-le. Notez que le nom n'est pas le même. pip install mysqlclient

Python ne peut pas être spécifié

[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

Si la partie Python / xxx est différente de la version de Python que vous souhaitez utiliser, mod_wsgi et le Python que vous souhaitez utiliser ne sont pas liés. Réinstallons mod_wsgi une fois.

La dépendance de mod_wsgi.so n'est pas satisfaisante

12 mars 15:42:31 ip-172-31-32-130 systemd[1]: Starting The Apache HTTP Server...
12 mars 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 a besoin de python, mais je ne le trouve pas. Vérifiez les détails avec la commande 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)

Je ne trouve pas libpython3.6m.so.1.0. Recherchez dans votre répertoire Python et collez le lien symbolique.

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/

La version d'OpenSSL est-elle ancienne?

Si vous accédez à la page Django mais obtenez l'erreur suivante:

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.

Il semble que l'affichage soit différent de la version confirmée par ʻopenssl version`.

J'ai fait beaucoup de recherches, mais avez-vous utilisé l'openssl d'Anaconda dans la même situation? [À propos de la prise en charge d'Anaconda / Miniconda par pyenv](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 Résolu avec.

Publication de fichiers statiques

Not Found: /static/admin/css/base.css, referer: http://xxx.xxx.xxx.xxx/

Si vous utilisez un modèle fourni par Django sur votre serveur de développement Lors de la publication sur un serveur Web, vous devez le configurer à nouveau. Définissons ceci même s'il n'y a pas d'erreur.

Vous pouvez copier le fichier Django ou mettre un lien symbolique sous le répertoire de votre projet, mais Django a sa propre commande, alors utilisez-la.

Décidez où placer les fichiers statiques dans settings.py dans le répertoire du projet sous la forme suivante. STATIC_ROOT = '/home/django/xxx/static/' Il copiera le fichier statique dans le répertoire spécifié par la commande suivante. python manage.py collectstatic


La résolution des erreurs est un point fatigué, mais elle ne peut être publiée que si cela est surmonté. Le simple fait de m'en souvenir me rendait douloureux.


désinstallation de mod_wsgi

Si vous souhaitez modifier la version de Python à utiliser, vous devez désinstaller mod_wsgi une fois et suivre à nouveau les étapes ci-dessus. Pour le désinstaller, supprimez simplement mod_wsgi.so.

référence

vhosts Finalement, vous obtiendrez un domaine et utiliserez les hôtes virtuels d'Apache. Notez uniquement les paramètres qui ont fonctionné pour le moment.

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>

Lisez selon le cas en fonction de l'environnement.

Recommended Posts

Django Getting Started: intégration 3_Apache
Django Getting Started: intégration 4_MySQL
Premiers pas avec apache2
Premiers pas avec Django 1
Premiers pas avec Django 2
Django Getting Started: 2_ Créer un projet
Django Premiers pas: 1_Construction de l'environnement
Premiers pas avec Python Django (1)
Premiers pas avec Python Django (4)
Premiers pas avec Python Django (3)
Introduction à Python Django (6)
Premiers pas avec Django avec PyCharm
Premiers pas avec Python Django (5)
Premiers pas sur Docker Apache Hadoop
Grails pour commencer
Django Getting Started Part 2 avec eclipse Plugin (PyDev)
Django Getting Started Partie 3 sur Python3 & MySQL Connector
Django 1.11 a démarré avec Python3.6
Premiers pas avec Android!
1.1 Premiers pas avec Python
Premiers pas avec Python
Introduction à l'optimisation
Premiers pas avec Numpy
Premiers pas avec Spark
Premiers pas avec Python
Premiers pas avec Pydantic
Premiers pas avec Jython
Matériel à lire lors de la mise en route d'Apache Beam
Traduire Premiers pas avec TensorFlow
Introduction aux fonctions Python
Introduction à Tkinter 2: Button
Lancez-vous avec Django! ~ Tutoriel ⑤ ~
[Linux] [Configuration initiale] Introduction
Premiers pas avec PKI avec Golang ―― 4
Python3 + Django ~ Mac ~ avec Apache
Lancez-vous avec Django! ~ Tutoriel ④ ~
Prise en main et utilisation d'exemples de vues génériques basées sur des classes dans Django
Lancez-vous avec Django! ~ Tutoriel ⑥ ~
Django - Déploiement de l'hôte virtuel mod_wsgi Apache
Premiers pas avec Heroku-Viewing Hello World en Python Django avec Raspberry PI 3
Premiers pas avec Python responder v2
Introduction à Git (1) Stockage d'historique
Premiers pas avec Sphinx. Générer docstring avec Sphinx
Premiers pas avec les applications Web Python
Premiers pas avec Python pour les classes PHPer
Premiers pas avec Sparse Matrix avec scipy.sparse
Premiers pas avec Julia pour Pythonista
Premiers pas avec Python Bases de Python
Comment démarrer avec Django
Premiers pas avec Cisco Spark REST-API
Commençant par USD sur Windows
Premiers pas avec les algorithmes génétiques Python
Premiers pas avec Python 3.8 sous Windows
Premiers pas avec Python pour les fonctions PHPer
Premiers pas avec CPU Steal Time