Re: статический контент и NodeJS Express
Cyril Zlachevsky
cyril.zlachevsky на gmail.com
Вт Сен 29 07:11:18 UTC 2020
спасибо за помощь, все заработало как надо, с небольшими изменениями -
в строке конфига nginx
root root /var/www/path/to/static;
не нужно указывать в конце static, иначе nginx будет добавлять static
два раза в запрос и не находить запрашиваемый файл:
2020/09/29 09:21:30 [error] 1530#1530: *179 open()
"home/user/src/nodejs-app/public/static/static/paintings/ekGLnI-1601359891434.jpg"
failed (2: No such file or directory), client: 127.0.0.1, server: ,
request: "GET /static/paintings/ekGLnI-1601359891434.jpg HTTP/1.1",
host: "127.0.0.1:8080", referrer:
"http://127.0.0.1:8080/admin/paintings/16"
В итоге рабочий конфиг у меня получился такой:
server {
listen 8080;
location / {
proxy_pass http://127.0.0.1:3000;
}
location /static/ {
root /home/user/src/nodejs-app/public/;
}
}
Осталось как-то проверить, будут ли отклоняться запросы PUT и
POST-запросы к каталогу public/static, не содержащие кук авторизации -
эта проверка есть на бек-энде, но я не уверен, сработает ли она в
текущей связке с nginx.
вт, 29 сент. 2020 г. в 08:44, fox <red-fox0 на ya.ru>:
>
> Как уже писали выше, например, так:
> server {
> location / {
> proxy_pass http://127.0.0.1:3000;
> }
>
> location /public/static/ {
> root /var/www/path/to/static;
> }
> }
>
> 29.09.2020 12:14, Cyril Zlachevsky пишет:
> > В middleware NextJS каталог public прописан как protected:
> > protected generatePublicRoutes(): Route[] {
> >
> > Авторизация требуется только на загрузку файлов в данный каталог через
> > запросы PUT и POST и реализована в Express.
> > И насколько я представляю задачу, нужно, чтобы nginx знал об Express и
> > динамический контент отдавал ему (на порт 3000 например), а работу со
> > статикой брал на себя.
> > Как этот функционал реализовать?
> >
> > пн, 28 сент. 2020 г. в 21:07, Alexey Galygin <mif на me.com>:
> >>
> >> Express действительно любит кэшировать состояния (правда это больше касается шаблонов — он их компилирует и больше не проверяет, но слышать про файлы такое удивительно, возможно используемое раздающее middleware придерживается другой политики)
> >>
> >
> >> обычная практика в таких случаях:
> >>
> >> выделение «датахранилки» — папки, которую через настроенный location раздаёт nginx напрямую
> >> с кэшами (заголовки и настройки добавить по вкусу)
> >> https://nginx.org/ru/docs/beginners_guide.html#static
> >>
> >> вся статика складывается туда, и нет смысла грузить backend непрофильными запросами вообще — nginx отстреляется лучше всего
> >>
> >> если каким-то файлам требуется авторизация, можно сделать дополнительный internal location и с backend после проверки кидать туда (через x-accel-redirect — https://www.nginx.com/resources/wiki/start/topics/examples/x-accel/)
> >> и nginx опять таки отдаст статику напрямую и быстрее любой backend логики
> >>
> >> более того, можно сделать, чтобы правильна работала отдача частичного контента (bytes range) и эффективная раздача с диска
> >>
> >> всё что не попадает под пути хранилки проксировать на Express
> >>
> >> On 28 Sep 2020, at 20:08, Cyril Zlachevsky <cyril.zlachevsky на gmail.com> wrote:
> >>
> >> Есть приложение на NodeJS, которое прекрасно работает в
> >> developer-режиме. В качестве http-сервера используется ExpressJS.
> >> В production-режиме появляется проблема - http GET запросы возвращают
> >> 404-ю ошибку для всех новых файлов, загруженных после старта приложения
> >> в каталог public.
> >>
> >> Пример: если до старта файл public/static/old.jpg существовал, GET
> >> запрос вернет его с кодом 200.
> >> Если мы загрузили через nodejs-приложение файл public/static/new.jpg
> >> GET-запрос будет возвращать ошибку 404. Если перезапустить приложение,
> >> GET на public/static/new.jpg будет возвращать 200.
> >>
> >> Гугление проблемы привело к пониманию, что это не ошибка, а особенность
> >> Express-сервера и для production рекомендуется использовать связку
> >> nginx+express. Как мне настроить работу этой связки, я не вполне
> >> представляю, поэтому прошу помощи здесь.
Подробная информация о списке рассылки nginx-ru