Tengo una nginx
configuración compleja donde un frente nginx
en los puertos 80 y 443 maneja todo el acceso externo, incluido TLS.
Para los archivos en /texts
el frontend-nginx, se enviará una solicitud de proxy a un segundo backend-nginx que modifica los archivos de texto existentes sobre la marcha en un proceso complicado, consumiendo CPU y otros recursos.
Para aquellos archivos *.txt
que no existen (404), no deseo molestar al backend en absoluto, sino proporcionar al cliente un archivo predeterminado /texts/default.txt
directamente. Sin embargo, los archivos que actualmente no existen solo se manejan en la error_page 404
línea del backend. Los archivos existentes se sirven sin problemas, el proxy funciona.
Esta es mi configuración:
frontend-nginx.conf:
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name frontend.example.org;
root /srv/www;
location /texts/ {
location ~ \*.txt$ {
root /srv/www/backend;
####### the next line has absolutely no effect
try_files $uri /texts/default.txt;
}
proxy_pass http://localhost:90;
proxy_redirect http://localhost:90/ /;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Client-Verify SUCCESS;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_redirect off;
}
}
# https goes here, all the same except TLS
}
backend-nginx.conf:
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
listen 127.0.0.1:90;
root /srv/www/backend;
charset utf-8;
expires -1; # no-cache
location ~ /..*\.txt$ {
# longer cache time for text files
expires 10m;
# this actually works but only here in the backend
error_page 404 @404;
}
location @404 {
return 302 $scheme://frontend.example.org/texts/default.txt
}
}
}
Tengo esa declaración inútil en el archivo de configuración de la interfaz que me parece como si pudiera manejar redirecciones 404, default.txt
pero cuando lo hago
wget -v http://frontend.example.org/texts/notexist.txt
Recibo una redirección solo dentro del backend (por lo que se realiza el proxy).
Respuesta1
location /texts/ {
proxy_set_header ...;
proxy_pass ...;
location ~ \.txt$ {
root /path/to/root;
try_files $uri /texts/default.txt;
proxy_pass ...;
}
}
location = /texts/default.txt {
root /path/to/root;
}
Observe la expresión regular correcta para la location
declaración. Las proxy_set_header
declaraciones se heredarán, pero proxy_pass
es necesario repetirlas en el archivo location
.
La try_files
declaración verificará la existencia del archivo y cambiará el URI si no existe.
El archivo predeterminado tiene una sección dedicada location
para que el archivo pueda servirse como un archivo estático desde la raíz correcta.
La ruta al archivo se construye concatenando el valor de root
con el URI, por lo que el archivo /texts/default.txt
se ubica en /path/to/root/texts/default.txt
.