Apache не обслуживает статические файлы из правильного каталога.

Вопрос или проблема

На самом деле я не уверен, является ли заголовок темы источником моей проблемы, но есть серьезные указания на это. Я не эксперт в таких серверах приложений, как Apache, поэтому любая помощь будет очень кстати.

Я успешно установил приложение Django на машину Google Cloud VM (Ubuntu 16.04 с статическим IP). Я могу получить доступ к странице, но CSS не загружается, отсутствуют файлы JavaScript (например, jQuery), и возникает несколько ошибок 500 Internal Server Error.

Чтобы дать лучшее представление об ошибках, я прилагаю снимок экрана enter image description here

Первое, что я подумал, это то, что я не положил статические файлы в правильную папку для сервера приложений (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

Устранение других проблем

  1. Логи Apache: Проверьте логи Apache на предмет более подробных ошибок. Они часто предоставляют подсказки для решения проблемы.
  2. Перезагрузка Apache: После внесения изменений не забудьте перезапустить службу Apache:
    sudo systemctl restart apache2
  3. Кэш браузера: Убедитесь, что кэш вашего браузера очищен, чтобы видеть последние изменения.
  4. Обновление зависимостей: Убедитесь, что все пакеты и зависимости актуальны.

Следуя этим рекомендациям, вы сможете выявить и устранить проблему с выводом статических файлов в Apache для вашего проекта Django. Если проблема сохраняется, стоит рассмотреть возможность проверки дополнительных конфигураций, включая сетевые ограничения и проблемы с маршрутизацией запросов.

Оцените материал
Добавить комментарий

Капча загружается...