Score:4

ตัวแปร nginx สำหรับส่วนหัวที่กำหนดเองคืออะไร

ธง cn

ลูกค้ากำลังส่งส่วนหัว HTTP ที่กำหนดเอง X-ABC-ชื่อเข้าสู่ระบบ ไปยังพร็อกซีย้อนกลับ Nginx ของฉัน เพื่อให้แน่ใจว่ามาถึงจริง เซิร์ฟเวอร์ PHP (fastcgi) ได้รับการติดตั้งและส่วนหัวนี้แสดงขึ้นจริง ๆ (พร้อมค่า) ใน phpinfo(), ส่วน 'ตัวแปร PHP'

ฉันใช้งานแบ็กเอนด์ Django ด้วยเซิร์ฟเวอร์ gunicorn และในโค้ด Django ฉันพิมพ์ส่วนหัวทั้งหมดไปยังคอนโซล เมื่อฉันกำหนดค่าคงที่ให้กับ X-ABC-ชื่อเข้าสู่ระบบ ใน /etc/nginx/sites-enabled/default ค่าจะมาถึงแบ็กเอนด์ ใน nginx ค่าเริ่มต้น ไฟล์นี้มีลักษณะดังนี้:

เซิร์ฟเวอร์ {
    ฟัง 443 ssl http2 default_server;
    ฟัง [::]: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;

    # รวมตัวอย่าง / self-signed.conf;
    # รวมตัวอย่าง/ssl-params.conf;
    # server_name localhost;
    server_name dev_server;

    underscores_in_headers บน;

    ที่ตั้ง / {
    
        proxy_pass http://localhost:8000;
        เปิด proxy_pass_request_headers;
    
        proxy_http_version 1.1;
    
        proxy_set_header อัพเกรด $http_upgrade;
    
        proxy_set_header X-ABC-LOGIN-NAME "static_name"; # <-- "static_name" มาถึงคำสั่งพิมพ์หลาม
        proxy_set_header X-ABC-LOGIN-NAME $http_x_abc_login_name; # <-- ค่านี้ว่างเปล่า
    
        proxy_set_header การเชื่อมต่อคงอยู่;
        proxy_set_header โฮสต์ $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    
    }

...
}

ฉันค้นหาทางอินเทอร์เน็ตอย่างถี่ถ้วนและไม่สามารถบอกได้ว่าจะหาชื่อของตัวแปรที่มีค่าหรือที่ใดที่สูญหายไปได้อย่างไร


แก้ไข: เพิ่มรูปภาพเพื่อชี้แจงปัญหา: ป้อนคำอธิบายรูปภาพที่นี่

ระหว่างเบราว์เซอร์ (ไคลเอนต์) และเซิร์ฟเวอร์มีพร็อกซี (เรียกว่า ABC) พร็อกซีนี้แทรกส่วนหัว (X-ABC-LOGIN-NAME) ในทุกคำขอจากไคลเอนต์ไปยังเซิร์ฟเวอร์ หลังจากใส่ส่วนหัวแล้ว คำขอโดยไคลเอนต์จะถูกส่งต่อไปยังเซิร์ฟเวอร์พร็อกซีย้อนกลับของ Nginx จากนั้นฉันไม่สามารถส่งต่อ X-ABC-LOGIN-NAME ที่แทรกไปยังเซิร์ฟเวอร์แอปพลิเคชัน gunicorn


แก้ไข 2: nginx -T

