پرش به مطلب اصلی

تنظیم swap، timezone و hostname در اوبونتو

سه تنظیم کوچک که بهتر است روی هر سرور تازه انجام شوند:

  • swap: وقتی رم پر می‌شود، به جای این‌که سیستم پردازش‌ها را بکشد (OOM killer)، بخشی از حافظه را موقتاً روی دیسک می‌برد. روی سرورهای کم‌رم (۱ یا ۲ گیگابایت) جلوی خطاهای ناگهانی مثل قطع شدن MariaDB یا شکست composer install را می‌گیرد.
  • timezone: زمان لاگ‌ها، cron و پیام‌های برنامه را با ساعت محلی شما یکی می‌کند.
  • hostname: نام سرور در prompt ترمینال، لاگ‌ها و ایمیل‌های سیستم.

پیش‌نیازها​

بخش ۱: 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 نگه می‌دارند تا لاگ سرورهای مناطق مختلف با هم مقایسه‌پذیر باشد و فقط در نمایش به کاربر، زمان را تبدیل می‌کنند. اگر سرورهایی در چند کشور دارید، 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 0644sudo 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 ← سرور جدید» شروع کنید.