اولین VPS که خریدم، ارزان‌ترین پلن یک سرویس‌دهنده ناشناس بود. بعد از تحویل، فقط یک IP و یک پسورد root داشتم و هیچ نمی‌دانستم ترتیب کار چیست. نیم ساعت بعد، سرور با یک اسکنر خودکار تلاش کرده بود brute force کند و لاگ‌ها پر از خطا بود. تجربه‌ام می‌گوید در راه‌اندازی VPS (Virtual Private Server)، ترتیب مراحل مهم‌تر از خود دستورهاست: اگر اول سخت‌سازی نکنید، هر کاری که بعداً انجام دهید، روی یک پایه لرزان بنا شده. در ادامه همان مسیری را می‌گویم که امروز روی هر VPS جدید اجرا می‌کنم.

گام صفر: قبل از اتصال، این سه چیز را آماده کنید

پیش از هر دستور SSH (Secure Shell)، سه چیز باید کنار دستتان باشد. اول، مشخصات ورود که سرویس‌دهنده ایمیل کرده (IP و پسورد root یا کلید اولیه). دوم، یک کلید SSH روی سیستم محلی‌تان که در گام سوم استفاده می‌کنیم. سوم، تصمیم روشن درباره سیستم‌عامل: در تجربه من اوبونتو LTS برای اکثر پروژه‌ها انتخاب درست است، چون هم مستندات گسترده دارد و هم بسته‌های نرم‌افزاری به‌روزتری ارائه می‌کند. اگر مطمئن نیستید VPS برای پروژه شما مناسب است یا هاست اشتراکی کافی است، مقایسه کامل در VPS چیست و چه تفاوتی با هاست اشتراکی دارد آمده است. مشخصات موردنیاز سرور برای وردپرس هم در سرور وردپرس چه مشخصاتی باید داشته باشد آمده.

VPS امن نیست چون اختصاصی است؛ امن است چون شما آن را امن می‌کنید. تفاوت این دو جمله، همان تفاوت بین دو هفته آرامش و دو سال استرس است.

گام اول: ورود SSH و به‌روزرسانی سیستم

با دستور زیر وارد سرور شوید:

ssh root@SERVER_IP

پس از ورود، اولین کاری که انجام دهید به‌روزرسانی کامل سیستم است:

apt update && apt upgrade -y
# یا روی توزیع‌های مبتنی بر RHEL:
dnf update -y

اگر این به‌روزرسانی، کرنل جدید داشته باشد، یک بار سرور را ری‌استارت کنید:

reboot

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

گام دوم: کاربر ادمین و بستن root

ورود مستقیم با کاربر root روی سرورهای عمومی، خطرناک‌ترین عادت رایج در راه‌اندازی VPS است. یک کاربر جدید بسازید و به آن دسترسی sudo بدهید:

adduser deploy
usermod -aG sudo deploy

سپس در فایل /etc/ssh/sshd_config سه تنظیم را اعمال کنید:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

و سرویس SSH را بازبارگذاری کنید:

systemctl restart sshd

توجه: قبل از اعمال این تغییرات، مطمئن شوید کلید SSH کاربر جدید را اضافه کرده‌اید (گام بعد). در غیر این صورت، دسترسی خود را از دست می‌دهید و برای بازیابی باید از طریق کنسول سرویس‌دهنده وارد شوید. اگر می‌خواهید بدانید چه چیزی زیر کاپوت VPS می‌گذرد، سرور چیست و چگونه کار می‌کند را بخوانید.

گام سوم: کلید SSH و ورود بدون پسورد

روی سیستم محلی خودتان، یک کلید جدید بسازید و آن را به سرور منتقل کنید:

ssh-keygen -t ed25519 -C "your@email.com"
ssh-copy-id deploy@SERVER_IP

الگوریتم ed25519 هم سریع‌تر است و هم کلید کوتاه‌تری تولید می‌کند. پس از آنکه ورود با کلید را تست کردید، می‌توانید PasswordAuthentication no را فعال نگه دارید. اگر روزی کلیدتان گم شد، از پنل مدیریت سرویس‌دهنده (کنسول اضطراری یا KVM) دسترسی بگیرید و کلید جدید بسازید. تجربه‌ام می‌گوید یک بار تمرین این مسیر بازیابی، در روز بحران چند ساعت ارزش دارد.

گام چهارم: فایروال و پورت‌های ضروری

فایروال، اولین لایه دفاعی سرور است. روی اوبونتو با ufw و روی RHEL با firewalld. تنظیمات پیشنهادی من:

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable

اگر پورت SSH را روی شماره غیراستاندارد تنظیم کرده‌اید، همان را باز کنید. نکته حیاتی: پورت دیتابیس (مثل ۳۳۰۶) هرگز نباید مستقیماً از اینترنت قابل دسترسی باشد. اگر نیاز به دسترسی از بیرون دارید، از تونل SSH یا VPN استفاده کنید. راهنمای عملی فایروال سطح سرور در فایروال نرم‌افزاری در سرور آمده است.

