J'aimerais appeler un emplacement nommé qui gère une directive de proxy inverse. J'ai donc essayé les lignes suivantes dans ma section d'hôte virtuel :
upstream node_upstream {
server 127.0.0.1:8000;
keepalive 64;
}
server {
server_name my.host-name.com;
listen 80;
access_log /home/webhost/logs/my-host-name.access.log;
error_log /home/webhost/logs/my-host-name.error.log;
root /home/webhost/www/my.host-name.com/node-canary/public;
location / {
index index.html;
try_files $uri $uri.html $uri/index.html $uri/ @node;
}
location @node {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://node_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
C'est assez simple, mais en l'exécutant, j'obtiens
nginx: [emerg] "proxy_pass" cannot have URI part in location
given by regular expression, or inside named location, or inside
"if" statement, or inside "limit_except" block in
/home/webhost/sites-enabled/my.host-name.com:29
nginx: configuration file /usr/local/etc/nginx/nginx.conf test failed
Pour moi, cela signifie que je ne peux pas utiliser laissez-passer dans le @node emplacement nommé.
J'ai donc pensé que je pouvais déjouer nginx en déplaçant simplement les directives situées dans l'emplacement @node vers l'emplacement racine (c'est-à-dire /). Tout ce qui se trouve à l'extérieur reste inchangé. Comme ceci :
server {
server_name my.host-name.com;
listen 80;
access_log /home/webhost/logs/my-host-name.access.log;
error_log /home/webhost/logs/my-host-name.error.log;
root /home/webhost/www/my.host-name.com/node-canary/public;
location / {
index index.html;
try_files $uri $uri.html $uri/index.html $uri/ $uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://node_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
Mais avec cette configuration, quelque chose de bizarre se produit. Lorsqu'un fichier statique existant est consulté, la demande est traitée par la connexion du proxy (une application node). pas en répondant avec le fichier statique lui-même .
C'est le seul cas où une requête renvoie une réponse valide. Toute route ne correspondant pas à un fichier statique renvoie une erreur de serveur 500 de nginx.
Cela me déconcerte au point d'en être sidéré.