نصب Redis در اوبونتو یکی از کارهای رایج برای بهبود سرعت سایت، راه‌اندازی کش، مدیریت صف‌ها، ذخیره Session، افزایش کارایی اپلیکیشن‌ها و حتی بهینه‌سازی سایت‌های وردپرسی است. Redis یک دیتابیس بسیار سریع از نوع in-memory است؛ یعنی داده‌ها را عمدتاً در حافظه RAM نگه می‌دارد و به همین دلیل، برای سناریوهایی مثل کش، صف پیام، Session Store و Object Cache عملکرد بسیار خوبی دارد.

اما نکته مهم اینجاست: Redis اگر بدون تنظیمات امنیتی مناسب نصب شود، می‌تواند به یکی از خطرناک‌ترین نقاط ضعف سرور تبدیل شود. باز بودن پورت Redis روی اینترنت، نداشتن احراز هویت، استفاده از رمز ساده، فعال بودن کاربر پیش‌فرض، نبود محدودیت حافظه، نداشتن فایروال و ارسال داده بدون رمزنگاری می‌تواند باعث افشای اطلاعات، خرابکاری، مصرف بیش از حد منابع یا حتی نفوذ به سرور شود.

در این مقاله، به‌صورت مرحله‌به‌مرحله یاد می‌گیرید چطور Redis را روی Ubuntu نصب کنید، عملکرد آن را تست کنید، دسترسی‌ها را با ACL امن کنید، Redis را فقط روی localhost یا مسیر امن در دسترس قرار دهید، فایروال را تنظیم کنید، ارتباطات را با TLS رمزنگاری کنید، Slow Log و لاگ‌های Redis را بررسی کنید و برای داده‌های Redis بکاپ و Persistence مناسب داشته باشید.

سطح: متوسط | مناسب برای: مدیران سرور، کاربران VPS، مدیران سایت وردپرسی، توسعه‌دهندگان، DevOpsها و تیم‌های فنی که می‌خواهند Redis را روی سرور Ubuntu به‌شکل امن و قابل استفاده در محیط واقعی راه‌اندازی کنند.

فهرست مطالب

Redis چیست و چه کاربردی دارد؟

Redis مخفف Remote Dictionary Server است و یک سیستم ذخیره‌سازی داده بسیار سریع از نوع key-value محسوب می‌شود. Redis معمولاً داده‌ها را در RAM نگه می‌دارد و همین موضوع باعث می‌شود سرعت خواندن و نوشتن آن بسیار بالا باشد.

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

  • کش کردن کوئری‌ها و داده‌های پرتکرار
  • Object Cache در وردپرس
  • ذخیره Session کاربران
  • مدیریت صف‌ها در اپلیکیشن‌ها
  • Rate Limiting برای APIها
  • ذخیره موقت توکن‌ها
  • Pub/Sub برای پیام‌رسانی داخلی
  • Leaderboard، شمارنده‌ها و داده‌های Real-time

در سرورهای میزبانی، مخصوصاً زمانی که سایت روی سرور مجازی ایران، سرور مجازی آلمان یا سرور اختصاصی اجرا می‌شود، Redis می‌تواند نقش مهمی در افزایش سرعت و کاهش فشار روی دیتابیس داشته باشد.

چرا امن‌سازی Redis مهم است؟

Redis به‌صورت پیش‌فرض برای قرار گرفتن مستقیم روی اینترنت طراحی نشده است. این سرویس معمولاً باید در یک شبکه داخلی، روی localhost، پشت فایروال، یا از طریق VPN و تونل امن استفاده شود.

اگر Redis را بدون امنیت کافی روی سرور عمومی اجرا کنید، چند خطر جدی ایجاد می‌شود:

  • دسترسی غیرمجاز به داده‌های کش، Sessionها یا اطلاعات حساس
  • حذف یا تغییر داده‌ها با دستوراتی مثل FLUSHALL
  • استفاده از Redis برای حمله به سرور یا مصرف شدید RAM
  • امکان سوءاستفاده از misconfiguration برای اجرای سناریوهای خطرناک
  • قرار گرفتن رمزها و داده‌ها در معرض شنود در صورت نبود TLS

بنابراین نصب Redis فقط نصف کار است. بخش مهم‌تر، امن‌سازی Redis برای محیط واقعی و Production است.

