انجیناکس؛ شب ۳۳: اعتماد HTTPS، ظرفیت FPM و خطر cache خصوصی
فهرست نوشته
WordPress پشت یک پراکسی دیگر ممکن است HTTPS را اشتباه تشخیص دهد یا پاسخ خصوصی را cache کند. امشب مرز اعتماد و ظرفیت پردازش PHP را با آزمون مشخص میکنیم.
این جلسه بخشی از دورهٔ انجیناکس در ۵۰ شب است. قرارداد آزمایشگاه، مسیرها و روال اعمال تغییر در راهنمای دوره آمده است.
محیط: WordPress سالم شب ۳۲؛ حالت پایه TLS مستقیم روی همان Nginx است. سناریوی edge جدا فقط برای کلاینت پراکسی .40 انجام میشود و یک تغییر اختیاری است.
اعتماد به X-Forwarded-Proto#
در حالت مستقیم، همان HTTPS $https if_not_empty در fastcgi.conf مبناست؛ کد عمومی «هر X-Forwarded-Proto شامل https بود» را به wp-config اضافه نکن. کلاینت خارجی میتواند هدر بسازد.
برای edge جدا، backend فقط روی شبکهٔ خصوصی گوش میدهد و firewall صرفاً .40 را میپذیرد. edge هدرهای ورودی را با snippet شب ۲۲ بازنویسی میکند. روی backend در context http:
geo $realip_remote_addr $trusted_wp_edge {
default 0;
192.168.57.40 1;
}
map "$trusted_wp_edge:$http_x_forwarded_proto" $wp_https {
default "";
"1:https" on;
}
این نمونه به realip module و تنظیم محدود شب ۱۸ نیاز دارد؛ $realip_remote_addr همتای TCP اولیه را حفظ میکند. یک کپی اختصاصی از fastcgi.conf بساز، فقط خط HTTPS آن را به fastcgi_param HTTPS $wp_https if_not_empty; تغییر بده و در location PHP بهجای fastcgi.conf همان فایل را include کن. دو پارامتر HTTPS همنام نفرست. در این شاخه، TLS در edge خاتمه یافته است؛ تنظیم SSL قبلی backend را با server خصوصی مناسب جایگزین کن.
درخواست واقعی از edge باید بدون حلقهٔ redirect و با cookie مناسب HTTPS کار کند. درخواست مستقیم کلاینت ۲۱ با هدر جعلی باید در firewall رد شود؛ برای آزمون واحد map، روی clone با دسترسی مستقیم موقت، peer نامعتبر نباید HTTPS بسازد. بعد مسیر موقت را ببند.
ظرفیت و OPcache#
OPcache بایتکد PHP را در حافظه نگه میدارد؛ آن را در تنظیم FPM فعال و با Site Health یا probe موقت محدود به کلاینت ۲۰ بررسی کن. CLI و FPM فایل ini و رفتار متفاوت دارند. با opcache.validate_timestamps=0 هر استقرار به reset/restart برنامهریزیشده نیاز دارد؛ پیشفرض آموزشی را بدون این برنامه تغییر نده.
چهار کارگر شب ۲۹ نقطهٔ شروع است. مصرف حافظهٔ کارگر زیر بار واقعی، بودجهٔ VM، database و latency را ثبت کن؛ عدد max_children را از حافظهٔ باقیمانده و مصرف اندازهگیریشده انتخاب کن. صف طولانی، timeout Nginx و توقف database را با افزودن نامحدود کارگر پنهان نکن. slowlog FPM را در فایل غیرعمومی با permission محدود فعال کن؛ stack میتواند اطلاعات حساس داشته باشد.
تمرین cache با endpoint عمومی#
برای آزمایش FastCGI cache، فقط یک endpoint PHP بدون session و بدون دادهٔ شخصی بساز؛ cache را فعلاً به WordPress عمومی تعمیم نده. در HTTP_LAB:
fastcgi_cache_path /var/cache/nginx/lab-fastcgi levels=1:2
keys_zone=lab_fcgi:10m inactive=10m max_size=100m;
پوشه را با sudo install -d -o "$NGINX_USER" -g "$NGINX_USER" -m 750 /var/cache/nginx/lab-fastcgi بساز. در RHEL نگاشت httpd_cache_t را برای همین پوشه با semanage fcontext ثبت و restorecon کن؛ اگر نگاشت موجود است از -m استفاده کن. کد probe در /var/www/nginx-wordpress/public/cache-probe.php root-owned و mode 644 باشد:
<?php
header('Content-Type: text/plain');
echo 'public cache probe: ', gmdate('c'), "\n";
سپس داخل server وردپرس یک exact location مستقل اضافه کن؛ root همان server به ارث میرسد:
location = /cache-probe.php {
try_files $uri =404;
include fastcgi.conf;
fastcgi_pass unix:/run/php/nginx-wp.sock;
fastcgi_cache lab_fcgi;
fastcgi_cache_key "$scheme:$request_method:$host:$request_uri";
fastcgi_cache_valid 200 10s;
fastcgi_cache_bypass $http_cookie $http_authorization;
fastcgi_no_cache $http_cookie $http_authorization $upstream_http_set_cookie;
include /etc/nginx/snippets/lab-headers.conf;
add_header X-Lab-Cache $upstream_cache_status always;
}
در Alma/Rocky socket را مثل شب ۳۲ به /run/php-fpm/nginx-wp.sock تغییر بده؛ این cache probe در baseline TLS مستقیم اجرا میشود و شاخهٔ edge را قبلاً برگرداندهای. درخواست GET اول MISS و دوم ممکن است HIT شود؛ Cookie یا Authorization باید cache را کنار بگذارد. با curl -D و CA معتبر header را بررسی کن، نه فقط زمان داخل پاسخ. هدر Set-Cookie upstream را نادیده نگیر. برای WordPress، login، admin، REST خصوصی، POST، preview، cart و invalidation به سیاست جداگانه نیاز دارند؛ regex یک cookie تضمین امنیت همهٔ افزونهها نیست.
بازگشت: exact location و probe را حذف کن، zone بیاستفاده را بردار و reload کن؛ به server کامل fastcgi_cache اضافه نکردهایم.
منبع: HTTPS پشت پراکسی ، تنظیم OPcache ، FastCGI cache .