Статические файлы не обслуживаются при развертывании приложения Django с Lighttpd и Gunicorn

Я работаю над своим первым проектом Django. Я хочу разместить его на сервере Lighttpd, а не на nginx или apache. Проект хорошо работает в режиме разработчика. Сервер 'runserver' обслуживает все файлы, как и предполагалось.

Поскольку Lighttpd сам по себе не может разместить проект Django, я использую Gunicorn для обслуживания динамических аспектов.

Версия Django - 3.2 Gunicorn - 21.2 Python - 3.8 Lighttpd - 1.4.52

Я настроил свой Lighttpd в отдельном conf-файле с именем myapp.conf, не изменяя стандартный файл lighttpd.conf.

Когда я запускаю сервер, я вижу, что Gunicorn правильно загружает index.html, но файлы css не загружаются lighttpd. Он выдает следующую ошибку:

GET https://ip-address/myapp/static/css/indexStyle.css net::ERR_ABORTED 404 (Not Found)

Аналогично Gunicorn выдает ошибку при загрузке js-файла: GET https://ip-address/myapp/static/js/TM_PageFun.js net::ERR_ABORTED 404 (Not Found) Отказано в выполнении скрипта с адреса 'https://ip-address/myapp/static/js/TM_PageFun.js', поскольку его MIME-тип ('text/html') не является исполняемым, а строгая проверка MIME-типа включена.

Я нашел здесь много информации о подключении Django к Nginx и Gunicorn. Но я не смог найти много информации по Lighttpd. Я не уверен, где именно происходит ошибка.

Я добавил mime-типы и дважды проверил путь и разрешения.

Файлы CSS находятся в /usr/web/myapp/static/css JS файлы находятся в /usr/web/myapp/static/js Файлы изображений находятся в /usr/web/myapp/static

myapp.conf выглядит следующим образом :

server.max-fds = 2048

mimetype.assign := (

  ".js" => "text/javascript",
  ".css" => "text/css",
  ".html" => "text/html",
  ".txt" => "text/plain",
  ".jpg" => "image/jpeg",
  ".png" => "image/png",
)

$HTTP["url"] =~ "^/myapp/static" {
  server.document-root = "/usr/web/myapp/static"
}

$HTTP["url"] =~ "^/myapp/static/html" {
  server.document-root = "/usr/web/myapp/static/html"
  proxy.server = ( "" => ( ( "host" =>  "127.0.0.1", "port" => 8000 ) ) )
}

$HTTP["url"] =~ "^/myapp/static/js" {
  server.document-root = "/usr/web/myapp/static/js"
  proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 8000 ) ) )

}

Выглядит lighttpd.conf следующим образом:

В моем файле Django settings.py есть следующее :

BASE_DIR = "/usr/web/myapp"
DEBUG = False
ALLOWED_HOSTS = ['*']
WSGI_APPLICATION = 'myapp.wsgi.application'
static_path = BASE_DIR +"/static"
STATIC_ROOT = BASE_DIR + "/static"
STATIC_URL = "/myapp/static"
STATICFILES_DIRS=(os.path.join(static_path),)

urls.py

from typing import Counter
from django import views
from django.urls import path
from . import views
from django.contrib import admin

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',views.index, name='index'),
    path('index.html',views.index, name='index'),
    path('TM_page.html',views.TM_page, name='TM_page'),
    path('logout',views.logout_request,name='logout')
]

Чтобы обслуживать статические документы при развертывании программ Django с помощью Lighttpd и Gunicorn:

Убедитесь, что настройки Django настроены на обслуживание статических файлов.

Запустите команду collect static для накопления статических файлов.

Настройте Lighttpd на обслуживание статических документов с помощью соответствующих правил.

Проверьте права доступа к файлам и при необходимости перезапустите предложения.

Проверьте журналы ошибок Lighttpd для устранения неполадок.

Как насчет того, чтобы позволить lighttpd обслуживать статические файлы и проксировать динамические запросы обратно к gunicorn?

$HTTP["url"] =~ "^/myapp" {
  $HTTP["url"] =~ "^/myapp/static" {
    alias.url = ( "/myapp/static" => "/usr/web/myapp/static" )
  }
  else {
    proxy.server = ( "" => ( ( "host" => "127.0.0.1", "port" => 8000 ) ) )
  }
}

Также ответили на stackoverflow с помощью gunicorn 5 лет назад здесь:

Как настроить lighttpd для обслуживания статических файлов django?

Ответили на stackoverflow, используя более простой протокол SCGI, а не проксирование на gunicorn:

Как настроить django с lighttpd?

Если вы используете поисковую систему Django и FastCGI или SCGI, вы найдете массу примеров, как это настроить. lighttpd можно настроить на использование mod_fastcgi, mod_scgi или mod_proxy для отправки динамических запросов к бэкенду Django.

BTW: Lighttpd - 1.4.52 очень старый - lighttpd 1.4.52 был выпущен в ноябре 2018 года! Последняя стабильная версия lighttpd - lighttpd 1.4.76.

Вернуться на верх