আমি প্রচুর সংখ্যক ব্যাকএন্ড সার্ভার সহ বিপরীত প্রক্সি হিসাবে এনগিনেক্স সেট আপ করার চেষ্টা করছি। আমি অন-ডিমান্ডে (প্রথম অনুরোধটি আসবে) ব্যাকেন্ডগুলি শুরু করতে চাই, সুতরাং আমার কাছে একটি নিয়ন্ত্রণ প্রক্রিয়া রয়েছে (এইচটিটিপি অনুরোধ দ্বারা নিয়ন্ত্রিত) যা অনুরোধটি পেয়েছে তার উপর নির্ভর করে ব্যাকএন্ড শুরু হয়।
আমার সমস্যা এটি করার জন্য এনগিনেক্স কনফিগার করছে। আমার এখন পর্যন্ত যা আছে তা এখানে:
server {
listen 80;
server_name $DOMAINS;
location / {
# redirect to named location
#error_page 418 = @backend;
#return 418; # doesn't work - error_page doesn't work after redirect
try_files /nonexisting-file @backend;
}
location @backend {
proxy_pass http://$BACKEND-IP;
error_page 502 @handle_502; # Backend server down? Try to start it
}
location @handle_502 { # What to do when the backend server is not up
# Ping our control server to start the backend
proxy_pass http://127.0.0.1:82;
# Look at the status codes returned from control server
proxy_intercept_errors on;
# Fallback to error page if control server is down
error_page 502 /fatal_error.html;
# Fallback to error page if control server ran into an error
error_page 503 /fatal_error.html;
# Control server started backend successfully, retry the backend
# Let's use HTTP 451 to communicate a successful backend startup
error_page 451 @backend;
}
location = /fatal_error.html {
# Error page shown when control server is down too
root /home/nginx/www;
internal;
}
}
এটি কাজ করে না - nginx নিয়ন্ত্রণ সার্ভার থেকে ফিরে আসা কোনও স্থিতি কোডগুলি উপেক্ষা করে বলে মনে হচ্ছে। অবস্থানের কোনও error_page
নির্দেশিকা @handle_502
কাজ করে না এবং 451 কোডটি ক্লায়েন্টকে যেমন পাঠানো হয় তেমন।
আমি এটির জন্য অভ্যন্তরীণ এনজিনেক্স পুনর্নির্দেশটি ব্যবহার করার চেষ্টা ছেড়ে দিয়েছি এবং একই জায়গায় 307 পুনর্নির্দেশের জন্য কন্ট্রোল সার্ভারকে সংশোধন করার চেষ্টা করেছি (যাতে ক্লায়েন্ট একই অনুরোধটি আবার চেষ্টা করবে তবে এখন ব্যাকএন্ড সার্ভার শুরু হয়ে যাবে)। যাইহোক, এখন nginx ব্যাক-এন্ড অনুরোধ প্রচেষ্টা (502) থেকে প্রাপ্ত একটিটির সাথে স্ট্যাটাস কোডটি বোকামি দিয়ে ওভাররাইট করছে, তবুও নিয়ন্ত্রণ সার্ভার "অবস্থান" শিরোনাম প্রেরণ করছে। আমি অবশেষে ত্রুটি_পৃষ্ঠা রেখায় পরিবর্তন করে এটি "কাজ করে" পেয়েছিerror_page 502 =307 @handle_502;
, এইভাবে সমস্ত কন্ট্রোল সার্ভারের জবাবগুলি ক্লায়েন্টকে 307 কোড দিয়ে ফেরত পাঠাতে বাধ্য করে। এটি অত্যন্ত হ্যাকি এবং অবাঞ্ছিত, কারণ 1) কন্ট্রোল সার্ভারের প্রতিক্রিয়ার উপর নির্ভর করে এনজিনেক্সের পরবর্তী কী করা উচিত তার উপর কোনও নিয়ন্ত্রণ নেই (আদর্শভাবে আমরা কেবল নিয়ন্ত্রণ সার্ভারের সাফল্যের খবর জানালে কেবল ব্যাকএন্ডে আবার চেষ্টা করতে চাই), এবং ২) সমস্ত এইচটিটিপি নয় ক্লায়েন্টরা HTTP পুনঃনির্দেশগুলি সমর্থন করে (যেমন কার্ল ব্যবহারকারী এবং libcurl- ব্যবহার অ্যাপ্লিকেশনগুলি নিম্নলিখিত পুনঃনির্দেশগুলি স্পষ্টভাবে সক্ষম করার প্রয়োজন)।
প্রবাহের সার্ভার এ, তারপরে বি, তারপরে বি, তারপরে আবার (আদর্শভাবে, কেবল যখন বি নির্দিষ্ট স্থিতির কোড ফেরায়) প্রিন্সি করার চেষ্টা করার জন্য এনগিনেক্স পাওয়ার উপযুক্ত উপায় কী?
proxy_next_upstream
কৌতুকটি করেছেন (ভাল আমার পরিস্থিতি আপনার মতো জটিল ছিল না), আমি কেবলমাত্র এনগিনেক্সটি চেয়েছিলাম পরবর্তী কোনও সার্ভার চেষ্টা করে যদি কোনও ত্রুটি ঘটে তবে এইভাবে আমাকে যুক্ত করতে হয়েছিলproxy_next_upstream error timeout invalid_header non_idempotent;
(non_idempotent
, কারণ আমিPOST
অনুরোধগুলি মূলত ফরওয়ার্ড করতে চাই )।