پیش‌نیازهای نصب Redis روی Ubuntu

برای اجرای مراحل این مقاله، بهتر است این پیش‌نیازها را داشته باشید:

  • یک سرور Ubuntu؛ مثل Ubuntu 20.04، ۲۲.۰۴ یا ۲۴.۰۴
  • دسترسی SSH به سرور
  • یک کاربر غیر root با دسترسی sudo
  • فعال بودن فایروال UFW یا امکان تنظیم فایروال
  • آشنایی پایه با دستورات لینوکس

اگر هنوز با دستورات پایه لینوکس آشنا نیستید، بهتر است قبل از ادامه، مقاله دستورات کاربردی لینوکس را هم مطالعه کنید.

همچنین اگر برای اجرای Redis به سرور مستقل نیاز دارید، استفاده از سرور مجازی و اختصاصی انتخاب بهتری نسبت به هاست اشتراکی است؛ چون در هاست اشتراکی معمولاً دسترسی کامل برای نصب و تنظیم Redis ندارید.

نصب Redis در اوبونتو

ساده‌ترین روش نصب Redis در Ubuntu استفاده از APT است. ابتدا لیست پکیج‌ها را به‌روزرسانی کنید:

sudo apt update

سپس Redis را نصب کنید:

sudo apt install redis-server -y

بعد از نصب، نسخه Redis را بررسی کنید:

redis-server --version

نمونه خروجی ممکن است شبیه این باشد:

Redis server v=7.x.x sha=00000000:0 malloc=jemalloc bits=64 build=...

نسخه دقیق Redis به نسخه Ubuntu و مخازن فعال روی سرور شما بستگی دارد.

تنظیم Redis برای مدیریت با systemd

در Ubuntu، سرویس‌ها معمولاً با systemd مدیریت می‌شوند. برای هماهنگی بهتر Redis با systemd، فایل تنظیمات Redis را باز کنید:

sudo nano /etc/redis/redis.conf

عبارت زیر را پیدا کنید:

supervised no

آن را به حالت زیر تغییر دهید:

supervised systemd

سپس فایل را ذخیره کنید. اگر از nano استفاده می‌کنید، با کلیدهای CTRL + X، سپس Y و بعد ENTER خارج شوید.

حالا Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

در بعضی نسخه‌ها ممکن است نام سرویس redis باشد. اگر دستور بالا کار نکرد، این دستور را امتحان کنید:

sudo systemctl restart redis

برای بررسی وضعیت سرویس:

sudo systemctl status redis-server

یا:

sudo systemctl status redis

اگر Redis فعال باشد، باید وضعیت active (running) را ببینید.

تست عملکرد Redis بعد از نصب

بعد از نصب Redis، باید مطمئن شوید سرویس درست کار می‌کند. برای اتصال به Redis از ابزار redis-cli استفاده کنید:

redis-cli

در محیط Redis، دستور زیر را اجرا کنید:

ping

اگر Redis درست کار کند، پاسخ زیر را می‌بینید:

PONG

حالا یک مقدار تستی ذخیره کنید:

set test "Redis is working"

پاسخ باید این باشد:

OK

برای خواندن مقدار:

get test

خروجی:

"Redis is working"

برای خروج از محیط Redis:

exit

تست ماندگاری داده بعد از ری‌استارت

برای اینکه مطمئن شوید Redis بعد از ری‌استارت هم داده را حفظ می‌کند، سرویس را ری‌استارت کنید:

sudo systemctl restart redis-server

دوباره وارد Redis شوید:

redis-cli

مقدار قبلی را بخوانید:

get test

اگر مقدار همچنان وجود داشت، یعنی Persistence پیش‌فرض Redis در حال کار است. البته در ادامه مقاله، تنظیمات Persistence را دقیق‌تر بررسی می‌کنیم.

محدود کردن Redis به localhost

یکی از مهم‌ترین مراحل امن‌سازی Redis این است که مطمئن شوید Redis روی همه IPهای سرور گوش نمی‌دهد. Redis در حالت امن باید فقط روی localhost یا IPهای داخلی مشخص listen کند.

فایل تنظیمات را باز کنید:

sudo nano /etc/redis/redis.conf

خط bind را پیدا کنید و مطمئن شوید به این شکل است:

