stream در Nginx برای پراکسی TCP و UDP است. این کاربرد با نمایش ویدئو یا HTTP streaming فرق دارد؛ قبل از تنظیم پورت باید ماژول و جای بلوک stream را درست بشناسیم.

این جلسه بخشی از دورهٔ انجین‌اکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.

محیط: Nginx میزبان آزمایشگاه، نه image کانتینری؛ config و بسته‌های قبلی backup دارند. پورت‌های stream در شب‌های بعد جدا و فقط در شبکهٔ آزمایشگاه باز می‌شوند.

نصب در دو خانواده#

Debian/Ubuntu:

apt-cache policy nginx nginx-full libnginx-mod-stream
sudo apt install nginx-full libnginx-mod-stream
dpkg-query -W nginx nginx-full libnginx-mod-stream
dpkg -L libnginx-mod-stream

nginx-full در بسته‌بندی این نسخه‌ها metapackage برای مجموعه‌ای از قابلیت‌هاست؛ نام آن proof فعال بودن ماژول یا policy نیست. نصب صریح libnginx-mod-stream وابستگی تمرین را روشن می‌کند. در بسته‌بندی و release دیگر، dependencies را دوباره بررسی کن.

Alma/Rocky با Nginx مخزن توزیع:

dnf info nginx nginx-mod-stream
sudo dnf install nginx-mod-stream
rpm -q nginx nginx-mod-stream
rpm -ql nginx-mod-stream

در مخزن nginx.org یا image رسمی، مدل build/load ممکن است متفاوت باشد و بسته‌ای به نام nginx-full وجود نداشته باشد؛ مسیرها را از nginx -V و package list همان منبع بگیر. core و module باید ABI سازگار داشته باشند.

یک stream در main#

با nginx -T ابتدا loader و بلوک موجود stream را بررسی کن. اگر module dynamic است، load_module باید پیش از استفاده و فقط یک بار در main بارگذاری شود؛ loader بسته را دوباره ننویس. سپس پوشهٔ /etc/nginx/stream.d را بساز و در nginx.conf کنار http، نه داخل آن، اضافه کن:

stream {
    include /etc/nginx/stream.d/*.conf;
}

اگر از قبل بلوک stream داری، همین include را داخل همان بلوک اضافه کن. conf.d/*.conf معمول توزیع داخل http خوانده می‌شود؛ گذاشتن stream در آن خطای context می‌دهد. هیچ server HTTP را به stream منتقل نکن.

sudo install -d -m 755 /etc/nginx/stream.d
sudo nginx -t
sudo systemctl reload nginx

خروجی موفق nginx -t با وجود بلوک stream، شناخته شدن context را نشان می‌دهد؛ رسیدن ترافیک TCP/UDP در شب بعد اثبات runtime است. unknown directive stream معمولاً نبودن build/module/load درست است، directive is not allowed here معمولاً جای نادرست بلوک.

دامنهٔ قابلیت#

در stream، location، security header، WordPress، limit_req و ModSecurity HTTP نداریم. ACL و محدودیت اتصال stream directiveهای خودشان را دارند. قابلیت Plus را از OSS جدا بخوان؛ نام یک module در مستندات، موجود بودن همهٔ directiveهای جدید در نسخهٔ قدیمی توزیع را تضمین نمی‌کند.

بازگشت: serverهای stream و سپس include/بلوک اضافه را بردار، nginx -t و reload کن. loader یا بسته را پس از حذف وابستگی config برگردان و سایت‌های HTTP قبلی را دوباره آزمایش کن.

منبع: nginx-full در Debian ، nginx-full در Ubuntu ، stream core .