nginx proxy_pass เขียนตำแหน่งการตอบกลับอีกครั้ง


11

จุดประสงค์ของอินสแตนซ์ nginx นี้คือการรับ GitLab และ OpenWRT Luci เพื่อเปลี่ยนเส้นทางผ่านพร็อกซีย้อนกลับ มันใช้งานได้แล้วสำหรับเว็บไซต์อื่น ๆ หลายแห่งซึ่งทั้งหมดมี url พื้นฐานซึ่งดูเหมือนจะตอบโต้ปัญหานี้

  • GitLab ในตัวอย่างนี้อยู่บนโลคัลเซิร์ฟเวอร์ที่พอร์ต 9000
  • เว็บไซต์ nginx อยู่ที่พอร์ต 8080
  • OpenWRT มีปัญหาเดียวกัน แต่มี / cgi-bin / luci /

การกำหนดค่า nginx ที่เกี่ยวข้องสำหรับตำแหน่งตัวอย่างคือ

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect default;
}
  • โปรดทราบว่าผลลัพธ์จะเหมือนกันทั้งที่มีและไม่มีเครื่องหมายทับ

มีตัวเลือกการกำหนดค่าพร็อกซีส่วนหัวบางส่วนที่ใช้กับตำแหน่งนี้

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Basic Proxy Config
proxy_set_header    Host $host:$server_port;
proxy_set_header    Origin $scheme://$host:$server_port;    
proxy_set_header    Connection $http_connection;
proxy_set_header    Cookie $http_cookie;
proxy_set_header    Upgrade $http_upgrade;
proxy_set_header    X-Forwarded-Protocol $scheme;
proxy_set_header    X-Scheme $scheme;
proxy_set_header    X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header    X-Forwarded-Ssl on;
proxy_set_header    X-Frame-Options SAMEORIGIN;

# Advanced Proxy Config
send_timeout            5m;
proxy_read_timeout      300;
proxy_send_timeout      300;
proxy_connect_timeout   300;

proxy_buffers 32 4k;
proxy_buffer_size           4k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;

proxy_http_version 1.1;
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;]
  • การแสดงความคิดเห็น #proxy_set_header Host แทนการเปลี่ยนเส้นทางเบราว์เซอร์ไป https://127.0.0.1:9000/users/sign_in

เมื่อเรียกดูhttps://website.com:8080/gitlab/;

GET /gitlab/ HTTP/1.1
Host: website.com:8080

การตอบกลับไม่ถูกต้องกลับไป/users/sign_inเป็นแทนที่จะ/gitlab/users/sign_in

HTTP/1.1 302 Found
Cache-Control: no-cache
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Location: https://website.com:8080/users/sign_in

การเรียกดูด้วยตนเองเพื่อhttps: // เว็บไซต์: 8080 / gitlab / users / sign_inโหลดหน้าเว็บ แต่ไม่มีเนื้อหาใด ๆ ตกอยู่จนกว่าจะมีปัญหาเดียวกับที่กล่าวมาข้างต้น

เนื้อหา GitLab ล้มเหลว

การอ่านเอกสาร nginxแสดงว่าพฤติกรรมพร็อกซีเริ่มต้นควรจัดการกับสถานการณ์นี้แม้ว่าจะดูเหมือนว่าจะล้มเหลว

บันทึกดูเหมือนจะไม่แสดงมากนัก

ควรดำเนินการขั้นตอนใดเพิ่มเติมเพื่อช่วยในการวิเคราะห์สาเหตุที่อาจเกิดขึ้น

คำตอบ:


3

เพิ่มเครื่องหมายสแลชต่อท้ายproxy_passเป้าหมายของคุณ

ปรับปรุง:สหกรณ์ไม่ได้แม่นยำ vhost httpsถูกยอมรับ เนื่องจากโครงร่างถูกส่งต่อไปยังเซิร์ฟเวอร์เบื้องหลังที่มีส่วนหัวเพิ่มเติมดังนั้นจึงเกิดปัญหาตั้งแต่proxy_redirect default;สั่งซื้อ nginx เพื่อคาดหวังรูปแบบ http โดยค่าเริ่มต้นเมื่อเขียนLocationส่วนหัวในการตอบกลับอัปสตรีมแทนที่จะเป็น https

ดังนั้นสิ่งนี้จะต้องเปลี่ยนอย่างชัดเจนเป็นรูปแบบทั่วไปมากขึ้น (สแลชต่อท้ายยังคงจำเป็น):

location /gitlab/ {
    proxy_pass http://127.0.0.1:9000/;
    proxy_redirect $scheme://$host:$server_port/ /gitlab/;
}

สวัสดีซาเวียร์ขอบคุณสำหรับการตอบกลับ ไม่มีโชค นั่นเป็นหนึ่งในสิ่งที่ฉันได้ลอง (จับคู่ proxy_pass docs) แต่ไม่มีการเปลี่ยนแปลง :(
Jake Edwards

ฉันได้เพิ่มข้อมูลเกี่ยวกับ proxy_set_header ที่อยู่ในความเชื่อมั่นอื่น การลบบรรทัดโฮสต์จะเปลี่ยนสิ่งต่าง ๆ - เปลี่ยนเส้นทางไปที่127.0.0.1:9000/users/sign_in
Jake Edwards

ตกลงดังนั้นปัญหาคือscheme(https) ที่มีproxy_redirect default พฤติกรรมซึ่งคาดว่า http ให้การกำหนดค่าที่มันเป็นก่อนที่จะแสดงความคิดเห็นออกส่วนหัวของโฮสต์และการเปลี่ยนแปลงเนื้อหาproxy_redirect $scheme://$host:$server_port/ /gitlab/;ตรวจสอบให้แน่ใจว่าคุณไม่ได้กดปุ่มส่วนหัวแคชของเบราว์เซอร์ (ใช้เครื่องมือ cli หรือการนำทางส่วนตัว) เมื่อทำการทดสอบ
Xavier Lucas

โอเคเจ๋งแล้วตอนนี้มุ่งไปที่ URL ที่ถูกต้อง (อย่างน้อย GitLab ทำ OpenWRT ยังคงไปที่ / cgi-bin / luci - ทีละครั้ง) ยังไม่มีสินทรัพย์ / ภาพ / ฯลฯ -: 8080 / assets / application-5ec1aeb4604cbfbeff836f956308b0ed.js แทน: 8080 / gitlab / สินทรัพย์ / application-5ec1aeb4604cbfbeff836f956308b0ed.js
Jake Edwards

1
@ShadowXVII แอปพลิเคชันของคุณสร้างขึ้นโดยลิงค์คุณต้องเปลี่ยนมัน Nginx จะเขียนการเปลี่ยนเส้นทางที่ออกโดยแอปของคุณเท่านั้นไม่ใช่เนื้อหาของหน้า
ซาเวียร์ลูคัส

0

สิ่งที่ @XavierLucas พูดถูกต้องข้อมูลสำรองควรจัดการกับลิงก์ เอกสาร gitlab มีคู่มือภายใต้หัวข้อการติดตั้ง GitLab ภายใต้ URL ที่เกี่ยวข้อง ฉันพบปัญหานี้เมื่อเร็ว ๆ นี้ขณะติดตั้งเซิร์ฟเวอร์ arch linux ที่ติดตั้ง gitlab และ nginx และแก้ไขปัญหาของฉันด้วยการคอมไพล์สินทรัพย์ทั้งหมดใหม่เพื่อให้มีเส้นทางที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.