گام پنجم: نصب استک وب

استک پیشنهادی من برای اکثر پروژه‌های وردپرسی روی VPS:

  • Nginx: سبک، کارآمد و پیش‌فرض اکثر پنل‌های مدیریت مدرن.
  • PHP-FPM: اجرای PHP با مدیریت منابع بهتر از Apache mod_php.
  • MariaDB: جایگزین سازگار MySQL با کارایی مطلوب.
  • Redis: کش آبجکت برای وردپرس.

نصب پایه:

apt install nginx php-fpm php-mysql mariadb-server redis-server -y

پس از نصب، سرویس‌ها را فعال کنید تا در بوت خودکار بالا بیایند:

systemctl enable nginx php8.2-fpm mariadb redis-server

اگر روی انتخاب LiteSpeed در برابر Nginx تردید دارید، راهنمای مقایسه استک را در بررسی هاست ابری ببینید. برای تنظیم پارامترهای PHP-FPM متناسب با RAM، مسیر عملی در بهینه‌سازی منابع VPS آمده است.

گام ششم: دیتابیس و کاربر اختصاصی

MariaDB پس از نصب، به‌طور پیش‌فرض بدون رمز root کار می‌کند. اجرای اسکریپت امن‌سازی اولیه ضروری است:

mysql_secure_installation

در این اسکریپت، رمز root را تنظیم کنید، کاربران ناشناس را حذف کنید و دسترسی root از راه دور را غیرفعال کنید. سپس برای هر سایت، یک دیتابیس و یک کاربر اختصاصی بسازید:

CREATE DATABASE mysite_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'mysite_user'@'localhost' IDENTIFIED BY 'STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON mysite_db.* TO 'mysite_user'@'localhost';
FLUSH PRIVILEGES;

قاعده‌ای که در تجربه‌ام هرگز نشکسته: هر سایت، دیتابیس و کاربر جدا. اگر یکی از سایت‌ها هک شود، بقیه در امان می‌مانند. charset و collation نیز باید utf8mb4 باشد تا محتوای فارسی و اموجی به‌درستی ذخیره شوند.

گام هفتم: دامنه، SSL و DNS

سه چیز پیش از انتشار سایت باید تنظیم شود. اول، رکوردهای DNS (Domain Name System) دامنه به IP سرور اشاره کنند؛ راهنمای اتصال در اتصال دامنه به هاست آمده است. دوم، SSL (Secure Sockets Layer) را با Let's Encrypt نصب کنید:

apt install certbot python3-certbot-nginx -y
certbot --nginx -d example.com -d www.example.com

سوم، ریدایرکت HTTP به HTTPS را در Nginx فعال کنید:

server {
  listen 80;
  server_name example.com www.example.com;
  return 301 https://$host$request_uri;
}

جزئیات بیشتر در راه‌اندازی SSL و HTTPS در وردپرس آمده است. اگر دامنه‌تان هنوز ثبت نشده، دامنه چیست و چگونه ثبت می‌شود را ببینید.

گام هشتم: بکاپ، مانیتورینگ و cron واقعی

سرور بدون بکاپ، پروژه‌ای با تایمر است. حداقل بکاپ روزانه فایل‌ها و دیتابیس، در یک مکان بیرون از سرور (Object Storage، سرور دیگر یا فضای ابری جدا). روش‌های کامل در چگونه از سایت وردپرسی بکاپ بگیریم و مقایسه ابزارها در بهترین افزونه‌های بکاپ وردپرس آمده است.

برای مانیتورینگ، ابزاری مثل Netdata را نصب کنید تا مصرف CPU، RAM و I/O را به‌طور لحظه‌ای ببینید. یک مانیتور uptime از بیرون سرور (مثل UptimeRobot) هم داشته باشید. در نهایت، wp-cron وردپرس را به cron واقعی سرور منتقل کنید تا کارهای پس‌زمینه در لحظه‌های نامناسب اجرا نشوند؛ روش کار در عیب‌یابی مشکلات cron در وردپرس آمده است.

گام نهم: نصب اولین سایت وردپرسی

حالا استک آماده است و می‌توانید اولین سایت را بالا بیاورید. دو مسیر رایج:

  • نصب دستی: از طریق SSH، فایل‌های وردپرس را دانلود و پیکربندی کنید؛ مراحل دقیق در نصب دستی وردپرس روی هاست آمده.
  • نصب با ابزار: استفاده از WP-CLI که فرایند نصب را چند برابر سریع‌تر می‌کند.

پس از نصب، سه کار فوری: نصب افزونه کش، نصب افزونه بکاپ، و تنظیمات اولیه پیوندهای یکتا. مسیر کامل راه‌اندازی سایت وردپرسی در چگونه یک سایت وردپرسی راه‌اندازی کنیم آمده است.

