اولین باری که یک سرور اختصاصی (dedicated server) تحویل گرفتم، فقط یک IP و یک پسورد root روی ایمیل بود؛ هیچ راهنمایی‌ای همراه نبود. آن روز چند ساعت با خودم کلنجار رفتم تا بفهمم ترتیب درست کار چیست. تجربه‌ام می‌گوید ترتیب، مهم‌تر از دستورهاست: اگر اول سرور را سخت نکنید و بعد سرویس نصب کنید، در همان ساعت اول در معرض اسکنرهای خودکار اینترنت قرار می‌گیرید. در ادامه همان ترتیبی را می‌گویم که امروز روی هر سرور اختصاصی جدید اجرا می‌کنم.

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

پیش از هر کار، سیستم را از طریق SSH (Secure Shell) وارد شوید و تمام پکیج‌های نصب‌شده را به‌روز کنید:

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

روی اکثر توزیع‌های لینوکس، اولین به‌روزرسانی ممکن است نصب کرنل جدید داشته باشد؛ در این حالت یک بار سرور را ری‌استارت کنید. تفاوت سرور اختصاصی با VPS (Virtual Private Server) در این مرحله محسوس نیست، اما در سرور اختصاصی، پهنای باند اختصاصی و پردازنده مستقل، بعداً در بارهای سنگین خودش را نشان می‌دهد. مقایسه کامل در سرور اختصاصی برای چه کسب‌وکارهایی مناسب است آمده است.

گام دوم: کاربر ادمین و غیرفعال‌سازی root

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

adduser deploy
usermod -aG sudo deploy

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

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

و سرویس SSH را بازبارگذاری کنید تا تنظیمات اعمال شود:

systemctl restart sshd

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

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

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

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

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

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

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

فایروال، اولین لایه دفاعی سرور است. با ابزار ufw روی اوبونتو یا firewalld روی RHEL، پورت‌های ضروری را باز و بقیه را ببندید:

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 استفاده کنید. راهنمای عملی فایروال سطح سرور در فایروال نرم‌افزاری در سرور آمده است.

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

استک پیشنهادی من بسته به نوع پروژه متفاوت است، اما برای سایت‌های وردپرسی، ترکیب زیر در اکثر پروژه‌ها بیشترین بازده را داشته:

  • 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

گام ششم: نصب دیتابیس و مدیریت آن

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 و نقش آن در محتوای فارسی در بهینه‌سازی جداول MySQL برای سرعت آمده است.

گام هفتم: دامنه، 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 روی پنل‌های مختلف در راه‌اندازی SSL و HTTPS در وردپرس آمده است.

گام هشتم: بکاپ و مانیتورینگ

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

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

گام نهم: استقرار اولین سایت

حالا که استک آماده است، سایت را مستقر کنید. سه الگو برای deploy در پروژه‌های واقعی:

  • Docker: ایزوله‌سازی کامل سرویس‌ها، مناسب برای سرورهای پرترافیک.
  • استقرار مستقیم: روی همان سرور، با کاربر جدا و پوشه جدا برای هر سایت.
  • استقرار با کنترل پنل: نصب یک پنل مدیریتی مثل cPanel یا DirectAdmin برای مدیریت ساده‌تر.

پیشنهاد من برای شروع: یک سرور با استقرار مستقیم، تا زمانی که پروژه‌ها به جایی برسند که مهاجرت به Docker یا پنل مدیریت ارزش داشته باشد. اگر روی سایت وردپرسی کار می‌کنید، مراحل نصب وردپرس در نصب دستی وردپرس روی هاست آمده است.

جدول مرجع

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

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

آیا راه‌اندازی سرور اختصاصی بدون دانش لینوکس ممکن است؟ برای پروژه جدی، خیر. حتی اگر از پنل مدیریتی استفاده می‌کنید، دانش پایه‌ای از SSH، فایروال و مدیریت کاربر، در روز بحران نجات‌دهنده است.

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

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

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

جمع این مسیر

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