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.
Ensuite, je l'écrirai autant que possible.
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.
wsgi semble être lu comme withgie. C'est un module Apache qui vous permet d'exécuter Python.
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.
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
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
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
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/
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.
[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.
[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
[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.
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/
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.
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.
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.
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