1. مستندات
  2. سرور اختصاصی
  3. پایداری امنیت و کنترل فشار در سرور اختصاصی سایت‌های پرترافیک

پایداری امنیت و کنترل فشار در سرور اختصاصی سایت‌های پرترافیک

Calendar

انتشار:

1404/12/20
Update Calendar

به روز رسانی:

1404/12/20

در این مقاله می‌خواهیم به شکل عملی و فنی بررسی کنیم که چگونه می‌توان یک سرور اختصاصی را برای سایت‌های پرترافیک پایدار نگه داشت. تمرکز اصلی روی مدیریت فشار با تنظیم درست دیتابیس، استفاده از کش در سطح سرور و تقویت امنیت متناسب با حجم بالای درخواست‌ها است تا سرور حتی در زمان شلوغی و ترافیک بالا، بدون اختلال و قطعی به کار خود ادامه دهد.

تنظیم دیتابیس برای فشار بالا در سرور اختصاصی

دیتابیس در سایت‌های پرترافیک بیشترین فشار را تحمل می‌کند و اگر به‌درستی تنظیم نشود کل سایت دچار کندی یا خطای اتصال می‌شود. مدیر سرور باید این بخش را کاملاً عملی و بر اساس منابع واقعی سرور تنظیم کند نه به‌صورت پیش‌فرض.

در سرورهای لینوکسی که MySQL یا MariaDB روی آن‌ها نصب است اولین قدم بررسی وضعیت فعلی دیتابیس است. مدیر سرور باید وارد محیط MySQL شود تا مقدار تنظیمات فعلی را ببیند. این کار کمک می‌کند مشخص شود دیتابیس در حال حاضر چه مقدار رم مصرف می‌کند و محدودیت‌ها در چه وضعیتی قرار دارند.

برای ورود به محیط MySQL دستور زیر اجرا می‌شود:

mysql -u root -p

بعد از ورود مدیر سرور باید متغیرهای مهم مربوط به حافظه و تعداد اتصال‌ها را بررسی کند. این متغیرها نقش مستقیم در تحمل فشار بالا دارند.

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'tmp_table_size';
SHOW VARIABLES LIKE 'max_heap_table_size';
SHOW VARIABLES LIKE 'query_cache_type';

مهم‌ترین بخش دیتابیس در سایت پرترافیک InnoDB Buffer Pool است. این بخش تعیین می‌کند چه مقدار از رم سرور برای نگه‌داری داده‌ها و ایندکس‌ها در حافظه استفاده شود. اگر این مقدار کم باشد دیتابیس دائماً از دیسک استفاده می‌کند و سرعت سایت به‌شدت کاهش می‌یابد. در سرورهای پرترافیک معمولاً بین ۶۰ تا ۷۰ درصد رم آزاد سرور به این بخش اختصاص داده می‌شود تا دسترسی به داده‌ها سریع باقی بماند.

برای تغییر این مقدار مدیر سرور باید فایل تنظیمات MySQL را ویرایش کند. در توزیع‌های Ubuntu و Debian مسیر فایل معمولاً یکی از مسیرهای زیر است:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

یا

sudo nano /etc/my.cnf

در داخل فایل و در بخش [mysqld] می‌توان تنظیمات را به‌صورت عملی وارد کرد. برای مثال روی سروری با ۱۶ گیگ رم تنظیمات زیر رایج است.

innodb_buffer_pool_size = 10G
max_connections = 300
tmp_table_size = 256M
max_heap_table_size = 256M

mysqld.cnf

گزینه max_connections تعداد اتصال هم‌زمان به دیتابیس را مشخص می‌کند. اگر این عدد کم باشد در ترافیک بالا خطای اتصال دیتابیس دیده می‌شود. اگر بیش از حد زیاد باشد رم سرور به‌سرعت مصرف می‌شود. این مقدار باید با تعداد پردازش‌های PHP-FPM و الگوی ترافیک سایت هماهنگ شود.

بعد از ذخیره تنظیمات، مدیر سرور باید سرویس MySQL را ریستارت کند تا تغییرات اعمال شوند.

sudo systemctl restart mysql
sudo systemctl status mysql --no-pager

پس از ریستارت بررسی مصرف حافظه دیتابیس بسیار مهم است. این بررسی نشان می‌دهد آیا تنظیمات به‌درستی اعمال شده‌اند یا خیر.

SHOW STATUS LIKE 'Innodb_buffer_pool%';

اگر مقدار استفاده‌شده به مقدار کل نزدیک باشد تنظیمات متعادل انجام شده است. اگر مقدار استفاده خیلی کم باشد یعنی رم بیش از حد به دیتابیس اختصاص داده شده و می‌توان آن را کاهش داد. این بررسی به مدیر سرور کمک می‌کند دیتابیس در زمان ترافیک بالا سریع، پایدار و بدون خطا کار کند.

استفاده از کش در سطح سرور برای سایت‌های پرترافیک

در سایت‌های پرترافیک استفاده از کش در سطح سرور یک انتخاب نیست بلکه یک الزام فنی است. بدون کش فشار مستقیم روی PHP و دیتابیس وارد می‌شود و حتی با سخت‌افزار قوی هم سرور در ترافیک بالا ناپایدار می‌شود. هدف اصلی کش سروری این است که تا حد ممکن اجرای PHP و کوئری‌های دیتابیس کاهش پیدا کند.

کش صفحه در سطح وب‌سرور (Nginx)

در سایت‌هایی که محتوای ثابت زیادی دارند مانند سایت‌های خبری بهترین روش استفاده از کش صفحه در خود وب‌سرور است. در این حالت پاسخ نهایی HTML ذخیره می‌شود و درخواست‌های بعدی بدون اجرای PHP پاسخ داده می‌شوند.