راه‌اندازی VPS، یک پروژه دوساعته است؛ اما نگهداری‌اش، یک عادت ماهانه است. اگر آن عادت نباشد، هر چه امروز بسازید، فقط یک تایمر است.

جدول مرجع

گامهدفابزار کلیدی
۱به‌روزرسانی سیستمapt / dnf
۲کاربر ادمین، بستن rootadduser + sshd_config
۳ورود با کلید SSHssh-keygen + ssh-copy-id
۴فایروال و پورت‌هاufw / firewalld
۵استک وبNginx + PHP-FPM + MariaDB
۶دیتابیس و کاربر اختصاصیmysql_secure_installation
۷دامنه و SSLcertbot + DNS
۸بکاپ و مانیتورینگNetdata + UptimeRobot
۹اولین سایتWP-CLI یا نصب دستی

پرسش‌های کوتاه

آیا VPS مدیریت‌نشده برای شروع مناسب است؟ اگر دانش پایه لینوکس دارید، بله؛ اگر نه، VPS مدیریت‌شده (managed VPS) انتخاب کم‌ریسک‌تری است. تفاوت این دو در VPS مدیریت شده یا مدیریت نشده آمده است.

چقدر طول می‌کشد تا VPS آماده استقرار سایت شود؟ در تجربه من، حدود دو تا سه ساعت برای یک استک پایه. اگر Docker و CI/CD هم بخواهید، یک روز کاری کامل.

آیا باید از روز اول مانیتورینگ راه بیندازم؟ بله. یک مانیتور uptime بیرونی و یک ابزار لحظه‌ای روی سرور، حداقل‌هاست. بدون آن، در روز مشکل تا تماس کاربر متوجه نمی‌شوید.

آیا باید روی VPS از Docker استفاده کنم؟ اگر پروژه‌های متعدد یا تیمی دارید، بله. برای یک سایت شخصی، رویکرد مستقیم ساده‌تر است. مقایسه در مقایسه Docker و Kubernetes آمده است.

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

از نگاه معماری زیرساخت

برای تیم‌های فنی و توسعه‌دهندگانی که چند VPS را مدیریت می‌کنند، راه‌اندازی اولیه فقط «نصب و پیکربندی» نیست؛ شروع یک رابطه بلندمدت با سرور است. سه اصل معماری که در پروژه‌های بزرگ اهمیت پیدا می‌کند: اول، جداسازی نقش‌ها (role separation) — حتی اگر امروز همه سرویس‌ها روی یک VPS هستند، از روز اول ساختار پوشه‌ها، کاربران و پورت‌ها را طوری طراحی کنید که فردا با کوچ یک سرویس به VPS دیگر، پیکربندی نیازی به بازنویسی نداشته باشد. دوم، زیرساخت به‌عنوان کد (Infrastructure as Code) — ابزارهایی مثل Ansible یا Terraform اجازه می‌دهند همان استک را روی چند VPS با یک اسکریپت بازتولید کنید؛ این کار در تیم‌های چندنفره، هزینه استقرار را به‌شدت پایین می‌آورد و از اختلاف بین محیط staging و production جلوگیری می‌کند. سوم، آمادگی برای سناریوی بازگشت (rollback) — هر تغییر در سطح سرور، باید قابل بازگشت باشد؛ نه فقط با بکاپ، بلکه با مسیر مستند و آزمایش‌شده. این سه اصل، تفاوت بین VPS‌ای که به یک رابطه یک‌باره تبدیل می‌شود و VPS‌ای که پایه رشد چندساله یک کسب‌وکار می‌شود را می‌سازد. در تجربه من، تیم‌هایی که این اصول را از روز اول رعایت می‌کنند، در سال دوم با نیمی از پیچیدگی‌های عملیاتی تیم‌هایی که رعایت نکرده‌اند روبه‌رو می‌شوند.

مسیر در یک نگاه

راه‌اندازی VPS، اگر با ترتیب درست انجام شود، به یک فرآیند دو ساعته تکرارپذیر تبدیل می‌شود. تجربه من می‌گوید سه گام اول (به‌روزرسانی، کاربر ادمین، کلید SSH) بیشترین اثر را در امنیت بلندمدت دارند و گام‌های نصب استک، کارهایی هستند که یک بار نوشته می‌شوند و بارها اجرا. اگر امروز فقط یک کار بکنید، همان سه گام اول را اجرا کنید؛ حتی اگر قصد دارید فردا سایت نصب کنید، سرور شما از همین امروز در برابر اسکنرهای خودکار ایمن می‌شود. اگر تجربه‌ای از راه‌اندازی VPS دارید که در منابع فارسی کمتر گفته شده (مثلاً تنظیمی که تفاوت محسوسی ساخت)، در دیدگاه‌ها بنویسید؛ همان جزئیات برای نفر بعدی ارزشمندتر از هر مستند رسمی است. 🖥️