Развертывание Django в AWS;статические файлы для чайников - PullRequest
0 голосов
/ 14 декабря 2018

Я совершенно потерян на одном из последних шагов этого проекта.

До сих пор я смог разработать приложение django, которое работает так, как я хочу, на localhost;Мне удалось развернуть веб-сайт в AWS EC2, но я, должно быть, упускаю что-то фундаментальное в обслуживании статических файлов.(Я даже еще не пробовал мультимедийные файлы.) Я прочитал страницу развертывания Django и инструкции по управлению статическими файлами , но я никогда раньше не развертывал веб-сайт с нуля.,Учебные пособия, которые я нашел, кажутся противоречащими (или устаревшими?).

Вот вопросы, которые, на мой взгляд, у меня есть в данный момент:

  1. Нужен ли мне 1013 * для размещения статических (и / или мультимедийных) файлов в корзине, или это просто хорошая идея?
  2. Когда я настраиваю STATIC_ROOT и STATIC_URL, я должен иметь установку STATICFILE_DIRS?(Я имею в виду, я думаю, что мне действительно нужен учебник о том, как они вообще работают вместе, их настройках и как работает «статический» в шаблонах.)
  3. Я пытался добиться успеха;Я получаю сообщение о том, что STATIC_URL настроен неправильно;Я не могу найти документацию, чтобы сказать мне, что это должно быть.Это жизнеспособный корень, чтобы взять?

РЕДАКТИРОВАТЬ

Даже с удивительно подробным ответом @DirkGroten я все еще не понимаю, как обслуживать статическиефайлы.Я могу запустить сервер и затем веб-браузер, чтобы увидеть страницы без статических файлов.Но теперь у меня появилась новая проблема: страницы, на которых есть статические файлы, возвращают ошибку 500 27 (тогда как раньше они возвращали ошибку только для файла).Итак, вот моя структура папок, а ниже - соответствующая часть моего файла настроек (который фактически разбит на base, dev и prod).

[mainsite]/
|---[mainsite]/
|   |---[settings]/
|       |---base.py
|       |---dev.py
|       |---prod.py
|---[app1]/
|   |---[migrations]
|   |---[static]/
|   |   |---[app1]/
|   |   |   |---app1_file1.jpg (etc)
|   |   |---app1_style.css
|   |---[templates]/
|   |   |---[app1]/
|   |       |---about.html (etc)
|---[app2]/ (etc)
|---[static]  (this gets populated after running collectstatic)

настройки разработки:

Debug = False
ALLOWED_HOSTS = [###.###.###.###]  

MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',   
... (the rest of the middleware)
]

STATIC_URL = '/static/'
STATIC_ROOT = os.path.abspath(os.path.join(BASE_DIR, 'static'))
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'app1/'),
                    os.path.join(BASE_DIR, 'app2/'),
                    os.path.join(BASE_DIR, 'app3/'),
                    ]
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Я удостоверился, что импортирую белый файл в файл производственных требований.

Чего мне не хватает?

Кроме того, я никогда не использовал поддержку AWSсистема.(Я на свободном уровне.) Могу ли я получить их помощь?Должен ли я начать дело?

TIA.

1 Ответ

0 голосов
/ 14 декабря 2018

Первые вопросы:

  1. Нет, это один из вариантов, но, безусловно, неплохо использовать централизованное общее хранилище, когда вам нужно обслуживать свой сайт из несколькихEC2 экземпляры.S3 - один из вариантов, я использую EFS, который мне проще (см. Ниже).
  2. Да, вам нужно указать collectstatic, где искать статические файлы, чтобы у вас было STATICFILES_DIRS.
  3. Да, мне нравится белый шум, он хорошо работает в сочетании с CDN.Упрощает не беспокоиться об истечении срока действия / заголовках кэша.

Я написал пост в блоге об этом .

Это настройка, которая работает дляодин экземпляр EC2:

  • Статические файлы, хранящиеся локально на экземпляре EC2 (на томе EBS) -> STATIC_ROOT (где они хранятся)
  • Белый шум для обслуживания статическогофайлы и правильная настройка заголовков кэша
  • CompressedManifestStaticFilesStorage в качестве хранилища (настройка STATICFILES_STORAGE)
  • Предпочтительно CloudFront или другие CDN для обслуживания статических файлов -> STATIC_URL настройка.

В конечном итоге вы захотите, чтобы ваши статические файлы хранились централизованно, чтобы к ним могли обращаться несколько экземпляров EC2 (в противном случае вам пришлось бы дублировать их на каждом компьютере и обеспечить синхронизацию файлов манифеста), поэтому мойсобственные настройки:

  • Статические файлы, хранящиеся на томе EFS, который монтируется и используется всеми экземплярами EC2 (гораздо проще в настройке и использовании, чем S3, поскольку это всего лишь смонтированный диск, так как Python являетсяобеспокоенно).Я установил точку монтирования тома EFS в том же месте, что и STATIC_ROOT, поэтому в настройках ничего не изменилось.
  • Затем то же, что и выше: Whitenoise, CloudFront и хранилище манифеста.

Попробуйте сначала заставить его работать с первой настройкой, выполнив следующее:

  • STATIC_URL должен быть URL, который будет отображаться в HTML.Просто /static/ должно работать с WhiteNoiseMiddleware, но если вы используете CDN, вам нужно предшествовать этому полному имени хоста вашего экземпляра CDN.
  • STATICFILES_STORAGE должно быть одним из хранилищ, предлагаемых Whitenoise, ярекомендуем CompressedManifestStaticFilesStorage.
  • STATICFILES_DIRS сообщает collectstatic, где можно найти статические файлы для сбора.Обратите внимание, что если у вас есть только статические файлы в каталоге /static внутри каждого приложения, collectstatic найдет их автоматически, и вы не должны указывать эти каталоги здесь.Если в вашем главном каталоге проекта есть каталог /static, вы должны добавить (os.path.join(BASE_DIR, "my_site", "static"),) к STATICFILES_DIRS, где BASE_DIR (или PROJECT_ROOT в некоторых проектах) является корневым каталогом вашего проекта.
  • STATIC_ROOT должно быть физическим расположением статических файлов на диске.Именно здесь collectstatic будет копировать их и индексировать их, начиная с уровня выше вашего BASE_DIR, то есть os.path.abspath(os.path.join(BASE_DIR, '../static'))

Теперь каждый раз, когда вы обновляете свой код и статические файлы, вы должнызапустить django-admin collectstatic.Это скопирует все ваши статические файлы в вашу директорию STATIC_ROOT, куда whitenoise выберет их для обслуживания.Вы увидите, что хеши MD5 добавляются к имени файла при каждом изменении файла, так что браузеры выбирают новую версию и не используют кэшированную версию (по умолчанию Whitenoise сообщает браузерам кэшировать статические файлы на 2 года).

Если вы заставите это работать, начните добавлять CDN (настройте его так, чтобы он извлекал файлы с вашего сервера, поэтому теперь белому файлу придется только один раз подавать файл в CDN, браузеры получат его из CDN);вам нужно изменить STATIC_URL, чтобы добавить имя хоста CDN (например, https://die9493v4034.cloudfront.net/static/).

Затем переместите расположение файлов из локального экземпляра в общее хранилище (например, EFS).

...