Nginx می‌تواند ورودی عمومی و TLS را مدیریت کند و برنامه فقط روی loopback پاسخ بدهد. امشب این جداسازی را با backend قابل تشخیص می‌سازیم.

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

محیط: Python 3، گواهی دارای app.nginx.test، مسیر APP_CONF مطابق راهنما؛ هر backend در ترمینال مستقل.

برنامهٔ آزمایشی#

mkdir -p ~/nginx-lab/backend-a
printf '%s\n' 'backend A' > ~/nginx-lab/backend-a/index.html
python3 -m http.server 8080 --bind 127.0.0.1 --directory ~/nginx-lab/backend-a

این http.server فقط ابزار lab است. درخواست محلی باید backend A بدهد؛ کلاینت نباید مستقیم به IP عمومی سرور روی 8080 وصل شود.

فایل /etc/nginx/snippets/lab-proxy-headers.conf:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

این نمونه مرز اول پراکسی است؛ زنجیرهٔ چند proxy طبق شب هجدهم تحلیل می‌شود. APP_CONF:

server {
    listen 443 ssl;
    server_name app.nginx.test;
    ssl_certificate /etc/nginx/tls/web.crt;
    ssl_certificate_key /etc/nginx/tls/web.key;
    include /etc/nginx/snippets/lab-headers.conf;
    access_log /var/log/nginx/app-access.log lab;
    error_log /var/log/nginx/app-error.log warn;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        include /etc/nginx/snippets/lab-proxy-headers.conf;
        proxy_set_header Connection "";
        proxy_connect_timeout 3s;
        proxy_read_timeout 15s;
    }
}

HTTP/2 و گزینه‌های listen را مطابق شب چهاردهم با نسخه و سایر serverها هماهنگ کن. در RHEL، اگر AVC اتصال را رد کرد، برای نقش proxy boolean httpd_can_network_connect را با setsebool -P فعال کن؛ مجوز خروجی آن گسترده است و وضعیت قبل را ثبت کن.

در این آزمایش backend هدر امنیتی نمی‌سازد. اگر در برنامهٔ واقعی Nginx مالک policy است، هدرهای هم‌نام backend را پیش از add_header با proxy_hide_header حذف کن؛ مثلاً proxy_hide_header Strict-Transport-Security;. اگر مالک policy خود برنامه است، همان هدر را دوباره از Nginx اضافه نکن. هدرهای CSP و HSTS تکراری ممکن است رفتار ناخواسته بسازند.

آزمون و خرابی#

از کلاینت، HTTPS app با CA معتبر باید backend A بدهد. backend را متوقف کن؛ باید 5xx و شاهد اتصال در error log داشته باشی. دوباره آن را اجرا کن و پاسخ سالم بگیر.

بازگشت: سایت app را از Include خارج و boolean تغییرکرده را مطابق نقش قبلی برگردان؛ www باید مستقل سالم بماند.

منبع: proxy_pass و هدرهای proxy .