Ошибка «Нет модуля с именем« encodings »» при развертывании приложения django на apache с mod_wsgi - PullRequest
3 голосов
/ 08 марта 2019

Список версий:

Centos 7 --- django 2.1.7 --- Apache 2.4.6 --- Python 3.6

Проверьте РЕДАКТИРОВАТЬ 5 для самого последнего журнала ошибок

следовал этому руководству здесь: https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-apache-and-mod_wsgi-on-centos-7

Я могу запустить sudo systemctl start httpd, и когда я захожу на URL, я получаю Внутреннюю ошибку сервера (журналы внизу)

Моя файловая структура

home
└── user
    └── projects
        └── myapp
            ├── app
            │   ├── <All Code for Webapp including static dir>  
            ├── env (virtualenv)
            ├── manage.py
            ├── new
            │   ├── settings.py
            │   ├── urls.py
            │   └── wsgi.py
            └── requirements.txt

И я надеюсь, что кто-то увидит ошибку в моем django.conf, расположенном ниже в моей папке httpd. И надеюсь, что это конечные точки, которые я ищу

РЕДАКТИРОВАТЬ: Этот файл находится здесь: /etc/httpd/conf.d/django.conf

django.conf

Alias /static /home/user/projects/myapp/app/static
<Directory /home/user/projects/myapp/app/static>
    Require all granted
</Directory>

<Directory /home/user/projects/myapp/new>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>

WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/myapp/env 
WSGIProcessGroup myapp
WSGIScriptAlias / /home/user/projects/myapp/new/wsgi.py

Я не уверен, что они указывают на все правильные места, и надеялся, что кто-то может дать мне второй взгляд.

И я не коснулся wsgi.py, и мне было интересно, не упускаю ли я там логику.

my wsgi.py

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'new.settings')

application = get_wsgi_application()

EDIT2: Я могу запустить сервер, но получаю 500 внутренних ошибок сервера, и когда я проверяю error_logs, я получаю это

Обновленные журналы

[Mon Mar 11 10:40:39.865611 2019] [core:notice] [pid 9371] SELinux policy enabled; httpd running as context system_u:system_r:httpd_t:s0
[Mon Mar 11 10:40:39.868149 2019] [suexec:notice] [pid 9371] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Mar 11 10:40:39.918015 2019] [auth_digest:notice] [pid 9371] AH01757: generating secret for digest authentication ...
[Mon Mar 11 10:40:39.919681 2019] [lbmethod_heartbeat:notice] [pid 9371] AH02282: No slotmem from mod_heartmonitor
[Mon Mar 11 10:40:39.948303 2019] [mpm_prefork:notice] [pid 9371] AH00163: Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 configured -- resuming normal operations
[Mon Mar 11 10:40:39.948370 2019] [core:notice] [pid 9371] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
[Mon Mar 11 10:40:42.878806 2019] [mime_magic:error] [pid 9376] [client ip] AH01512: mod_mime_magic: can't read `/home/user/projects/myapp/new/wsgi.py'
[Mon Mar 11 10:40:42.879459 2019] [mime_magic:error] [pid 9376] [client ip] AH01512: mod_mime_magic: can't read `/home/user/projects/myapp/new/wsgi.py'
[Mon Mar 11 10:40:42.905048 2019] [:error] [pid 9372] (13)Permission denied: [remote ip] mod_wsgi (pid=9372, process='myapp', application='<url>|'): Call to fopen() failed for '/home/user/projects/myapp/new/wsgi.py'

EDIT3

В этом лог-файле написано Apache/2.4.6 (CentOS) mod_wsgi/3.4 Python/2.7.5 configured, когда я запускаю python3.6, а не 2.7.5. Может быть, изменение поможет?

РЕДАКТИРОВАТЬ 4

Итак, я изменил свой WSGIDaemonProcess на

WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/app/env/lib/python3.6/site-packages user=<user>

Теперь я получаю эти ошибки

[Tue Mar 12 10:38:09.111397 2019] [mime_magic:error] [pid 18804] [client ip] AH01512: mod_mime_magic: can't read `/home/user/project/myapp/new/wsgi.py'
ImportError: No module named site
ImportError: No module named site
ImportError: No module named site

, похоже, мне нужно удалить mod_wsgi и переустановить для компиляции с python3.6, а не с 2.7

Как мне это сделать? я удаляю mod_wsgi и пытаюсь установить mreinstall с помощью sudo pip3.6 install mod_wsgi Теперь он не распознает новую установку mod_wsgi и не запускает сервер из-за invalid command 'WSGIDaemonProcess' это bc, новая загрузка не настроена с httpd? как бы я это сделал?

РЕДАКТИРОВАТЬ 5

