Puncte:4

Ce este variabila nginx pentru un antet personalizat?

drapel cn

Un client trimite un antet HTTP personalizat X-ABC-LOGIN-NAME la proxy-ul meu invers Nginx. Pentru a fi sigur că sosește de fapt, a fost instalat un server PHP (fastcgi) și acest antet chiar apare (cu o valoare) în phpinfo(), secțiunea „Variabile PHP”.

Operez un backend Django cu un server gunicorn și în codul Django, imprim toate anteturile pe consolă. Când atribui o valoare statică lui X-ABC-LOGIN-NAME în /etc/nginx/sites-enabled/default, valoarea ajunge la backend. În nginx Mod implicit fișierul acesta arată astfel:

Server {
    asculta 443 ssl http2 default_server;
    asculta [::]:443 ssl http2 default_server;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # include snippets/self-signed.conf;
    # include snippets/ssl-params.conf;
    # server_name localhost;
    nume_server server_dev;

    underscores_in_headers activate;

    Locație / {
    
        proxy_pass http://localhost:8000;
        proxy_pass_request_headers activat;
    
        proxy_http_versiunea 1.1;
    
        proxy_set_header Actualizare $http_upgrade;
    
        proxy_set_header X-ABC-LOGIN-NAME „static_name”; # <-- „static_name” ajunge în instrucțiunea python print
        proxy_set_header X-ABC-LOGIN-NAME $http_x_abc_login_name; # <-- Această valoare este goală
    
        proxy_set_header Menținerea conexiunii;
        proxy_set_header Gazdă $gazdă;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;
    
    }

...
}

Am căutat exhaustiv pe internet și nu pot spune cum să găsesc numele variabilei care conține valoarea sau unde se pierde.


Editare: Adăugarea unei imagini pentru a clarifica problema: introduceți descrierea imaginii aici

Între un Browser (Client) și un Server se află un proxy (numit ABC). Acest proxy inserează un antet (X-ABC-LOGIN-NAME) în fiecare solicitare de la client către server. După introducerea antetului, solicitarea clientului este redirecționată către serverul proxy invers Nginx. De acolo nu pot redirecționa X-ABC-LOGIN-NAME introdus către serverul de aplicații gunicorn.


Editarea 2: nginx -T

