نصب Redis روی اوبونتو و امن سازی آن

برای نصب Redis روی اوبونتو بسته redis-server را با apt نصب کنید، رمز را فعال کنید، آدرس گوش دادن را روی 127.0.0.1 نگه دارید و با redis-cli ping وضعیت را بررسی کنید. مهم‌ترین نکته امنیتی این است که Redis را هرگز با آدرس عمومی و بدون رمز در اینترنت باز نگذارید؛ نمونه‌های زیادی از سرورهای Redis بازمانده در اینترنت با این اشتباه آلوده شده‌اند.

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

مرحله اول: نصب Redis روی اوبونتو

sudo apt update
sudo apt install redis-server

نسخه و وضعیت را ببینید:

redis-server --version
systemctl status redis-server

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

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

redis-cli ping

جواب PONG یعنی Redis کار می‌کند. چند دستور ساده برای آشنایی:

redis-cli set mykey "hello"
redis-cli get mykey
redis-cli del mykey

مرحله سوم: تنظیمات اصلی

فایل کانفیگ /etc/redis/redis.conf است. چند تنظیم مهم را بررسی کنید:

bind 127.0.0.1 -::1
protected-mode yes
requirepass STRONG_PASSWORD
supervised systemd

گزینه bind تعیین می‌کند Redis روی کدام آدرس گوش بدهد. مقدار پیش‌فرض فقط حلقه محلی است و بهتر است همین بماند، مگر اینکه برنامه روی ماشین دیگری باشد. requirepass رمز را فعال می‌کند؛ رمز را طولانی و تصادفی بگذارید، چون Redis بسیار سریع است و حدس رمز را کند نمی‌کند. بعد از ویرایش، سرویس را ری‌استارت کنید:

sudo systemctl restart redis-server
redis-cli -a 'STRONG_PASSWORD' ping

دستور ping با رمز روی خط فرمان هشدار می‌دهد که رمز در تاریخچه دستورها می‌ماند. برای آزمایش مشکلی ندارد، ولی در اسکریپت‌ها رمز را از متغیر محیطی یا فایل با دسترسی محدود بخوانید.

نکته امنیتی: Redis را روی اینترنت باز نگذارید

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

  • bind را فقط روی آدرس خصوصی همان سرور بگذارید و 0.0.0.0 را به کار نبرید.
  • در فایروال، پورت 6379 را فقط برای IP همان ماشین باز کنید.
  • رمز را فعال کنید و در صورت امکان از ACL با کاربر محدود استفاده کنید.
  • با ابزار تست پورت باز مطمئن شوید پورت از بیرون در دسترس نیست.

روش نوشتن قوانین فایروال در لینوکس در راهنمای مدیریت فایروال سرور و مقاله‌های مربوط به UFW آمده و هدف همان است: ترافیک را فقط از ماشین‌های مجاز بپذیرید.

ماندگاری داده: RDB و AOF

Redis داده را در حافظه نگه می‌دارد، ولی می‌تواند روی دیسک هم ذخیره کند تا با ری‌استارت از دست نرود. دو روش دارد. RDB در بازه‌های مشخص از کل داده عکس می‌گیرد و فشرده و سریع است. AOF هر عمل نوشتن را ثبت می‌کند و دقت بیشتری دارد ولی فایل بزرگ‌تر می‌شود. تنظیم‌ها در redis.conf:

save 900 1
save 300 10
appendonly yes
appendfsync everysec

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

محدود کردن حافظه

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

maxmemory 512mb
maxmemory-policy allkeys-lru

سیاست allkeys-lru وقتی حافظه پر شود، کم‌استفاده‌ترین کلیدها را حذف می‌کند و برای کش مناسب است. اگر داده نباید حذف شود، سیاست noeviction را بگذارید؛ آن‌وقت Redis بعد از پر شدن خطا برمی‌گرداند. اندازه واقعی را با نیاز برنامه و حافظه آزاد سرور تنظیم کنید و مصرف را پایش کنید: redis-cli info memory.

اتصال PHP و وردپرس به Redis

برای وردپرس، افزونه PHP را نصب کنید و بعد افزونه وردپرسی که از Redis پشتیبانی می‌کند، مثل Redis Object Cache، را فعال کنید:

sudo apt install php-redis
sudo systemctl restart php8.3-fpm

شماره نسخه PHP را با سرور خودتان تطبیق دهید. در wp-config.php میزبان، پورت و رمز را بنویسید:

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', 'STRONG_PASSWORD' );

این کش برای سایت‌هایی که کوئری زیاد دارند، مثل فروشگاه‌ها، بیشتر اثر دارد. مقایسه اثر آن با تنظیمات PHP-FPM و OPcache را اندازه‌گیری کنید و فقط وقتی نگهش دارید که زمان پاسخ واقعاً بهتر شده باشد.

دستورهای مفید برای عیب‌یابی

redis-cli info server
redis-cli info clients
redis-cli info memory
redis-cli dbsize
redis-cli --latency
redis-cli monitor

دستور monitor همه درخواست‌ها را زنده نشان می‌دهد و روی سرور شلوغ بار می‌گذارد؛ فقط کوتاه‌مدت استفاده کنید. دستور KEYS * را روی سرور تولیدی اجرا نکنید، چون روی دیتابیس بزرگ پردازش را قفل می‌کند؛ به‌جای آن از SCAN استفاده کنید.

خطاهای رایج

نشانهعلت و راه حل
NOAUTH Authentication requiredرمز فعال است و کلاینت رمز نفرستاده
Could not connect to Redis at 127.0.0.1:6379سرویس خاموش است یا روی آدرس دیگری گوش می‌دهد
OOM command not allowed when used memory > 'maxmemory'حافظه پر شده و سیاست حذف noeviction است
اتصال از ماشین دیگر برقرار نمی‌شودbind فقط محلی است یا فایروال پورت را بسته
سرویس بعد از ری‌استارت بالا نمی‌آیدخطای نگارشی در redis.conf؛ journalctl -u redis-server را بخوانید

سوالات متداول

Redis جای دیتابیس را می‌گیرد؟

برای داده‌ای که باید ماندگار و ساختاریافته باشد، نه. Redis بیشتر مکمل است: کش، نشست و صف. داده اصلی در MySQL یا PostgreSQL می‌ماند.

Redis و Memcached چه فرقی دارند؟

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

آیا Redis را باید با رمز تنظیم کنم، حتی روی 127.0.0.1؟

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

چقدر حافظه به Redis بدهم؟

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

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *