Статические файлы не обслуживаются при развертывании приложения 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.