در سرور لینوکسی با Nginx ابتدا ماژول کش به‌صورت پیش‌فرض فعال است و فقط باید تنظیم شود. نمونه تنظیم کش در فایل کانفیگ Nginx به شکل زیر است:

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=WORDPRESS:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

در بلاک سرور سایت تنظیمات کش به این شکل اضافه می‌شود.

location ~ \.php$ {
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    fastcgi_cache WORDPRESS;
    fastcgi_cache_valid 200 301 302 60m;
    fastcgi_cache_use_stale error timeout updating;
    add_header X-FastCGI-Cache $upstream_cache_status;
}

بعد از اعمال تنظیمات باید سرویس Nginx ریستارت شود.

sudo systemctl restart nginx

با این روش بخش بزرگی از درخواست‌ها مستقیماً از کش پاسخ داده می‌شوند و فشار روی PHP و دیتابیس به‌شدت کاهش پیدا می‌کند.

کش آبجکت با Redis برای سایت‌های داینامیک

در سایت‌های فروشگاهی یا سیستم‌های داینامیک کش صفحه به‌تنهایی کافی نیست. در این حالت کش آبجکت با Redis بهترین انتخاب است چون داده‌های پرتکرار دیتابیس در حافظه نگه‌داری می‌شوند.

برای نصب Redis روی سرور لینوکسی دستور زیر اجرا می‌شود.

sudo apt update
sudo apt install redis-server -y

بعد از نصب وضعیت سرویس بررسی می‌شود.

sudo systemctl status redis --no-pager

برای بهینه‌سازی Redis باید فایل تنظیمات آن ویرایش شود.

sudo nano /etc/redis/redis.conf

مهم‌ترین تنظیمات پیشنهادی برای سرور پرترافیک به شکل زیر است:

maxmemory 2gb
maxmemory-policy allkeys-lru

بعد از ذخیره تنظیمات Redis ریستارت می‌شود.

sudo systemctl restart redis

در مرحله بعد PHP باید ماژول Redis را داشته باشد. برای PHP 8.3 دستور زیر استفاده می‌شود:

sudo apt install php8.3-redis -y
sudo systemctl restart php8.3-fpm

پس از فعال‌سازی Redis داده‌های پرتکرار به‌جای دیتابیس از حافظه خوانده می‌شوند و زمان پاسخ سایت به‌شدت کاهش پیدا می‌کند.

افزایش امنیت متناسب با ترافیک بالا در سرور اختصاصی

در سایت‌های پرترافیک امنیت فقط برای جلوگیری از نفوذ نیست بلکه برای کنترل فشار و جلوگیری از مصرف بی‌رویه منابع سرور حیاتی است. درخواست‌های ربات‌ها اسکن‌ها و حملات ساده می‌توانند CPU و رم را اشباع کنند و باعث قطع سرویس شوند.

فعال‌سازی فایروال UFW در سطح سیستم‌عامل

اولین قدم فعال‌سازی فایروال سیستم‌عامل است. در سرورهای لینوکسی UFW یکی از ساده‌ترین و کاربردی‌ترین ابزارهاست.

sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing

پورت‌های ضروری باز می‌شوند.

sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
sudo ufw enable

با این کار فقط پورت‌های موردنیاز باز می‌مانند و سطح حمله کاهش پیدا می‌کند.

تنظیم پورت جدید در UFW

محدودسازی درخواست‌ها با Fail2Ban

Fail2Ban یکی از مهم‌ترین ابزارها برای مقابله با حملات ساده و درخواست‌های غیرعادی است. این ابزار IPهایی که رفتار مشکوک دارند را به‌صورت خودکار مسدود می‌کند.

نصب Fail2Ban به شکل زیر انجام می‌شود.

sudo apt install fail2ban -y

فایل تنظیمات اصلی ایجاد می‌شود.

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

برای محافظت از SSH تنظیمات زیر فعال می‌شود.

[sshd]
enabled = true
maxretry = 5
findtime = 600
bantime = 3600

سپس سرویس ریستارت می‌شود.

sudo systemctl restart fail2ban
sudo systemctl status fail2ban --no-pager

این ابزار باعث می‌شود حملات ساده قبل از رسیدن به وب‌سرور متوقف شوند.

Fail2ban2

محدودسازی نرخ درخواست در Nginx

برای کنترل فشار مستقیم روی وب‌سرور باید نرخ درخواست‌ها محدود شود. این کار در Nginx با ماژول limit_req انجام می‌شود.

در بخش http کانفیگ Nginx این تنظیم اضافه می‌شود.

limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;

در بلاک سرور سایت محدودسازی اعمال می‌شود.

location / {
    limit_req zone=one burst=20 nodelay;
}

بعد از اعمال تنظیمات Nginx ریستارت می‌شود.

sudo systemctl restart nginx

این تنظیم باعث می‌شود یک IP نتواند در مدت کوتاه درخواست‌های بیش‌ازحد ارسال کند و منابع سرور حفظ شوند.

با اجرای این تنظیمات کش و امنیت سرور اختصاصی برای سایت‌های پرترافیک به‌صورت عملی و حرفه‌ای کنترل می‌شود و سرور می‌تواند در شرایط فشار بالا پایدار، سریع و امن باقی بماند.


در این مقاله نحوه تنظیم دیتابیس برای تحمل فشار بالا، استفاده از کش‌های سروری برای کاهش بار پردازشی و افزایش امنیت برای جلوگیری از مصرف بی‌رویه منابع توضیح داده شد. با اجرای این تنظیمات سرور اختصاصی می‌تواند در ترافیک بالا سریع، پایدار و امن باقی بماند.

آیا توانستیم چالش شما را حل کنیم؟