proxy-chain: প্রতিটি লিসেনারের জন্য আলাদা অ্যাকাউন্ট ও আপস্ট্রিম
prepareRequestFunction-এর মাধ্যমে লিসেনার-নির্দিষ্ট Basic অ্যাকাউন্ট ও আপস্ট্রিম রুটসহ proxy-chain Server ইনস্ট্যান্স তৈরি করুন।
proxy-chain প্রতিটি লিসেনিং পোর্টের জন্য একটি Server ইনস্ট্যান্স চালাতে পারে। সেই লিসেনারের নীতি তার প্রমাণীকরণ কলব্যাকে ধরে রাখুন:
import { Server } from 'proxy-chain';
const listeners = [
{ port: 8001, user: userA, password: passwordA, upstream: upstreamA },
{ port: 8002, user: userB, password: passwordB, upstream: upstreamB },
];
const servers = listeners.map(rule => new Server({
host: '127.0.0.1',
port: rule.port,
prepareRequestFunction: ({ username, password }) => ({
requestAuthentication:
username !== rule.user || password !== rule.password,
upstreamProxyUrl: rule.upstream,
}),
}));
await Promise.all(servers.map(server => server.listen()));
অ্যাপ্লিকেশন তার স্বাভাবিক কনফিগারেশনের মাধ্যমে অ্যাকাউন্টের মান ও আপস্ট্রিম URL সরবরাহ করে। প্রতিটি কলব্যাক নিজের নিয়ম ধরে রাখে, তাই 8001 পোর্টে অ্যাকাউন্টটি গ্রহণ করা 8002 পোর্টে সেই অ্যাকাউন্ট গ্রহণ করে না।
requestAuthentication true একটি Basic প্রক্সি চ্যালেঞ্জ ফেরত দেয়। প্রমাণীকরণ প্রয়োজন হলে সেই অনুরোধের জন্য upstreamProxyUrl উপেক্ষা করা হয়। সফল আগত অ্যাকাউন্ট ও আপস্ট্রিম অ্যাকাউন্ট আলাদা পরিচয়।
প্রতিটি আপস্ট্রিমের জন্য সমর্থিত URL ব্যবহার করুন, প্রয়োজনে সঠিকভাবে এনকোড করা শংসাপত্র সহ। প্রমাণীকরণহীন পাবলিক HTTP আপস্ট্রিমের জন্য HTTP প্রক্সি তালিকা থেকে একটি প্রার্থী বেছে নিন এবং শংসাপত্র ছাড়াই তার URL তৈরি করুন। বাদ দেওয়া আপস্ট্রিম অন্য স্বয়ংক্রিয় প্রক্সির বদলে সরাসরি ফরওয়ার্ডিং বেছে নেয়।
উদাহরণটি স্থানীয় ক্লায়েন্টের জন্য loopback বাঁধে। অন্য মেশিনকে সংযোগ করতে হলে সংশ্লিষ্ট অ্যাক্সেস নীতি সহ উদ্দিষ্ট ইন্টারফেস সচেতনভাবে বাঁধুন।
সার্ভারগুলোকে তাদের ক্লায়েন্টের কাজের জন্য সক্রিয় রাখুন। মালিকের উচিত শাটডাউনে প্রতিটি সার্ভার তার সমর্থিত বন্ধ পদ্ধতিতে বন্ধ করা; উদাহরণটি সেই অ্যাপ্লিকেশনের সম্পূর্ণ জীবনচক্র নির্ধারণ করে না।