bind 127.0.0.1 ::1

این تنظیم باعث می‌شود Redis فقط از داخل همان سرور قابل دسترسی باشد.

سپس Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

برای بررسی اینکه Redis روی چه آدرسی گوش می‌دهد، از دستور زیر استفاده کنید:

ss -tulpen | grep redis

خروجی امن باید چیزی شبیه این باشد:

۱۲۷.۰.۰.۱:۶۳۷۹
[::۱]:۶۳۷۹

اگر در خروجی ۰.۰.۰.۰:۶۳۷۹ دیدید، یعنی Redis روی همه IPها گوش می‌دهد و این برای سرور عمومی خطرناک است.

امن‌سازی Redis با ACL

در نسخه‌های جدید Redis، روش مدرن برای مدیریت دسترسی کاربران، استفاده از ACL یا Access Control List است. روش قدیمی‌تر یعنی requirepass فقط یک رمز کلی برای Redis تعریف می‌کرد، اما ACL به شما اجازه می‌دهد کاربران مختلف با سطح دسترسی متفاوت بسازید.

برای شروع، یک رمز قوی تولید کنید:

openssl rand 60 | openssl base64 -A

خروجی را کپی کنید؛ این رمز را برای کاربر Redis استفاده می‌کنیم.

حالا فایل تنظیمات Redis را باز کنید:

sudo nano /etc/redis/redis.conf

بخش ACL را پیدا کنید و تنظیماتی شبیه این اضافه کنید:

# Disable default user
user default off

# Create application user
user appuser on >YOUR_STRONG_PASSWORD ~* &* +@all

در این تنظیم:

  • user default off کاربر پیش‌فرض Redis را غیرفعال می‌کند.
  • appuser نام کاربر جدید است.
  • on یعنی این کاربر فعال است.
  • >YOUR_STRONG_PASSWORD رمز کاربر را تعیین می‌کند.
  • ~* یعنی دسترسی به همه keyها.
  • &* یعنی دسترسی به همه کانال‌های Pub/Sub.
  • +@all یعنی اجازه اجرای همه دسته‌های دستورات.

بعد از ذخیره فایل، Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

تست ACL در Redis

حالا اگر بدون احراز هویت دستور ping را اجرا کنید:

redis-cli ping

باید خطایی شبیه این ببینید:

NOAUTH Authentication required.

برای اتصال با کاربر جدید، بهتر است رمز را مستقیم در دستور ننویسید؛ چون ممکن است در history شل ذخیره شود. از --askpass استفاده کنید:

redis-cli --user appuser --askpass

بعد از وارد کردن رمز، دستور زیر را اجرا کنید:

ping

اگر پاسخ PONG بود، ACL درست کار می‌کند.

ساخت کاربر محدودتر برای امنیت بهتر

در محیط Production بهتر است به هر اپلیکیشن فقط دسترسی لازم را بدهید. مثلاً برای یک اپلیکیشن که فقط به read/write نیاز دارد و نباید دستورهای خطرناک را اجرا کند:

user appuser on >YOUR_STRONG_PASSWORD ~* &* +@read +@write +@connection -@dangerous -FLUSHALL -FLUSHDB

این قانون اجازه خواندن، نوشتن و اتصال می‌دهد، اما دسته دستورات خطرناک و دستورهای حذف کامل دیتابیس را محدود می‌کند.

رمزنگاری ارتباط Redis با TLS

ACL جلوی دسترسی غیرمجاز را می‌گیرد، اما اگر Redis از طریق شبکه بین دو سرور استفاده شود، داده‌ها همچنان ممکن است بدون رمزنگاری منتقل شوند. برای ارتباط امن، باید TLS فعال شود.

اگر Redis فقط روی همان سرور و از طریق localhost استفاده می‌شود، معمولاً TLS ضروری نیست. اما اگر اپلیکیشن و Redis روی دو سرور جدا هستند، استفاده از TLS یا تونل امن بسیار مهم است.

ساخت مسیر گواهی‌ها

sudo mkdir -p /etc/redis/tls

ساخت CA و گواهی Self-signed برای Redis

برای محیط تست یا شبکه داخلی، می‌توانید از گواهی self-signed استفاده کنید:

sudo openssl genrsa -out /etc/redis/tls/ca.key 4096

