Обслуживание статических файлов через GridFS MongoDB
Я довольно новичок в Django и пытаюсь развернуть небольшой хобби-проект на OpenShift. Я знаю, что существуют определенные соглашения, которые не разрешают Django обслуживать статические и мультимедийные файлы, потому что это неэффективно. Я также заметил, что Django отказывается обслуживать медиа-файлы, когда DEBUG
выключен Вот почему я ищу лучшие способы обслуживания этого контента.
Документация Django одобряет CDN, такие как Amazon S3, как один из лучших способов обслуживания статики, но как любитель, я бы предпочел пока использовать решения freemium. Я обнаружил, что MongoDB - еще одна технология, для которой я довольно новичок - предоставляет GridFS в качестве бэкэнда хранилища. Я могу получить бесплатное хранилище MongoDB через MongoLab, так что мне это интересно.
Будет ли такая конструкция работать на практике или это безумный разговор? Если это возможно, какие изменения мне нужно будет внести в мою среду OpenShift и настройки Django, чтобы GridFS мог обслуживать статический контент? Я видел альтернативные установки, где люди используют бесплатный CDN CloudFlare для обслуживания своего статического контента, но тогда я не смог бы загружать / получать доступ к медиа-файлам из моей локальной среды разработки.
1 ответ
Короче говоря, это плохая идея.
Вот почему: чтобы обслуживать статические файлы, вам сначала нужно обработать запрос, получить данные из GridFS, которая фактически разбивает файлы на 255 тыс. Порций, которые должны быть собраны (в зависимости от размера, конечно) и только тогда они могли быть возвращены.
Я обычно использую лак для кэширования статических файлов, обслуживаемых приложением, будь то django или контейнер сервлетов. Это работает так:
- Все запросы отправляются в лак, который либо отправляет запрошенный ресурс из кэша, либо вручную, затем в бэкэнд.
- Varnish использует ваше приложение django в качестве бэкэнда. Однако обычно я запускаю django за дополнительным lighttpd.
- Когда django возвращает статический файл, varnish помещает этот файл в область кэширования в памяти. На это обычно выделяется около 100 миллионов, а иногда и меньше. Размер ваших статических файлов должен быть вам хорошо известен. Я обычно использую простую конфигурацию кэширования, такую как "кэшировать все файлы, заканчивающиеся на.css, .js, .png".
- Все последующие запросы для этого статического ресурса теперь будут обрабатываться лаком - из памяти, через системный вызов sendfile, даже не обращаясь к бэкэнду.
В целом: таким образом, нагрузка берется из вашего приложения, задержка уменьшается, ресурсы доставляются молниеносно, это легко настроить без каких-либо усилий по программированию.
Редактировать: как для среды OpenShift: просто оставьте все как есть. Обслуживание статических файлов из MongoDB просто не имеет смысла.