انجیناکس؛ شب ۲۲: اولین برنامه پشت پراکسی معکوس
فهرست نوشته
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 .