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