วิธีการทำซ้ำข้อมูล nginx ไปยังเซิร์ฟเวอร์สองเครื่องอย่างไร


14

ฉันพยายามจำลองทราฟฟิกที่เซิร์ฟเวอร์ nginx หนึ่งเซิร์ฟเวอร์ได้รับไปยังเซิร์ฟเวอร์สองเครื่อง เป้าหมายไม่ได้เป็นการโหลดบาลานซ์ แต่จะเล่นอินพุตเดียวกันซ้ำบนเซิร์ฟเวอร์ nginx ทั้งหมด

ตัวอย่าง: Nginx รับ HTTP POST ฉันต้องการส่ง POST เดียวกันนี้ไปยังเซิร์ฟเวอร์อื่น

** อัพเดท **

สถานการณ์เป็นเรื่องง่ายและไม่ซับซ้อน ฉันแค่ต้องส่งข้อมูล POST (หรือ GET หรือข้อมูลการร้องขอใด ๆ ) ไปยังเซิร์ฟเวอร์ IP อื่น (มันยังทำงานอินสแตนซ์ nginx) แค่นี้แหละ

USER -> POST DATA -> NGINX INSTANCE ---- REDIRECT ---> เซิร์ฟเวอร์ 1 และเซิร์ฟเวอร์ 2


1
คุณสามารถขยายสถาปัตยกรรมของคุณได้หรือไม่? อีกสองเซิร์ฟเวอร์คืออะไร มีฐานข้อมูลที่ใช้ร่วมกันระบบไฟล์ที่ใช้ร่วมกันเป็นต้น? POST เขียนไปยัง DB ไปยังระบบไฟล์หรือไม่ จริงๆแล้วคุณพยายามทำอะไรที่ไม่สามารถทำได้ด้วยระบบไฟล์แบบคลัสเตอร์และอินสแตนซ์ฐานข้อมูล
cjc

ฉัน rephrased คุณคำถามเพื่อสะท้อนสิ่งที่คุณดูเหมือนจะถามอย่างแม่นยำมากขึ้น
gWaldo

1
พฤติกรรมประเภทนี้บางครั้งใช้ในการทดสอบ A / B
gWaldo

2
นั่นไม่ใช่วิธีที่จะไปคุณกำลังทำลาย HTTP, w3.org/Protocols/rfc2616/rfc2616.html
Daniel Prata Almeida

ฉันเคยเห็นสิ่งประเภทนี้ถามก่อน ฉันคิดว่าสิ่งที่คุณต้องการค้นหาสามารถค้นหาเป็น "http replay"
gWaldo

คำตอบ:


10

ฉันสามารถทำซ้ำโดยใช้สถานะ post_action

upstream main_upstream {
least_conn;
server 192.168.9.10:80;
keepalive 1024;
}

server {
listen 80;
server_name _;
client_body_buffer_size 1512k;
client_max_body_size 10m;

location /1/ {
fastcgi_pass main_upstream;
post_action @replayevent ;

}
# Send the post_action request to a FastCGI backend for logging.
location @replayevent {
fastcgi_pass 192.168.9.14:80;
}

ตอนนี้มันส่งข้อมูลสองเซิร์ฟเวอร์

หากอัปสตรีมของคุณไม่รองรับ fastcgi (เกิดขึ้นในกรณีของฉัน) ให้แทนที่ด้วย proxy_pass


4

ฉันไม่เชื่อว่าคุณสามารถทำได้ด้วย nginx ด้วยตัวเอง การอ่านอย่างรวดเร็วของบิตที่เกี่ยวข้องของเอกสาร nginx (คำสั่งต้นน้ำและพร็อกซี) ไม่แนะนำให้คุณทำได้ ดังที่ได้กล่าวไว้ในความคิดเห็นสิ่งนี้ยังทำลาย HTTP เนื่องจากไม่มีความชัดเจนว่าเซิร์ฟเวอร์ด้านหลังใดจะตอบสนอง

ทางเลือกหนึ่งคือใช้สิ่งที่เคลือบเงาและเล่นซ้ำกับเซิร์ฟเวอร์ด้านหลังตัวที่สองโดยใช้ varnishreplay:

https://www.varnish-cache.org/docs/2.1/reference/varnishreplay.html

ฉันไม่ได้ใช้มันดังนั้นฉันไม่รู้ว่าคุณสามารถทำให้มันเล่นซ้ำทราฟฟิกได้พร้อม ๆ กับเซิร์ฟเวอร์ด้านหลังตัวแรก


3

สิ่งที่คุณต้องการใช้คือ EM-Proxy [1] มันจัดการการร้องขอ http แยกอย่างง่ายดายในจำนวนเซิร์ฟเวอร์ใด ๆ นอกจากนี้ยังจัดการกับการส่งคืนข้อมูลจากเซิร์ฟเวอร์สดเท่านั้นและบล็อกผู้อื่นดังนั้นผู้ใช้จึงไม่ได้รับการตอบกลับหลายครั้ง

[1] https://github.com/igrigorik/em-proxy/


2

ใช้ที่จัดเก็บข้อมูลกลางเช่นเซิร์ฟเวอร์ NFS และแต่ละเว็บ nginx ติดตั้ง NFS ที่ใช้ร่วมกัน (ระดับไฟล์) หรือใช้ระบบไฟล์คลัสเตอร์เช่น OCFS2 และแต่ละเว็บโหนดจะเมานต์ LUN / พาร์ติชัน (ระดับบล็อก)


คำขอ POST ไม่จำเป็นต้องเขียนสิ่งต่าง ๆ ลงในระบบไฟล์ เราต้องการความกระจ่างเกี่ยวกับสถาปัตยกรรมของ OP
cjc

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