پراکسی TCP بایت‌های یک اتصال را به backend منتقل می‌کند. امشب دو backend آزمایشگاهی را پشت یک پورت می‌گذاریم و تفاوت توزیع اتصال با توزیع درخواست HTTP را می‌بینیم.

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

محیط: stream شب ۴۳؛ دو Python HTTP backend شب ۲۵ روی loopback 8080 و 8081 با متن متفاوت و در foreground ترمینال‌های جدا فعال هستند. ورودی stream پورت 9001 است، نه 80/443.

فایل stream#

در /etc/nginx/stream.d/10-tcp.conf، که داخل بلوک stream خوانده می‌شود:

log_format stream_lab '$remote_addr $protocol $status '
    '$bytes_sent $bytes_received $session_time $upstream_addr';
access_log /var/log/nginx/stream-lab.log stream_lab;
limit_conn_zone $binary_remote_addr zone=stream_clients:1m;
upstream tcp_lab {
    server 127.0.0.1:8080 max_fails=1 fail_timeout=5s;
    server 127.0.0.1:8081 max_fails=1 fail_timeout=5s;
}
server {
    listen 9001;
    allow 192.168.57.20;
    deny all;
    limit_conn stream_clients 3;
    proxy_connect_timeout 2s;
    proxy_timeout 30s;
    proxy_next_upstream on;
    proxy_next_upstream_tries 2;
    proxy_pass tcp_lab;
}

HTTP داخل TCP فقط برای مشاهدهٔ سادهٔ نتیجه استفاده می‌شود؛ Nginx این مسیر را با قواعد HTTP بررسی نمی‌کند. کل اتصال به یک upstream می‌رود؛ keepalive HTTP روی همان اتصال الزاماً backend را عوض نمی‌کند. failover اتصال برقرارشده و تراکنش database را replay نمی‌کند.

در firewall فقط برای این تمرین اجازهٔ TCP/9001 از ۲۰ و ۲۱ بده تا deny خود Nginx را بسنجی؛ دسترسی اینترنتی لازم نیست. در RHEL با semanage port -l نوع پورت را بررسی کن. اگر 9001 آزاد و policy این نقش از http_port_t استفاده می‌کند، ثبت semanage port -a -t http_port_t -p tcp 9001 انجام بده؛ نوع پورت موجود را کور تغییر نده. اتصال به backend نیز باید در SELinux و policy نقش مجاز باشد؛ AVC را بخوان، enforcement را خاموش نکن.

آزمون اتصال تازه#

پس از validate/reload، از کلاینت ۲۰ چند curl جدا به http://192.168.57.10:9001/ بفرست؛ متن هر دو backend و upstream_addr را ثبت کن. توزیع دقیق مساوی برای نمونهٔ کوچک وعده نمی‌دهیم. در شاخهٔ RHEL IP سرور .30 است.

از کلاینت ۲۱ اتصال باید رد شود یا بی‌پاسخ بسته شود؛ stream پاسخ HTML با status HTTP 403 تولید نمی‌کند. مقدار 403 در stream log وضعیت session Nginx است. backend اول را متوقف کن و درخواست تازه بفرست: پس از failure detection، backend سالم باید قابل استفاده باشد. هر دو را متوقف کن و خطای اتصال upstream را در log ببین؛ سپس آن‌ها را برگردان.

بازگشت: فایل 10-tcp.conf و ruleهای موقت firewall را بردار، validate/reload و HTTP قبلی را تست کن. label پورت اختصاصی اضافه‌شده را فقط اگر هیچ سرویس دیگری به آن وابسته نیست بردار.

منبع: پراکسی stream ، ACL stream ، محدودیت اتصال stream ، لاگ stream .