بهینه‌سازی حرفه‌ای سرور اختصاصی برای میزبانی سایت فروشگاهی شما

بهینه‌سازی یک سایت فروشگاهی خود میزبان روی سرور Bare-Metal

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

1) اولویت‌های کلی (ترتیب اجرا)

  • امن‌سازی و ایزوله کردن سرور (دسترسی کاربران، فایروال، بکاپ‌ها).
  • رفع گلوگاه‌های اصلی (دیتابیس + ذخیره‌سازی + شبکه).
  • اضافه کردن لایه‌های کش (Object + Page + HTTP).
  • بهینه‌سازی سیستم عامل / شبکه / کرنل برای پردازش همزمان بالا.
  • مانیتورینگ + تست بار و بهینه‌سازی مداوم.

2) سخت‌افزار و سیستم عامل (مزایای Bare-Metal)

  • برای دیتابیس و OPCache PHP از NVMe/SSD استفاده کنید؛ هارد دیسک‌ها برای ذخیره‌سازی سرد / رسانه‌ها مناسب هستند.
  • بیشترین حافظه RAM را به دیتابیس اختصاص دهید. قانون سرانگشتی: سرور DB = RAM زیاد؛ وب/Node = CPU + شبکه.
  • از کرنل Linux LTS جدید استفاده کنید (مثلاً Ubuntu 22.04/24.04، Rocky/Alma Linux 8/9) و آپدیت‌های امنیتی نصب شده باشند.
  • سربار Hypervisor را حذف کنید — یا روی OS میزبان اجرا کنید یا تنها اگر نیاز دارید از Hypervisor کم‌حجم استفاده کنید.

3) ذخیره‌سازی و سیستم فایل

  • دیتابیس روی NVMe/SSD باشد. با noatime و scheduler مناسب mount کنید (مثلاً cfq → noop یا mq-deadline برای SSD).
  • نمونه خط fstab:
    /dev/nvme0n1p1  /var/lib/mysql  ext4  defaults,noatime,nodiratime,barrier=0  0 2
    

    *(قبل از استفاده از barrier=0 تست کنید — بستگی به workload و RAID با باتری/BBU دارد)*

  • برای خواندن با سرعت بالا، discard را فقط در صورت پشتیبانی و تست شده فعال کنید؛ ترجیحاً از TRIM زمان‌بندی شده استفاده کنید.
  • اگر از کنترلر RAID استفاده می‌کنید، write cache را فقط با باتری/BBU یا supercap فعال کنید.

4) دیتابیس (MySQL/MariaDB/Postgres) — بیشترین تاثیر

  • دیتابیس را به سریع‌ترین ذخیره‌سازی منتقل کنید و در صورت امکان CPU را اختصاص دهید.
  • تنظیمات پیشنهادی MySQL/MariaDB برای سروری با 32GB RAM اختصاصی برای DB:
    [mysqld]
    innodb_buffer_pool_size = 22G          # حدود 60-70٪ RAM اگر فقط DB باشد
    innodb_buffer_pool_instances = 8
    innodb_flush_log_at_trx_commit = 1     # 1 = safest, 2 for perf with some risk
    innodb_flush_method = O_DIRECT
    innodb_file_per_table = 1
    max_connections = 500
    thread_cache_size = 50
    query_cache_type = 0                   # غیر فعال (deprecated)
    tmp_table_size = 256M
    max_heap_table_size = 256M
    
    
  • از pt-query-digest برای پیدا کردن کوئری‌های کند استفاده کنید. ایندکس‌ها را برای SELECT‌های سنگین اضافه کنید. از full table scan خودداری کنید.
  • برای Postgres: shared_buffers حدود 25٪ RAM، work_mem بهینه و wal_compression فعال شود اگر بسیاری از نوشتارهای کوچک دارید.
  • دوره‌ای ANALYZE و OPTIMIZE اجرا کنید (یا VACUUM/ANALYZE برای Postgres).

5) وب سرور (توصیه NGINX)

  • NGINX به عنوان reverse proxy + سرویس‌دهنده فایل‌های استاتیک استفاده شود. نمونه :
    worker_processes auto;
    worker_rlimit_nofile 100000;
    events {
      worker_connections 4096;
      multi_accept on;
    }
    http {
      sendfile on;
      tcp_nopush on;
      tcp_nodelay on;
      keepalive_timeout 15;
      types_hash_max_size 2048;
      server_tokens off;
      client_max_body_size 64M;
      gzip on;
      gzip_comp_level 5;
    }
    
  • از open_file_cache برای سرویس‌دهی سریع فایل‌های استاتیک استفاده کنید:
    open_file_cache max=10000 inactive=20s;
    open_file_cache_valid 30s;
    open_file_cache_min_uses 2;
    
  • در هنگام proxy به اپ سرور، proxy_buffer_size و proxy_buffers را تنظیم کنید.

6) PHP / محیط اجرا (PHP-FPM مثال)

  • OPCache را فعال کنید (افزایش سرعت چشمگیر). نمونه: opcache.memory_consumption = 256، opcache.interned_strings_buffer = 16.
  • تنظیم pool PHP-FPM:
    pm = dynamic
    pm.max_children = 200
    pm.start_servers = 20
    pm.min_spare_servers = 10
    pm.max_spare_servers = 30
    request_terminate_timeout = 300s
    
  • برای throughput بالا، PHP-FPM با Unix sockets و listen.backlog بالا توصیه می‌شود.

7) لایه‌های کش (افزایش قابل توجه سرعت)

  • کش کل صفحه: Varnish یا NGINX FastCGI برای سرویس‌دهی HTML کش‌شده به کاربران ناشناس.
  • کش Object: Redis یا Memcached برای session + object cache (مثلاً پلاگین Redis برای WordPress).
  • کش کوئری / نتایج DB: از کش اپلیکیشن برای کوئری‌های سنگین استفاده شود (Redis/Memcached).
  • CDN / مرورگر: Cache-Control طولانی برای فایل‌های استاتیک و استفاده از Cloudflare یا CDN دیگر برای edge caching جهانی.

8) بهینه‌سازی شبکه / کرنل (Linux)

net.core.somaxconn = 65535
net.core.netdev_max_backlog = 250000
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_fin_timeout = 15
fs.file-max = 2000000

افزایش file descriptors کاربران در /etc/security/limits.conf:

* soft nofile 200000
* hard nofile 200000

author
نتورکفا