Вопрос или проблема
На самом деле я не уверен, является ли заголовок темы источником моей проблемы, но есть серьезные указания на это. Я не эксперт в таких серверах приложений, как Apache, поэтому любая помощь будет очень кстати.
Я успешно установил приложение Django на машину Google Cloud VM (Ubuntu 16.04 с статическим IP). Я могу получить доступ к странице, но CSS не загружается, отсутствуют файлы JavaScript (например, jQuery), и возникает несколько ошибок 500 Internal Server Error.
Чтобы дать лучшее представление об ошибках, я прилагаю снимок экрана
Первое, что я подумал, это то, что я не положил статические файлы в правильную папку для сервера приложений (www/../). Но это было не так.
Затем я подумал, что, возможно, у папки www нет правильных разрешений. Но это было не так. Пользователь был установлен правильно: www-data.
Моя папка sites-enabled Apache2 включает в себя мой файл project.conf.
Затем я попытался выполнить эту команду:
/usr/sbin/apache2 -S
и получил это в ответ:
VirtualHost configuration:
*:80 localhost (/etc/apache2/sites-enabled/geonode.conf:3)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex proxy: using_defaults
Mutex default: dir="/var/lock/apache2" mechanism=fcntl
Mutex watchdog-callback: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33 not_used
Group: name="www-data" id=33 not_used
Как вы можете видеть, основной DocumentRoot находится в следующей папке: “/var/www/html”. Я задумался, может ли это быть причиной. Как-то Apache пытается читать файлы из неправильного каталога (правильного /var/www/project).
Я попытался изменить основной DocumentRoot, изменив параметры в файле apache.conf, но всякий раз, когда я тестирую изменения (/usr/sbin/apache2 -S), я все же получаю старый каталог.
Я даже не уверен, что это может быть проблемой. Есть идеи, что здесь происходит?
Примечание 1: Я попытался установить на локальной виртуальной машине, и все работает нормально.
Примечание 2: Я попытался на другой удаленной виртуальной машине, и я получаю ту же проблему.
ИЗМЕНИТЬ
Это файл error.log Apache:
[Fri Jun 01 03:42:58.356938 2018] [wsgi:error] [pid 32199:tid 140244594628352]
Internal Server Error: /favicon.ico
[Fri Jun 01 03:42:58.357214 2018] [wsgi:error] [pid 32199:tid 140244594628352]
Traceback (most recent call last):
[Fri Jun 01 03:42:58.357347 2018] [wsgi:error] [pid 32199:tid 140244594628352]
File "/usr/lib/python2.7/dist-packages/django/core/handlers/base.py", line
108, in get_response
[Fri Jun 01 03:42:58.357402 2018] [wsgi:error] [pid 32199:tid 140244594628352]
response = middleware_method(request)
[Fri Jun 01 03:42:58.357450 2018] [wsgi:error] [pid 32199:tid 140244594628352]
File "/usr/lib/python2.7/dist-packages/django/middleware/common.py", line 62,
in process_request
[Fri Jun 01 03:42:58.357496 2018] [wsgi:error] [pid 32199:tid 140244594628352]
host = request.get_host()
[Fri Jun 01 03:42:58.357556 2018] [wsgi:error] [pid 32199:tid 140244594628352]
File "/usr/lib/python2.7/dist-packages/django/http/request.py", line 94,
inget_host
[Fri Jun 01 03:42:58.357603 2018] [wsgi:error] [pid 32199:tid 140244594628352]
if domain and validate_host(domain, allowed_hosts):
[Fri Jun 01 03:42:58.357651 2018] [wsgi:error] [pid 32199:tid 140244594628352]
File "/usr/lib/python2.7/dist-packages/django/http/request.py", line 571, in
validate_host
[Fri Jun 01 03:42:58.357696 2018] [wsgi:error] [pid 32199:tid 140244594628352]
pattern = pattern.lower()
[Fri Jun 01 03:42:58.357762 2018] [wsgi:error] [pid 32199:tid 140244594628352]
AttributeError: 'NoneType' object has no attribute 'lower'
ИЗМЕНИТЬ
Так выглядит мой конфигурационный файл в папке sites-enabled:
WSGIDaemonProcess geonode user=www-data threads=15 processes=2
<VirtualHost *:80>
Servername localhost
ServerAdmin webmaster@localhost
LimitRequestFieldSize 32760
LimitRequestLine 32760
ErrorLog /var/log/apache2/error.log
LogLevel warn
CustomLog /var/log/apache2/access.log combined
WSGIProcessGroup geonode
WSGIPassAuthorization On
WSGIScriptAlias / /var/www/geonode/wsgi/geonode.wsgi
<Directory "/var/www/geonode/">
Order allow,deny
Options -Indexes
] Allow from all
Require all granted
</Directory>
Alias /static/ /var/www/geonode/static/
Alias /uploaded/ /var/www/geonode/uploaded/
Alias /robots.txt /var/www/geonode/robots.txt
<Directory "/var/www/geonode/uploaded/documents/">
Order allow,deny
Deny from all
</Directory>
<Directory "/var/www/geonode/uploaded/layers/">
Order allow,deny
Deny from all
</Directory>
<Directory "/var/www/geonode/static_root/">
Order allow,deny
Options Indexes FollowSymLinks
Allow from all
Require all granted
IndexOptions FancyIndexing
</Directory>
<Directory "/var/www/geonode/uploaded/thumbs/">
Order allow,deny
Options Indexes FollowSymLinks
Allow from all
Require all granted
IndexOptions FancyIndexing
</Directory>
<Directory "/var/www/geonode/uploaded/avatars/">
Order allow,deny
Options Indexes FollowSymLinks
Allow from all
Require all granted
IndexOptions FancyIndexing
</Directory>
<Directory "/var/www/geonode/uploaded/people_group/">
Order allow,deny
Options Indexes FollowSymLinks
Allow from all
Require all granted
IndexOptions FancyIndexing
</Directory>
<Directory "/var/www/geonode/uploaded/group/">
Order allow,deny
Options Indexes FollowSymLinks
Allow from all
Require all granted
IndexOptions FancyIndexing
</Directory>
<Proxy *>
Order allow,deny
Require all granted
Allow from all
</Proxy>
ProxyPreserveHost On
ProxyPass /geoserver http://localhost:8080/geoserver
ProxyPassReverse /geoserver http://localhost:8080/geoserver
</VirtualHost>
Попробуйте установить DocumentRoot
следующим образом:
<VirtualHost *:80>
DocumentRoot /var/www/project
</VirtualHost>
Ответ или решение
Если Apache не обслуживает статические файлы из правильного каталога, необходимо внимательно проанализировать конфигурацию Apache и убедиться, что все параметры настроены корректно. Проблема может быть вызвана различными факторами, которые стоит рассмотреть:
Фактор: Неправильная конфигурация VirtualHost
Первое, что следует проверить — это правильность конфигурации вашего раздела <VirtualHost>
в Apache. В вашем конфигурационном файле, скорее всего, нужно убедиться, что определены правильные пути к статическим файлам и они соответствуют действительным путям на сервере.
Предложение изменений:
<VirtualHost *:80>
ServerName localhost
DocumentRoot /var/www/geonode
WSGIDaemonProcess geonode user=www-data threads=15 processes=2
WSGIProcessGroup geonode
WSGIPassAuthorization On
WSGIScriptAlias / /var/www/geonode/wsgi/geonode.wsgi
Alias /static /var/www/geonode/static
<Directory /var/www/geonode/static>
Require all granted
</Directory>
Alias /uploaded /var/www/geonode/uploaded
<Directory /var/www/geonode/uploaded>
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Фактор: Права доступа
Важно удостовериться, что каталог для статических файлов и директория вашего проекта имеют корректные права доступа. Необходимо, чтобы пользователь Apache (обычно www-data
) имел права на чтение этих файлов.
Фактор: Конфигурация wsgi
Ошибки конфигурации wsgi
могут также быть причиной внутренних ошибок сервера (500). Убедитесь, что путь к WSGI-скрипту и его конфигурация верны.
Фактор: Django и корневой URL
На страницах Django корневой URL для статических файлов может быть настроен неправильно. Вам нужно проверить переменные STATIC_URL
и STATIC_ROOT
в settings.py
вашего приложения:
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
После внесения изменений, выполните команды для сборки статических файлов:
python manage.py collectstatic
Устранение других проблем
- Логи Apache: Проверьте логи Apache на предмет более подробных ошибок. Они часто предоставляют подсказки для решения проблемы.
- Перезагрузка Apache: После внесения изменений не забудьте перезапустить службу Apache:
sudo systemctl restart apache2
- Кэш браузера: Убедитесь, что кэш вашего браузера очищен, чтобы видеть последние изменения.
- Обновление зависимостей: Убедитесь, что все пакеты и зависимости актуальны.
Следуя этим рекомендациям, вы сможете выявить и устранить проблему с выводом статических файлов в Apache для вашего проекта Django. Если проблема сохраняется, стоит рассмотреть возможность проверки дополнительных конфигураций, включая сетевые ограничения и проблемы с маршрутизацией запросов.