Proxy Nginx pour les Fichiers sur le Disque Local ou S3
Je suis donc un déplacement de mon site à l'écart de Apache et Nginx sur, et je vais avoir du mal avec ce scénario:
Utilisateur télécharge une photo. Cette photo est redimensionnée, et de le copier dans S3. S'il convient de place sur le disque (ou le fichier ne peut pas être transféré à S3), une version locale est conservé.
Je veux les demandes de ces images (comme http://www.mysite.com/p/1_1.jpg) de regarder d'abord dans le p/répertoire. Si aucun fichier n'existe pas, je veux proxy la demande pour S3 et le rendu de l'image (mais pas de redirection).
Dans Apache, je l'ai fait comme ça:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^p/([0-9]+_[0-9]+\.jpg)$ http://my_bucket.s3.amazonaws.com/$1 [P,L]
Ma tentative de reproduire ce comportement dans Nginx est-ce:
location /p/{
if (-e $request_filename) {
break;
}
proxy_pass http://my_bucket.s3.amazonaws.com/;
}
Ce qui se passe, c'est que chaque demande tente de frapper Amazon S3, même si le fichier existe sur le disque (et si elle n'existe pas sur Amazon, j'ai des erreurs.) Si je supprime le proxy_pass ligne, puis les demandes de fichiers sur le disque fonctionnent.
Aucune idée sur comment résoudre ce problème?
OriginalL'auteur Coomer | 2010-01-12
Vous devez vous connecter pour publier un commentaire.
Ne devrait-ce pas être un exemple d'utilisation de
try_files
?Assurez-vous qu'il n'est pas un slash sur le S3 url
OriginalL'auteur Dan Gayle
Vous pourriez améliorer votre s3 proxy config de ce genre. Adapté de https://stackoverflow.com/a/44749584:
OriginalL'auteur RubenCaro
Merci de garder mon coderwall post 🙂 Pour la mise en cache, vous pouvez l'améliorer un peu:
Une recommandation est d'étendre le cache de résolution jusqu'à 5 min:
proxy_pass http://$s3_bucket$url_full;
OriginalL'auteur Anatoly
break
n'est pas tout à fait ce que vous attendez de nginx va faire la dernière chose que vous lui demandez, ce qui est logique, si vous commencez à creuser autour des modules... mais au fond de protéger votre proxy_pass avec le n'existe pas versionhttp://my_bucket.s3.amazonaws.com/
dans leproxy_pass
appel. J'obtiens l'erreur suivante:Restarting nginx: 2010/01/11 20:53:36 [emerg] 1485#0: "proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /etc/nginx/sites-enabled/my_site.com:39
Si j'ai enlever le slash de fin, Nginx va commencer, mais mes demandes ne sont pas acheminés plus correctement. Des idées?OriginalL'auteur Chris Farmiloe
J'ai fini par résoudre ce par la vérification pour voir si le fichier n'existe pas, et si oui, la réécriture de cette demande. J'ai ensuite gérer le re-demande écrite et de faire le proxy_pass il y a, comme suit:
if
dans nginx est très imprévisible du comportement. Même si cela fonctionne bien, il est recommandé d'utilisertry_files
chaque fois que possible, comme dans Dan Gayle réponse. Vérifier wiki.nginx.org/IfIsEvil pour les subtilités deif
.OriginalL'auteur Coomer