Успешно установленный mod_wsgi, скомпилированный с правильной версией Python и способный запускать сервер, установите SELinux на разрешение, чтобы избавиться от cant find '/route/to/wsgi/py. и теперь я не получаю ошибок кодирования имени модуля, которые повторяются.

[Wed Mar 13 15:20:46.133597 2019] [core:notice] [pid 4403] AH00094: Command line: '/usr/sbin/httpd -D FOREGROUND'
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'
[Tue Mar 12 14:11:57.520271 2019] [core:notice] [pid 866] AH00052: child pid 891 exit signal Aborted (6)
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ModuleNotFoundError: No module named 'encodings'

в настоящее время все мои разрешения находятся под пользователем apache и группой apache, и, кажется, у них все права доступа, и я попытался изменить корневого пользователя / группы на apache, и запустил chmod -R 777 в каталоге Myapp, чтобы сделать уверен, что у него были соответствующие разрешения.

Разрешения по проектам:

home/user/projects# ls -l

total 0
drwxrw-r-x. 7 apache apache 109 Mar 12 12:48 myapp

home/user/projects/myapp# ls -l

Разрешения под myapp:

total 12
drwxrwxr-x. 7 apache apache 4096 Mar  7 13:18 app
drwxr-xr-x. 5 apache apache   56 Mar 12 12:48 env
-rwxrwxr-x. 1 apache apache  535 Mar  5 13:33 manage.py
drwxrwxr-x. 3 apache apache  110 Mar  7 14:27 new
-rw-rw-r--. 1 apache apache  869 Mar  7 14:42 requirements.txt

Ответы [ 4 ]

2 голосов
/ 11 марта 2019

Попробуйте разрешение на уровне dir, а не в файле.

<Directory /home/user/projects/myapp/new>
     Require all granted
</Directory>
2 голосов
/ 11 марта 2019

Согласно документации mod_wsgi:

user = name |user = # uid Определяет имя пользователя UNIX или числовой uid пользователя, под которым должны запускаться процессы демона.Если этот параметр не указан, процессы-демоны будут запускаться от имени того же пользователя, что Apache будет запускать дочерние процессы, как определено в директиве User, и нет необходимости устанавливать это для пользователя Apache самостоятельно.

Я полагаю, что пользователь apache не может получить доступ к вашему домашнему каталогу.Либо попробуйте добавить директиву user=myUser в ваш WSGIDaemonProcess, либо chown вашу директорию для пользователя apache.Другой возможный способ - поместить ваше приложение в каталог, принадлежащий пользователю apache.

РЕДАКТИРОВАТЬ

Я действительно должен научиться читать.Согласно документации, похоже, что вам следует перекомпилировать mod_wsgi с использованием интерпретатора python3.X для запуска приложений python3.X (используйте одинаковые версии как для компиляции, так и для среды приложения)

Если вы хотитечтобы использовать другую версию Python, вам нужно переустановить mod_wsgi, скомпилировав его для нужной версии.Один экземпляр mod_wsgi не может одновременно запускать приложения для Python 2 и 3.

РЕДАКТИРОВАТЬ 2

Чтобы ответить на один изВаши комментарии: Это нормально, что yum не удалит версию, установленную вами через pip.Невозможно догадаться, что вы установили пакеты через другие менеджеры пакетов AFAIK.Я думаю, что вы должны скопировать некоторые файлы .so (я думаю, это mod_wsgi [версия] .so), которые находятся в каталоге, где pip установил mod_wsgi (я думаю, внутри вашего venv / global site_packages) в папку, где находится Apache /Httpd загружает файлы своих модулей (это что-то вроде /usr/lib/apache2/modules в alpine / ubuntu, так что я думаю, что это /usr/lib/httpd/modules для CentOS, но может отличаться, извините, я не могу дать вам более конкретную помощь) после перемещения из этой папкистарый mod_wsgi .so.Не забудьте отключить httpd перед этим и перезапустить его после.

Источник: https://modwsgi.readthedocs.io/en/develop/configuration-directives/WSGIDaemonProcess.html (раздел python-home)

1 голос
/ 18 марта 2019

Вы должны передать местоположение библиотеки для переменной env.

WSGIDaemonProcess myapp python-path=/home/user/projects/myapp python-home=/home/user/projects/myapp/env/lib/<PYTHON VERSION>/site-packages/
1 голос
/ 12 марта 2019

Вы можете проверить пользователя и группу на apache по

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf

Убедитесь, что у вас есть права на /home/user/projects/myapp/new/wsgi.py

перепроверить по ls -l

Попробуйте, например, если пользователь apache, а группа apache

sudo chown apache:apache /home/user/projects/myapp/new/wsgi.py

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...