Puncte:0

NGINX: try_files cu proxy_pass în containerul Docker

drapel cn

Folosesc nginx ca proxy invers pentru aplicațiile mele Node.js care rulează pe localhost:3000. Atât nginx în sine, cât și aplicația mea sunt două containere docker separate. (Separați pentru că mai târziu intenționez să adaug mai multe aplicații la el.)

În containerul meu de aplicații am câteva .webp imagini alternative. De exemplu.

$ ls
 
/app/assets/img/image.jpeg
/app/assets/img/image.jpeg.webp
/app/assets/img/other.jpeg

Am încercat să folosesc try_files cu nginx, dar din câte știu, acest lucru nu este posibil, deoarece try_files nu „vede” fișierele mele într-un alt container docker decât dacă partajează un volum. Pe care ei nu pot. Containerul pentru aplicații este construit în altă parte, cu totul în interior.

Ce am acum este asta:

aplicație în amonte {
  server localhost:3000;
}

[...]

locație ~* .+\.(jpg|jpeg|svg|png)$ {
  proxy_pass http://app$uri$webp_sufx;
}

[...]

Locație / {
  proxy_pass http://app;
}

Acest lucru funcționează de fapt. Clientul cere .jpg imagine şi primeşte .jpg.webp (pentru că se poate descurca). Problema este el mereu devine .jpg.webp. Ceea ce am nevoie este să verific dacă fișierul solicitat este disponibil în aplicația mea.

Deci ceva asemanator poate? Dar asta nu merge :-(


locație ~* .+\.(jpg|jpeg|svg|png)$ {
  dacă (-f http://app$uri$webp_sufx) {
    proxy_pass http://app$uri$webp_sufx;
  }
  proxy_pass http://app$uri;
}
drapel jp
Doar copiați asset în imaginea „nginx”.
Puncte:1
drapel us

Nu puteți implementa o astfel de verificare la distanță în nginx. Și chiar dacă ai putea, ar fi lent, deoarece nginx ar trebui să facă două solicitări pentru a servi un fișier.

Soluția preferată este să copiați / partajați activele într-un loc unde nginx le poate accesa.

O altă soluție este să implementați logica în aplicația dvs., care verifică extensiile de fișiere și servește fișierele în consecință. Apoi un simplu proxy_pass este suficient în front-end nginx.

A treia opțiune este să includeți nginx și în containerul aplicației. În acest caz un simplu proxy_pass poate fi folosit în front-end nginx.

YeppThat'sMe avatar
drapel cn
Bine, asta am crezut tbh. Dar mulțumesc!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.