ubuntu@xyz-ubuntu:~$ sudo nginx -T
nginx: ไฟล์การกำหนดค่า /etc/nginx/nginx.conf ไวยากรณ์ใช้ได้
nginx: การทดสอบไฟล์การกำหนดค่า /etc/nginx/nginx.conf สำเร็จ
# ไฟล์กำหนดค่า /etc/nginx/nginx.conf:
ผู้ใช้ www-data;
worker_processes อัตโนมัติ
pid /run/nginx.pid;
รวม /etc/nginx/modules-enabled/*.conf;

เหตุการณ์ {
        worker_connections 768;
        # multi_accept บน;
}

http {

        underscores_in_headers บน;

        ##
        # การตั้งค่าพื้นฐาน
        ##

        ส่งไฟล์บน;
        tcp_nopush บน;
        tcp_nodelay บน;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # ปิด server_tokens;

        server_names_hash_bucket_size 64;
        # server_name_in_redirect ปิด;

        รวม /etc/nginx/mime.types;
        แอปพลิเคชัน default_type/octet-stream;

        ##
        # การตั้งค่า SSL
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # วาง SSLv3 อ้างอิง: พุดเดิ้ล
        เปิด ssl_prefer_server_ciphers;

        ##
        # การตั้งค่าการบันทึก
        ##

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


        ##
        # การตั้งค่า Gzip
        ##

        เปิด gzip;

        # gzip_vary บน;
        # gzip_proxyed ใด ๆ ;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types ข้อความ/ข้อความล้วน/แอปพลิเคชัน css/แอปพลิเคชัน json/ข้อความจาวาสคริปต์/แอปพลิเคชัน xml/แอปพลิเคชัน xml/xml+rss ข้อความ/จาวาสคริปต์;

        ##
        # การกำหนดค่าโฮสต์เสมือน
        ##

        รวม /etc/nginx/conf.d/*.conf;
        รวม /etc/nginx/sites-enabled/*;
}


#จดหมาย {
# # ดูตัวอย่างสคริปต์การตรวจสอบได้ที่:
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
# # auth_http localhost/auth.php;
# # pop3_capabilities "TOP" "ผู้ใช้";
# # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
# เซิร์ฟเวอร์ {
# ฟัง localhost:110;
#โปรโตคอลpop3;
# เปิดพร็อกซี;
# }
#
# เซิร์ฟเวอร์ {
# ฟัง localhost:143;
# โปรโตคอล imap;
# เปิดพร็อกซี;
# }
#}

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-http-image-filter.conf:
load_module โมดูล/ngx_http_image_filter_module.so;

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-http-xslt-filter.conf:
load_module โมดูล/ngx_http_xslt_filter_module.so;

# ไฟล์กำหนดค่า /etc/nginx/modules-enabled/50-mod-mail.conf:
load_module โมดูล/ngx_mail_module.so;

# ไฟล์การกำหนดค่า /etc/nginx/modules-enabled/50-mod-stream.conf:
load_module โมดูล/ngx_stream_module.so;

# ไฟล์กำหนดค่า /etc/nginx/mime.types:

ประเภท {
    ข้อความ/html html htm shtml;
    ข้อความ/css css;
    ข้อความ/xml xml;
    รูปภาพ/gif gif;
    รูปภาพ/jpeg jpeg jpg;
    แอปพลิเคชัน/จาวาสคริปต์ js;
    แอ็พพลิเคชัน/atom+xml อะตอม;
    แอปพลิเคชัน/rss+xml rss;

    ข้อความ/mathml mml;
    ข้อความ/ธรรมดา txt;
    text/vnd.sun.j2me.app-descriptor jad;
    ข้อความ/vnd.wap.wml wml;
    ข้อความ/x-คอมโพเนนต์ htc;

    รูปภาพ/png png;
    รูปภาพ/tiff tif tiff;
    ภาพ/vnd.wap.wbmp wbmp;
    ไอคอนรูปภาพ/x-icon;
    ภาพ/x-jng jng;
    ภาพ/x-ms-bmp bmp;
    ภาพ/svg+xml svg svgz;
    รูปภาพ/เว็บเพจ เว็บเพจ;

    แอปพลิเคชัน/ฟอนต์-woff woff;
    แอปพลิเคชัน / java-archive jar war ear;
    แอปพลิเคชัน/json json;
    แอปพลิเคชัน/mac-binhex40 hqx;
    เอกสารแอปพลิเคชัน/msword;
    ใบสมัคร/pdf pdf;
    ใบสมัคร/postscript ps eps ai;
    แอปพลิเคชัน/rtf rtf;
    แอปพลิเคชัน/vnd.apple.mpegurl m3u8;
    แอปพลิเคชัน/vnd.ms-excel xls;
    application/vnd.ms-fontobject eot;
    แอปพลิเคชัน/vnd.ms-powerpoint ppt;
    แอปพลิเคชัน/vnd.wap.wmlc wmlc;
    application/vnd.google-earth.kml+xml kml;
    แอปพลิเคชัน/vnd.google-earth.kmz kmz;
    แอปพลิเคชัน/x-7z-บีบอัด 7z;
    ใบสมัคร/x-cocoa cco;
    แอปพลิเคชัน/x-java-archive-diff jardiff;
    แอปพลิเคชัน/x-java-jnlp-file jnlp;
    เรียกใช้แอปพลิเคชัน / x-makeself;
    แอปพลิเคชัน/x-perl pl pm;
    แอปพลิเคชัน/x-pilot prc pdb;
    แอปพลิเคชั่น/x-rar-บีบอัด rar;
    แอปพลิเคชั่น / x-redhat-package-manager รอบต่อนาที;
    ใบสมัคร / ทะเล x-sea;
    แอปพลิเคชั่น/x-shockwave-แฟลช swf;
    แอปพลิเคชั่น / นั่ง x-stuffit;
    ใบสมัคร/x-tcl tcl tk;
    ใบสมัคร/x-x509-ca-cert จาก pem crt;
    แอปพลิเคชัน/x-xpinstall xpi;
    แอปพลิเคชัน/xhtml+xml xhtml;
    แอปพลิเคชัน/xspf+xml xspf;
    แอปพลิเคชั่น / ซิปซิป;

    แอปพลิเคชัน / octet-stream bin exe dll;
    แอ็พพลิเคชัน/octet-stream deb;
    แอปพลิเคชัน/octet-stream dmg;
    แอปพลิเคชั่น/octet-stream iso img;
    แอปพลิเคชัน/ออคเต็ตสตรีม msi msp msm;

    แอปพลิเคชัน/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
    แอปพลิเคชัน/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
    แอปพลิเคชัน/vnd.openxmlformats-officedocument.presentationml.การนำเสนอ pptx;

    เสียง/midi กลาง midi kar;
    เสียง/mpeg mp3;
    เสียง/ogg ogg;
    เสียง/x-m4a m4a;
    เสียง/x-realaudio ra;

    วิดีโอ/3gpp 3gpp 3gp;
    วิดีโอ/mp2t ts;
    วิดีโอ/mp4 mp4;
    วิดีโอ/mpeg mpeg mpg;
    วิดีโอ/quicktime mov;
    วิดีโอ/เว็บเอ็ม เว็บเอ็ม;
    วิดีโอ/x-flv flv;
    วิดีโอ/x-m4v m4v;
    วิดีโอ/x-mng mng;
    วิดีโอ/x-ms-asf asx asf;
    วิดีโอ/x-ms-wmv wmv;
    วิดีโอ/x-msvideo avi;
}

# ไฟล์กำหนดค่า /etc/nginx/sites-enabled/default:


#
#
# การกำหนดค่าเซิร์ฟเวอร์เริ่มต้น
#
เซิร์ฟเวอร์ {
    ฟัง 443 ssl http2 default_server;
    ฟัง [::]: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;

    # รวมตัวอย่าง / self-signed.conf;
    # รวมตัวอย่าง/ssl-params.conf;
    # server_name localhost;
    server_name xyz_server;

    underscores_in_headers บน;

    # แบ็กเอนด์ REST API
    ที่ตั้ง ^~ /api {

        เปิด proxy_pass_request_headers;
    
        proxy_http_version 1.1;
        proxy_set_header อัพเกรด $http_upgrade;

        add_header X-Abc-ชื่อล็อกอิน $http_x_abc_login_name;

        proxy_set_header การเชื่อมต่อคงอยู่;
        proxy_set_header โฮสต์ $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://localhost:8000;
    }

    #ส่วนหน้า
    ที่ตั้ง / {

        เปิด proxy_pass_request_headers;

        proxy_http_version 1.1;
        proxy_set_header อัพเกรด $http_upgrade;
 
        add_header X-Abc-ชื่อล็อกอิน $http_x_abc_login_name;  

        proxy_set_header การเชื่อมต่อคงอยู่;
        proxy_set_header โฮสต์ $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-ส่งต่อ-สำหรับ $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_pass http://localhost:3000;

    }

    รูท /var/www/html;
    ดัชนี index.php;
    ตำแหน่ง ~ \.php$ {
        รวมตัวอย่าง/fastcgi-php.conf;
        fastcgi_pass ยูนิกซ์:/run/php/php7.4-fpm.sock;
    }

}

เซิร์ฟเวอร์ {

    ฟัง 80; #default_server;

    รูท /var/www/html;

    ดัชนี index.php
    server_name php_server;

    ตำแหน่ง ~ \.php$ {
        รวมตัวอย่าง/fastcgi-php.conf;
        fastcgi_pass ยูนิกซ์:/run/php/php7.4-fpm.sock;
    }
}

# ไฟล์กำหนดค่า /etc/nginx/snippets/fastcgi-php.conf:
# regex เพื่อแบ่ง $uri เป็น $fastcgi_script_name และ $fastcgi_path
fastcgi_split_path_info ^(.+?\.php)(/.*)$;

# ตรวจสอบว่ามีสคริปต์ PHP อยู่ก่อนที่จะส่งต่อ
try_files $fastcgi_script_name =404;

# ข้ามความจริงที่ว่า try_files รีเซ็ต $fastcgi_path_info
# ดู: http://trac.nginx.org/nginx/ticket/321
ตั้ง $path_info $fastcgi_path_info;
fastcgi_param PATH_INFO $path_info;

fastcgi_index index.php;
รวมถึง fastcgi.conf;

# ไฟล์กำหนดค่า /etc/nginx/fastcgi.conf:

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_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 โครงการ $;
fastcgi_param HTTPS $https if_not_empty;

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

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP เท่านั้น จำเป็นหากสร้าง PHP ด้วย --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

แก้ไข 3:

ซ้าย: บันทึกแอปพลิเคชัน ขวา: Nginx ขณะทำงาน:

ป้อนคำอธิบายรูปภาพที่นี่

djdomi avatar
za flag
สิ่งนี้ตอบคำถามของคุณหรือไม่ [ส่งต่อส่วนหัวที่กำหนดเองจาก Nginx Reverse Proxy](https://serverfault.com/questions/391554/forward-custom-header-from-nginx-reverse-proxy)
cn flag
ฉันหวังว่า.. ฉันพบคำถามนั้นและพยายามทำตามที่อธิบายไว้ อย่างไรก็ตาม (ตามที่ฉันเขียนไว้ในคำถามของฉัน) ค่าจะหายไปเมื่อใช้ `$http_x_abc_login_name` และฉันก็ไม่เข้าใจว่าทำไมถึงเป็นเช่นนั้น (เนื่องจาก phpinfo() ที่ทำงานอยู่เบื้องหลัง reverse proxy เดียวกันได้รับค่านั้น)
djdomi avatar
za flag
คุณเห็น `ขีดล่าง_in_headers บน;' และนำไปใช้หรือไม่
cn flag
อย่างแน่นอน. มันถูกตั้งค่าใน `เซิร์ฟเวอร์ { underscores_in_headers on; ...}` ส่วน เพิ่มส่วนนั้นลงในไฟล์เริ่มต้น nginx ในโพสต์คำถามเดิมของฉัน
Michael Hampton avatar
cz flag
สิ่งที่คุณโพสต์ควรใช้งานได้ดีตั้งแต่ต้น ถึงเวลาที่ต้องมองให้ไกลออกไปสักหน่อย โปรดโพสต์ผลลัพธ์ของ `nginx -T`
cn flag
@MichaelHampton ฉันเพิ่มผลลัพธ์ เป็นสถานะของการกำหนดค่าหลังจากคำแนะนำล่าสุดโดย djdomi (โดยใช้ `add_header`)
Michael Hampton avatar
cz flag
นั่นไม่ได้ผล `add_header` เพิ่มส่วนหัวการตอบกลับ เปลี่ยนกลับเป็น `proxy_set_header` ในทั้งสองตำแหน่ง
cn flag
ฉันเปลี่ยนกลับเป็น `proxy_set_header` ดังที่แสดงทางด้านซ้าย แอปพลิเคชันสามารถรับและพิมพ์ส่วนหัว statit "TEST" ไม่เป็นเช่นนั้นกับ `http_x_hin_login_name` แต่ฉันรู้ว่ามันอยู่ที่นั่นเพราะ phpinfo() เห็นมันในตัวแปร PHP
Michael Hampton avatar
cz flag
อืม แล้วทำไมคุณถึงพยายามส่งส่วนหัวนี้อย่างโจ่งแจ้ง พวกเขาทั้งหมดควรถูกส่งไปยังแอปของคุณหากคุณไม่ทำอะไรเลย เช่นเดียวกับที่คนอื่นๆ ทำ
cn flag
ฉันสามารถเขียนคำสั่ง `if` ที่คืนค่า 412 แบบนี้ `if ($http_x_hin_login_name) { return 412; }` และฉันได้รับรหัสสถานะ 412 แต่ฉันไม่ได้รับส่วนหัวนี้ในแอปของฉัน

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา