تنظیم swap، timezone و hostname در اوبونتو
سه تنظیم کوچک که بهتر است روی هر سرور تازه انجام شوند:
- swap: وقتی رم پر میشود، به جای اینکه سیستم پردازشها را بکشد (OOM killer)، بخشی از حافظه را موقتاً روی دیسک میبرد. روی سرورهای کمرم (۱ یا ۲ گیگابایت) جلوی خطاهای ناگهانی مثل قطع شدن MariaDB یا شکست
composer installرا میگیرد. - timezone: زمان لاگها، cron و پیامهای برنامه را با ساعت محلی شما یکی میکند.
- hostname: نام سرور در prompt ترمینال، لاگها و ایمیلهای سیستم.
پیشنیازها
- یک سرور ابری یا VPS با Ubuntu 24.04 (یا 22.04) و کاربر sudo (اولین اتصال SSH و امنسازی)
بخش ۱: swap
۱. بررسی swap فعلی
swapon --show
free -h
df -h /
اگر swapon --show چیزی چاپ نکرد، سرور swap ندارد.
۲. ساخت فایل swap
اندازهی پیشنهادی برای سرور: برابر رم تا ۲ گیگابایت، و برای رم بیشتر ۲ تا ۴ گیگابایت کافی است. مطمئن شوید دیسک فضای کافی دارد. نمونه با ۲ گیگابایت:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
swapon --show
اگر fallocate خطا داد، از sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress استفاده کنید.
۳. دائمی کردن swap
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
۴. تنظیم swappiness
vm.swappiness تعیین میکند هسته چقدر زود از swap استفاده کند (پیشفرض ۶۰). برای سرور، مقدار کمتر بهتر است تا swap فقط در فشار واقعی حافظه استفاده شود:
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl --system
cat /proc/sys/vm/swappiness
swap جایگزین رم نیست؛ دیسک بسیار کندتر از رم است. اگر free -h همیشه مقدار زیادی swap مصرفشده نشان میدهد، پلن سرور را بزرگتر کنید (در سرور ابری «تغییر پلن»).
حذف swap
sudo swapoff /swapfile
sudo sed -i '\|^/swapfile |d' /etc/fstab
sudo rm /swapfile
بخش ۲: timezone
۱. وضعیت فعلی
timedatectl
سرورها معمولاً با Etc/UTC تحویل داده میشوند.
۲. تغییر به وقت تهران
timedatectl list-timezones | grep -i tehran
sudo timedatectl set-timezone Asia/Tehran
timedatectl
date
خط Time zone باید Asia/Tehran (+0330, +0330) را نشان دهد.
بسیاری از تیمها سرورها را روی UTC نگه میدارند تا لاگ سرورهای مناطق مختلف با هم مقایسهپذیر باشد و فقط در نمایش به کاربر، زمان را تبدیل میکنند. اگر سرورهایی در چند کشور دارید، UTC انتخاب امنتری است.
پس از تغییر timezone، سرویسهایی که زمان را هنگام شروع میخوانند را ریاستارت کنید (مثلاً sudo systemctl restart cron rsyslog) و برای PHP مقدار date.timezone را هم در تنظیمات PHP بگذارید.
۳. همگامسازی ساعت
timedatectl show -p NTPSynchronized
اگر NTPSynchronized=no بود:
sudo timedatectl set-ntp true
systemctl status systemd-timesyncd --no-pager
ساعت دقیق برای گواهیهای TLS، کدهای یکبارمصرف (TOTP) و ترتیب درست لاگها لازم است.
بخش ۳: hostname
۱. تغییر hostname
نام را با حروف کوچک انگلیسی، عدد و خط تیره انتخاب کنید (مثلاً web-1)، یا یک نام کامل دامنهای (FQDN) مثل web-1.example.com:
sudo hostnamectl set-hostname web-1
hostnamectl
۲. بهروزرسانی /etc/hosts
تا نام جدید محلی resolve شود و sudo پیام unable to resolve host ندهد:
sudo sed -i '/^127\.0\.1\.1/d' /etc/hosts
echo '127.0.1.1 web-1' | sudo tee -a /etc/hosts
getent hosts web-1
۳. ماندگاری پس از ریاستارت (cloud-init)
تصویرهای ابری اوبونتو cloud-init دارند و در برخی شرایط hostname را هنگام بوت از اطلاعات سرور دوباره تنظیم میکنند. برای اینکه نام شما بماند:
echo 'preserve_hostname: true' | sudo tee /etc/cloud/cloud.cfg.d/99-preserve-hostname.cfg
اگر cloud-init فایل /etc/hosts را مدیریت میکند (در آن صورت بالای فایل نوشته شده است)، تغییرات دستی پس از ریاستارت پاک میشوند؛ برای ماندگاری، الگوی /etc/cloud/templates/hosts.debian.tmpl را ویرایش کنید یا manage_etc_hosts: false را در همان فایل 99-preserve-hostname.cfg اضافه کنید.
برای اینکه نام سرور در پنل آریانت هم با hostname یکی باشد، آن را از زبانهی «تنظیمات» صفحهی سرور ابری عوض کنید.
بررسی نهایی
پس از یک ریاستارت (sudo reboot):
swapon --show # /swapfile is active
cat /proc/sys/vm/swappiness # 10
timedatectl | grep 'Time zone' # Asia/Tehran
hostname # web-1
خطاهای رایج
| خطا | راهحل |
|---|---|
swapon: /swapfile: insecure permissions 0644 | sudo chmod 600 /swapfile |
swapon: /swapfile: swapon failed: Invalid argument | فایل با fallocate روی این فایلسیستم قابل استفاده نیست؛ فایل را پاک و با dd دوباره بسازید. |
sudo: unable to resolve host web-1 | خط 127.0.1.1 web-1 در /etc/hosts نیست. |
| hostname پس از ریاستارت برمیگردد | preserve_hostname: true را در cloud-init تنظیم کنید (بخش ۳). |
| زمان cron هنوز UTC است | sudo systemctl restart cron |
قدم بعدی
سرور خود را بسازید
در ابر آریانت میتوانید این تنظیمات را از همان اول با «اسکریپت راهاندازی (cloud-init)» هنگام ساخت سرور اعمال کنید، و هر وقت رم کم آمد پلن را بزرگتر کنید. در پنل آریانت از «سرور ابری / Cloud Computing ← سرور جدید» شروع کنید.