sudo openssl req -x509 -new -nodes \
  -key /etc/redis/tls/ca.key \
  -sha256 -days 365 \
  -out /etc/redis/tls/ca.crt

sudo openssl genrsa -out /etc/redis/tls/redis.key 2048

sudo openssl req -new \
  -key /etc/redis/tls/redis.key \
  -out /etc/redis/tls/redis.csr

sudo openssl x509 -req \
  -in /etc/redis/tls/redis.csr \
  -CA /etc/redis/tls/ca.crt \
  -CAkey /etc/redis/tls/ca.key \
  -CAcreateserial \
  -out /etc/redis/tls/redis.crt \
  -days 365 -sha256

دسترسی فایل‌ها را محدود کنید:

sudo chmod 640 /etc/redis/tls/*
sudo chown redis:redis /etc/redis/tls/*

برای محیط Production عمومی، بهتر است از گواهی معتبر صادرشده توسط CA قابل اعتماد استفاده کنید. اگر ارتباط Redis فقط داخلی است، self-signed با توزیع امن CA بین کلاینت‌ها قابل قبول است.

فعال کردن TLS در Redis

فایل تنظیمات Redis را باز کنید:

sudo nano /etc/redis/redis.conf

برای غیرفعال کردن پورت بدون رمزنگاری و فعال‌سازی TLS روی پورت Redis، این تنظیمات را اضافه یا اصلاح کنید:

port 0
tls-port 6379

tls-cert-file /etc/redis/tls/redis.crt
tls-key-file /etc/redis/tls/redis.key
tls-ca-cert-file /etc/redis/tls/ca.crt

سپس Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

تست اتصال Redis با TLS

redis-cli --user appuser --askpass --tls --cacert /etc/redis/tls/ca.crt

بعد از ورود، دستور زیر را بزنید:

ping

اگر PONG دریافت کردید، ارتباط TLS درست است.

فعال‌سازی mTLS برای امنیت بیشتر

در سناریوهای حساس، می‌توانید Mutual TLS یا mTLS را فعال کنید. در این حالت، کلاینت هم باید گواهی معتبر ارائه دهد.

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

openssl genrsa -out client.key 2048
openssl req -new -key client.key -out client.csr

sudo openssl x509 -req \
  -in client.csr \
  -CA /etc/redis/tls/ca.crt \
  -CAkey /etc/redis/tls/ca.key \
  -CAcreateserial \
  -out client.crt \
  -days 365 -sha256

سپس در /etc/redis/redis.conf این گزینه را فعال کنید:

tls-auth-clients yes

اتصال با گواهی کلاینت:

redis-cli --user appuser --askpass --tls \
  --cacert /etc/redis/tls/ca.crt \
  --cert client.crt \
  --key client.key

تنظیم فایروال برای Redis

حتی اگر Redis را با ACL و TLS امن کرده باشید، باز هم نباید پورت Redis را برای همه اینترنت باز بگذارید. پورت پیش‌فرض Redis عدد ۶۳۷۹ است و باید فقط برای منابع قابل اعتماد باز باشد.

ابتدا مطمئن شوید SSH مجاز است تا دسترسی شما قطع نشود:

sudo ufw allow OpenSSH

اگر Redis فقط روی localhost استفاده می‌شود، نیازی به باز کردن پورت ۶۳۷۹ روی فایروال ندارید.

اگر یک سرور اپلیکیشن با IP مشخص باید به Redis وصل شود، فقط همان IP را مجاز کنید:

sudo ufw allow from YOUR_APP_SERVER_IP to any port 6379 proto tcp

وضعیت فایروال را بررسی کنید:

sudo ufw status verbose

اگر UFW هنوز فعال نیست:

sudo ufw enable

نکته مهم: هرگز از دستور زیر برای Redis روی سرور عمومی استفاده نکنید، مگر اینکه دقیقاً بدانید چه می‌کنید و محدودیت‌های دیگری مثل VPN، فایروال سطح دیتاسنتر و TLS دارید:

sudo ufw allow 6379/tcp

این دستور پورت Redis را برای همه باز می‌کند و از نظر امنیتی خطرناک است.

روش امن اتصال از راه دور به Redis

اگر اپلیکیشن و Redis روی دو سرور متفاوت هستند، سه روش امن‌تر برای اتصال وجود دارد:

۱. استفاده از شبکه خصوصی یا Private Network

اگر ارائه‌دهنده زیرساخت شما Private Network دارد، بهتر است Redis فقط روی IP خصوصی listen کند و فایروال هم فقط همان شبکه خصوصی را مجاز بداند.

۲. استفاده از VPN مثل WireGuard یا OpenVPN

در این روش، سرور اپلیکیشن و سرور Redis از طریق یک تونل خصوصی و رمزنگاری‌شده به هم متصل می‌شوند. این روش از باز کردن مستقیم پورت Redis روی اینترنت بسیار امن‌تر است.

۳. استفاده از SSH Tunnel

برای اتصال موقت یا مدیریت، می‌توانید از SSH Tunnel استفاده کنید:

ssh -L 8000:127.0.0.1:6379 user@YOUR_REDIS_SERVER_IP

سپس روی سیستم خودتان به Redis از طریق پورت ۸۰۰۰ وصل می‌شوید:

redis-cli -p 8000

اگر ACL فعال است:

redis-cli -p 8000 --user appuser --askpass

استفاده از Unix Socket برای امنیت بیشتر

اگر اپلیکیشن و Redis روی یک سرور هستند، لازم نیست حتماً از TCP Port استفاده کنید. می‌توانید Redis را از طریق Unix Socket در دسترس اپلیکیشن قرار دهید. این روش هم سریع‌تر است و هم سطح حمله شبکه را کاهش می‌دهد.

در فایل تنظیمات Redis:

sudo nano /etc/redis/redis.conf

این تنظیمات را فعال کنید:

unixsocket /var/run/redis/redis.sock
unixsocketperm 770

سپس Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

اتصال با redis-cli از طریق socket:

redis-cli -s /var/run/redis/redis.sock

اگر وب‌سرور یا PHP-FPM باید از این socket استفاده کند، باید کاربر مربوطه عضو گروه مناسب باشد یا سطح دسترسی socket به‌شکل درست تنظیم شود.

تنظیم محدودیت حافظه Redis

Redis داده‌ها را عمدتاً در RAM نگه می‌دارد. اگر برای Redis محدودیت حافظه تعیین نکنید، ممکن است در شرایط خاص RAM سرور پر شود و سرویس‌های دیگر مثل وب‌سرور، PHP-FPM یا دیتابیس هم دچار مشکل شوند.

فایل تنظیمات را باز کنید:

sudo nano /etc/redis/redis.conf

برای مثال، اگر می‌خواهید Redis حداکثر ۲ گیگابایت RAM مصرف کند:

maxmemory 2gb

سپس باید سیاست حذف داده‌ها هنگام پر شدن حافظه را مشخص کنید:

maxmemory-policy allkeys-lru

سیاست allkeys-lru یعنی Redis هنگام رسیدن به محدودیت حافظه، کلیدهایی را که کمتر استفاده شده‌اند حذف می‌کند. این سیاست برای Redis به‌عنوان کش انتخاب رایجی است.

اگر Redis شما برای داده‌های مهم و غیرقابل حذف استفاده می‌شود، باید سیاست حافظه را با دقت بیشتری انتخاب کنید. برای کش وردپرس و Object Cache معمولاً حذف کلیدهای قدیمی قابل قبول است، اما برای صف‌ها یا Sessionها باید سناریو دقیق‌تر بررسی شود.

محدودسازی دستورات خطرناک Redis

در روش‌های قدیمی، گاهی دستورهای خطرناک Redis مثل FLUSHALL یا CONFIG را rename می‌کردند. اما روش مدرن‌تر و تمیزتر، استفاده از ACL است.

دستورهایی مثل موارد زیر می‌توانند خطرناک باشند:

  • FLUSHALL: حذف همه داده‌ها
  • FLUSHDB: حذف داده‌های دیتابیس فعلی
  • CONFIG: تغییر تنظیمات Redis
  • DEBUG: دستورات دیباگ حساس
  • SHUTDOWN: خاموش کردن Redis

برای محدود کردن این دستورات، می‌توانید ACL کاربر را محدودتر تعریف کنید:

user appuser on >YOUR_STRONG_PASSWORD ~* &* +@read +@write +@connection -@dangerous -FLUSHALL -FLUSHDB -CONFIG -DEBUG -SHUTDOWN

این رویکرد از نظر نگهداری و سازگاری با کلاینت‌ها بهتر از rename کردن دستورهاست.

مانیتورینگ و بررسی لاگ‌های Redis

بعد از نصب و امن‌سازی Redis، باید رفتار آن را مانیتور کنید. لاگ‌ها می‌توانند خطاهای اتصال، تلاش‌های ناموفق احراز هویت، مشکلات حافظه، خطاهای Persistence و اختلالات سرویس را نشان دهند.

بررسی وضعیت سرویس Redis

sudo systemctl status redis-server

مشاهده زنده لاگ Redis با journalctl

sudo journalctl -u redis-server.service -f

اگر سرویس شما با نام redis شناخته می‌شود:

sudo journalctl -u redis.service -f

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

  • تلاش‌های زیاد برای اتصال از IPهای ناشناس
  • خطاهای احراز هویت
  • خطاهای مربوط به حافظه
  • خطاهای ذخیره‌سازی RDB یا AOF
  • خطاهای TLS یا Certificate

فعال‌سازی Redis Slow Log

Slow Log دستورهایی را ثبت می‌کند که اجرای آن‌ها بیش از حد مشخص طول کشیده است. این قابلیت برای پیدا کردن کوئری‌های کند و رفتارهای غیرعادی مفید است.

در فایل تنظیمات Redis:

sudo nano /etc/redis/redis.conf

این تنظیمات را اضافه یا اصلاح کنید:

slowlog-log-slower-than 10000
slowlog-max-len 128

عدد ۱۰۰۰۰ یعنی دستورهایی که بیشتر از ۱۰ میلی‌ثانیه طول بکشند ثبت شوند؛ چون مقدار بر اساس میکروثانیه است.

برای مشاهده Slow Log:

redis-cli --user appuser --askpass SLOWLOG GET

یا اگر با socket وصل می‌شوید:

redis-cli -s /var/run/redis/redis.sock --user appuser --askpass SLOWLOG GET

تنظیم Persistence و بکاپ Redis

Redis داده‌ها را در حافظه نگه می‌دارد، اما می‌تواند آن‌ها را روی دیسک هم ذخیره کند تا در صورت ری‌استارت یا خاموشی سرور، داده‌ها از بین نروند. دو روش اصلی Persistence در Redis وجود دارد:

  • RDB: گرفتن Snapshot از داده‌ها در بازه‌های زمانی مشخص
  • AOF: ثبت عملیات نوشتن در فایل Append Only برای دوام بیشتر داده‌ها

RDB چیست؟

RDB در بازه‌های مشخص از داده‌ها Snapshot می‌گیرد. این روش معمولاً سریع‌تر و سبک‌تر است، اما ممکن است در صورت Crash، تغییرات چند دقیقه آخر از دست برود.

AOF چیست؟

AOF هر عملیات نوشتن را ثبت می‌کند. این روش دوام داده بهتری دارد، اما فایل‌های بزرگ‌تری تولید می‌کند و ممکن است نیازمند rewrite دوره‌ای باشد.

فعال‌سازی AOF

برای فعال کردن AOF، در /etc/redis/redis.conf این گزینه را تنظیم کنید:

appendonly yes

سپس Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

محل فایل‌های داده Redis

در Ubuntu، مسیر رایج داده‌های Redis این است:

/var/lib/redis

برای بررسی فایل‌ها:

sudo ls -lah /var/lib/redis

باید مطمئن شوید فایل‌های Redis مالکیت و دسترسی مناسبی دارند و برای همه کاربران قابل خواندن نیستند.

بکاپ گرفتن از Redis

برای بکاپ، بسته به تنظیمات شما باید فایل‌هایی مثل dump.rdb یا فایل‌های AOF را در برنامه بکاپ قرار دهید.

نمونه بکاپ ساده:

sudo tar -czvf redis-backup-$(date +%F).tar.gz /var/lib/redis

برای امنیت بیشتر، بکاپ را رمزنگاری کنید و در یک محل خارج از سرور نگه دارید:

gpg -c redis-backup-$(date +%F).tar.gz

نکته مهم این است که فقط بکاپ گرفتن کافی نیست. باید هر چند وقت یک‌بار بازیابی بکاپ را روی یک سرور تست یا staging امتحان کنید.

استفاده از Redis برای وردپرس و Object Cache

یکی از کاربردهای رایج Redis در سایت‌های وردپرسی، استفاده به‌عنوان Object Cache است. در این حالت، بخشی از داده‌هایی که وردپرس مرتباً از دیتابیس می‌خواند، در Redis ذخیره می‌شود تا فشار روی MySQL یا MariaDB کاهش پیدا کند.

این موضوع برای سایت‌های پرترافیک، فروشگاه‌های WooCommerce، سایت‌های عضویت‌محور و سایت‌هایی که کوئری‌های زیاد دارند بسیار مفید است.

برای استفاده از Redis در وردپرس معمولاً این مراحل لازم است:

  • نصب Redis روی سرور
  • فعال بودن PHP Redis Extension
  • نصب افزونه Object Cache مناسب در وردپرس
  • تنظیم اتصال به Redis از طریق localhost، socket یا IP داخلی
  • تست وضعیت Object Cache در پیشخوان وردپرس

اگر سایت شما روی هاست وردپرس یا هاست لینوکس قرار دارد، امکان استفاده از Redis به تنظیمات سرویس میزبانی بستگی دارد. اما در VPS یا سرور اختصاصی، کنترل کامل‌تری برای نصب و پیکربندی Redis دارید.

عیب‌یابی خطاهای رایج Redis

خطای Connection refused

این خطا یعنی کلاینت نمی‌تواند به Redis وصل شود. موارد زیر را بررسی کنید:

sudo systemctl status redis-server
ss -tulpen | grep redis
sudo ufw status

دلایل رایج:

  • Redis اجرا نیست.
  • Redis روی آدرس موردنظر listen نمی‌کند.
  • فایروال اتصال را مسدود کرده است.
  • پورت اشتباه استفاده شده است.

خطای NOAUTH Authentication required

این خطا یعنی Redis احراز هویت می‌خواهد. باید با کاربر و رمز درست وصل شوید:

redis-cli --user appuser --askpass

خطای WRONGPASS invalid username-password pair

این خطا یعنی نام کاربری یا رمز اشتباه است. تنظیمات ACL را بررسی کنید:

sudo nano /etc/redis/redis.conf

و بعد از اصلاح، Redis را ری‌استارت کنید:

sudo systemctl restart redis-server

Redis فقط از داخل سرور وصل می‌شود، اما از بیرون نه

این حالت معمولاً به یکی از این موارد مربوط است:

  • Redis فقط روی localhost bind شده است.
  • فایروال پورت ۶۳۷۹ را بسته است.
  • Security Group یا فایروال دیتاسنتر اجازه اتصال نمی‌دهد.
  • Redis باید از طریق VPN یا SSH Tunnel استفاده شود، نه اتصال مستقیم.

در اغلب سناریوها، این رفتار یعنی Redis امن‌تر تنظیم شده و الزاماً مشکل نیست.

خطای TLS هنگام اتصال

اگر TLS فعال است اما اتصال انجام نمی‌شود، این موارد را بررسی کنید:

  • مسیر فایل‌های certificate در redis.conf درست باشد.
  • مالکیت فایل‌ها برای کاربر redis قابل خواندن باشد.
  • در redis-cli گزینه --tls و --cacert را وارد کرده باشید.
  • اگر mTLS فعال است، client certificate و key هم ارسال شده باشد.

Redis حافظه زیادی مصرف می‌کند

مصرف حافظه را بررسی کنید:

redis-cli --user appuser --askpass INFO memory

اگر Redis به‌عنوان کش استفاده می‌شود، حتماً maxmemory و maxmemory-policy را تنظیم کنید.

چک‌لیست امنیت Redis روی سرور Ubuntu

  • Redis فقط روی localhost، socket یا IP خصوصی listen کند.
  • پورت ۶۳۷۹ برای همه اینترنت باز نباشد.
  • کاربر پیش‌فرض Redis غیرفعال شود.
  • به‌جای requirepass از ACL استفاده شود.
  • برای هر اپلیکیشن، کاربر جدا با حداقل دسترسی لازم ساخته شود.
  • دستورهای خطرناک با ACL محدود شوند.
  • اگر Redis از راه دور استفاده می‌شود، VPN، SSH Tunnel یا TLS فعال باشد.
  • فایروال فقط IPهای قابل اعتماد را مجاز کند.
  • برای Redis محدودیت حافظه تعریف شود.
  • Slow Log فعال و لاگ‌ها مانیتور شوند.
  • Persistence متناسب با نیاز پروژه تنظیم شود.
  • فایل‌های RDB/AOF در برنامه بکاپ قرار بگیرند.
  • بکاپ‌ها رمزنگاری و خارج از سرور نگهداری شوند.
  • بازیابی بکاپ به‌صورت دوره‌ای تست شود.
  • سیستم‌عامل و Redis به‌روزرسانی شوند.

سوالات متداول درباره نصب و امن‌سازی Redis در اوبونتو

Redis چیست؟

Redis یک سیستم ذخیره‌سازی داده بسیار سریع از نوع key-value و in-memory است که برای کش، Session، صف، Pub/Sub و داده‌های Real-time استفاده می‌شود.

پورت پیش‌فرض Redis چیست؟

پورت پیش‌فرض Redis عدد ۶۳۷۹ است. این پورت نباید بدون محدودیت روی اینترنت باز باشد.

آیا Redis باید روی اینترنت باز باشد؟

خیر. در بیشتر سناریوها Redis باید فقط روی localhost، شبکه خصوصی، VPN یا SSH Tunnel قابل دسترسی باشد. باز کردن مستقیم Redis روی اینترنت ریسک امنیتی جدی دارد.

برای امنیت Redis، requirepass کافی است؟

در نسخه‌های جدید Redis بهتر است به‌جای requirepass از ACL استفاده کنید. ACL امکان ساخت چند کاربر با دسترسی‌های متفاوت و محدودسازی دستورها را فراهم می‌کند.

آیا Redis به SSL یا TLS نیاز دارد؟

اگر Redis فقط روی همان سرور و از طریق localhost استفاده می‌شود، معمولاً TLS ضروری نیست. اما اگر ارتباط Redis از طریق شبکه بین چند سرور انجام می‌شود، TLS یا تونل امن بسیار مهم است.

برای وردپرس، Redis چه کاربردی دارد؟

در وردپرس، Redis معمولاً برای Object Cache استفاده می‌شود. این کار باعث کاهش فشار روی دیتابیس و بهبود سرعت سایت می‌شود، مخصوصاً در سایت‌های پرترافیک یا فروشگاه‌های WooCommerce.

تفاوت RDB و AOF در Redis چیست؟

RDB از داده‌ها Snapshot دوره‌ای می‌گیرد و سبک‌تر است. AOF عملیات نوشتن را ثبت می‌کند و دوام داده بهتری دارد، اما ممکن است فایل‌های بزرگ‌تری ایجاد کند. برای بسیاری از سناریوهای Production، ترکیب هر دو روش مناسب است.

چطور بفهمم Redis در حال اجراست؟

با دستور زیر وضعیت Redis را بررسی کنید:

sudo systemctl status redis-server

همچنین با redis-cli و دستور ping باید پاسخ PONG دریافت کنید.

چطور بفهمم Redis روی چه آدرسی listen می‌کند؟

از دستور زیر استفاده کنید:

ss -tulpen | grep redis

اگر خروجی شامل ۰.۰.۰.۰:۶۳۷۹ باشد، Redis روی همه IPها گوش می‌دهد و باید تنظیمات امنیتی را بررسی کنید.

جمع‌بندی

نصب Redis در اوبونتو کار سختی نیست؛ با چند دستور ساده می‌توان Redis را نصب و اجرا کرد. اما اگر هدف شما استفاده واقعی در سایت، اپلیکیشن یا سرور Production است، نصب ساده کافی نیست. Redis باید با دقت امن‌سازی شود.

مهم‌ترین اصول امنیت Redis عبارت‌اند از: محدود کردن Redis به localhost یا شبکه خصوصی، استفاده از ACL، غیرفعال کردن کاربر پیش‌فرض، محدودسازی دستورات خطرناک، تنظیم فایروال، استفاده از TLS یا تونل امن برای اتصال از راه دور، تعریف محدودیت حافظه، مانیتورینگ لاگ‌ها و داشتن بکاپ منظم.

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

منابع پیشنهادی برای مطالعه بیشتر