ubuntu@xyz-ubuntu:~$ sudo nginx -T
nginx: sintaxa fișierului de configurare /etc/nginx/nginx.conf este ok
nginx: fișierul de configurare /etc/nginx/nginx.conf testul a reușit
# fișier de configurare /etc/nginx/nginx.conf:
utilizator www-date;
worker_proceses auto;
pid /run/nginx.pid;
includ /etc/nginx/modules-enabled/*.conf;

evenimente {
        conexiuni_muncitor 768;
        # multi_accept on;
}

http {

        underscores_in_headers activate;

        ##
        # Setări de bază
        ##

        sendfile activat;
        tcp_nopush activat;
        tcp_nodelay activat;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        includ /etc/nginx/mime.types;
        aplicație de tip_default/octet-stream;

        ##
        # Setări SSL
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Eliminarea SSLv3, ref: POODLE
        ssl_prefer_server_ciphers activat;

        ##
        # Setări de înregistrare
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;


        ##
        # Setări Gzip
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied orice;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Configurații gazdă virtuală
        ##

        includ /etc/nginx/conf.d/*.conf;
        includ /etc/nginx/sites-enabled/*;
}


#Poștă {
# # Vezi exemplu de script de autentificare la:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities „TOP” „USER”;
# # imap_capabilities „IMAP4rev1” „UIDPLUS”;
#
#       Server {
# asculta localhost:110;
# protocol pop3;
# proxy activat;
# }
#
#       Server {
# asculta localhost:143;
# protocol imap;
# proxy activat;
# }
#}

# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module modules/ngx_http_image_filter_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module modules/ngx_http_xslt_filter_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module modules/ngx_mail_module.so;

# fișier de configurare /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module modules/ngx_stream_module.so;

# fișier de configurare /etc/nginx/mime.types:

tipuri {
    text/html html htm shtml;
    text/css css;
    text/xml xml;
    imagine/gif gif;
    imagine/jpeg jpeg jpg;
    aplicație/javascript js;
    aplicație/atom+xml atom;
    aplicație/rss+xml rss;

    text/mathml mml;
    text/txt simplu;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml wml;
    text/x-component htc;

    imagine/png png;
    imagine/tiff tif tiff;
    imagine/vnd.wap.wbmp wbmp;
    imagine/x-icoană ico;
    imagine/x-jng jng;
    imagine/x-ms-bmp bmp;
    imagine/svg+xml svg svgz;
    imagine/webp webp;

    aplicație/font-woff woff;
    aplicație/java-arhivă jar war ear;
    aplicație/json json;
    aplicație/mac-binhex40 hqx;
    aplicație/msword doc;
    cerere/pdf pdf;
    aplicație/postscript ps eps ai;
    aplicație/rtf rtf;
    application/vnd.apple.mpegurl m3u8;
    application/vnd.ms-excel xls;
    application/vnd.ms-fontobject eot;
    application/vnd.ms-powerpoint ppt;
    application/vnd.wap.wmlc wmlc;
    application/vnd.google-earth.kml+xml kml;
    application/vnd.google-earth.kmz kmz;
    aplicație/x-7z-comprimat 7z;
    aplicare/x-cacao cco;
    application/x-java-archive-diff jardiff;
    aplicație/x-java-jnlp-fișier jnlp;
    aplicație/x-makeself rulează;
    application/x-perl pl pm;
    application/x-pilot prc pdb;
    application/x-rar-compressed rar;
    application/x-redhat-package-manager rpm;
    aplicare/x-mare mare;
    aplicație/x-shockwave-flash swf;
    application/x-stuffit sit;
    aplicație/x-tcl tcl tk;
    application/x-x509-ca-cert der pem crt;
    aplicație/x-xpinstall xpi;
    aplicație/xhtml+xml xhtml;
    aplicație/xspf+xml xspf;
    aplicare/zip zip;

    aplicație/octet-stream bin exe dll;
    application/octet-stream deb;
    application/octet-stream dmg;
    application/octet-stream iso img;
    aplicație/octet-stream msi msp msm;

    application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;

    audio/midi mid midi kar;
    audio/mpeg mp3;
    audio/ogg ogg;
    audio/x-m4a m4a;
    audio/x-realaudio ra;

    video/3gpp 3gpp 3gp;
    video/mp2t ts;
    video/mp4 mp4;
    video/mpeg mpeg mpg;
    video/quicktime mov;
    video/webm webm;
    video/x-flv flv;
    video/x-m4v m4v;
    video/x-mng mng;
    video/x-ms-asf asx asf;
    video/x-ms-wmv wmv;
    video/x-msvideo avi;
}

# fișier de configurare /etc/nginx/sites-enabled/default:


#
#
# Configurația implicită a serverului
#
Server {
    asculta 443 ssl http2 default_server;
    asculta [::]:443 ssl http2 default_server;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

    # include snippets/self-signed.conf;
    # include snippets/ssl-params.conf;
    # server_name localhost;
    nume_server xyz_server;

    underscores_in_headers activate;

    # Backend API REST
    locație ^~ /api {

        proxy_pass_request_headers activat;
    
        proxy_http_versiunea 1.1;
        proxy_set_header Actualizare $http_upgrade;

        add_header X-Abc-Login-Name $http_x_abc_login_name;

        proxy_set_header Menținerea conexiunii;
        proxy_set_header Gazdă $gazdă;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;

        proxy_pass http://localhost:8000;
    }

    # În față
    Locație / {

        proxy_pass_request_headers activat;

        proxy_http_versiunea 1.1;
        proxy_set_header Actualizare $http_upgrade;
 
        add_header X-Abc-Login-Name $http_x_abc_login_name;  

        proxy_set_header Menținerea conexiunii;
        proxy_set_header Gazdă $gazdă;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $schema;

        proxy_pass http://localhost:3000;

    }

    rădăcină /var/www/html;
    index index.php;
    locație ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }

}

Server {

    asculta 80; # default_server;

    rădăcină /var/www/html;

    index index.php
    nume_server php_server;

    locație ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    }
}

# fișier de configurare /etc/nginx/snippets/fastcgi-php.conf:
# regex pentru a împărți $uri în $fastcgi_script_name și $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# Verificați dacă scriptul PHP există înainte de a-l transmite
try_files $fastcgi_script_name =404;

# Ocoliți faptul că try_files resetează $fastcgi_path_info
# vezi: http://trac.nginx.org/nginx/ticket/321
setați $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
include fastcgi.conf;

# fișier de configurare /etc/nginx/fastcgi.conf:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $șir_interogare;
fastcgi_param REQUEST_METHOD $cerere_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $schemă;
fastcgi_param HTTPS $https dacă_nu_vide;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $adresă_la distanță;
fastcgi_param REMOTE_PORT $port_la distanță;
fastcgi_param SERVER_ADDR $adresa_server;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# Numai PHP, necesar dacă PHP a fost construit cu --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

Editarea 3:

Stânga: jurnalul aplicației, dreapta: Nginx ca rulează:

introduceți descrierea imaginii aici

djdomi avatar
drapel za
Răspunde asta la întrebarea ta? [Redirecționați antetul personalizat de la Nginx Reverse Proxy](https://serverfault.com/questions/391554/forward-custom-header-from-nginx-reverse-proxy)
drapel cn
Aș dori... Am găsit acea întrebare și am încercat să o fac așa cum este descris. Cu toate acestea (așa cum am scris în întrebarea mea), valoarea se pierde când se folosește `$http_x_abc_login_name` și nu am idei de ce ar putea fi acest lucru (având în vedere că phpinfo() care rulează în spatele aceluiași proxy invers primește valoarea).
djdomi avatar
drapel za
ați văzut `underscores_in_headers on;` și l-ați aplicat?
drapel cn
Absolut. Este setat în `server { underscores_in_headers on; ...}` secțiunea. Am adăugat acea secțiune la fișierul implicit nginx în postarea mea inițială cu întrebarea.
Michael Hampton avatar
drapel cz
Ceea ce ai postat ar fi trebuit să funcționeze bine de la început. Este timpul să privim puțin mai departe. Vă rugăm să postați rezultatul lui `nginx -T`
drapel cn
@MichaelHampton Am adăugat rezultatul. Este starea configurației după cea mai recentă sugestie a djdomi (folosind `add_header`).
Michael Hampton avatar
drapel cz
Ei bine, asta nu va funcționa. `add_header` adaugă un antet de răspuns. Schimbați-l înapoi la `proxy_set_header` în ambele locații.
drapel cn
Am revenit la `proxy_set_header`. După cum se arată în stânga, aplicația poate primi și imprima antetul „TEST” de stat. Totuși, nu este așa cu `http_x_hin_login_name`. Dar știu că este acolo pentru că phpinfo() îl vede în PHP Variables.
Michael Hampton avatar
drapel cz
Hmm, de ce încerci să treci acest antet în mod explicit? Oricum, toate ar trebui trimise la aplicația dvs. dacă nu faceți nimic, la fel ca toate celelalte.
drapel cn
Pot scrie o instrucțiune `if` care returnează un 412 ca acesta `if ($http_x_hin_login_name) { return 412; }` și primesc codul de stare 412. Dar nu primesc acest antet în aplicația mea.

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.