بلاگ ابرفردوسی > آموزش سرور ابری : نصب و کانفیگ Redis (ردیس) در سرور لینوکس

نصب و کانفیگ Redis (ردیس) در سرور لینوکس

نصب و کانفیگ redis

نصب و کانفیگ Redis به‌معنای پیاده‌سازی و تنظیم دقیق این پایگاه داده‌ی In-Memory روی سرور است تا بتواند نقش کش سرور را برای افزایش سرعت سایت و کاهش بار دیتابیس اصلی به پایدارترین شکل ممکن ایفا کند. همان‌طورکه می‌دانید، بالا آوردن سرویس ردیس روی سرور لینوکس، فقط با اجرای یکی دو خط دستور ساده تمام می‌شود. اما چالش اصلی دقیقاً از جایی شروع می‌شود که این سرویس را با همان تنظیمات پیش‌فرضِ کارخانه، بدون رمز عبور و مدیریت حافظه رها کنید؛ اشتباهی که خیلی زود به مصرف بی‌رویه منابع سرور، خطاهای مکرر اتصال یا حتی نفوذهای امنیتی ختم می‌شود.

در این مقاله ابر فردوسی، از مرحله نصب اولیه روی توزیع‌های مختلف (Ubuntu، Debian و AlmaLinux) شروع خواهیم کرد و کانفیگ اولیه، تغییر پورت و مدیریت محدودیت‌های RAM تا امن‌سازی سرویس و رفع خطاهای رایج را قدم‌به‌قدم باهم بررسی خواهیم کرد.

Redis دقیقاً چه کاری انجام می‌دهد؟

وقتی صحبت از دیتابیس می‌شود، ناخودآگاه یاد هارد دیسک (HDD یا SSD) می‌افتیم. اما هرچقدر هم درایو سرور شما سریع باشد، سرعت خواندن اطلاعات از روی آن برای اپلیکیشن‌های مدرن و پرترافیک کافی نیست. اینجا است که Redis کاربرد خودش را نشان می‌دهد؛ یک پایگاه داده از نوع In-Memory Data Store که داده‌ها را مستقیماً روی RAM سرور نگه می‌دارد.

به زبان ساده‌تر، ردیس داده‌ها را از قفسه بایگانی (هارد دیسک) درمی‌آورد و دقیقاً روی میز کار شما (RAM) می‌گذارد تا در کسری از میلی‌ثانیه به آن‌ها دسترسی داشته باشید.

توسعه‌دهندگان از ردیس فقط به‌عنوان یک دیتابیس ساده استفاده نمی‌کنند. مهم‌ترین کاربردهای این سرویس عبارتنداز:

  1. کشینگ (Caching): ذخیره نتایج کوئری‌های سنگین دیتابیس اصلی (مثل MySQL) تا برای درخواست‌های مشابه بعدی، نیازی به پردازش مجدد نباشد. این همان چیزی است که به‌عنوان کش سرور لینوکس می‌شناسیم.
  2. مدیریت نشست‌ها: نگهداری اطلاعات ورود کاربران (مثل توکن‌ها) در حافظه رم برای دسترسی لحظه‌ای و بدون تاخیر
  3. مدیریت صف (Message Queue): پردازش کارهای پس‌زمینه به‌صورت صف‌های منظم، بدون اینکه هسته اصلی اپلیکیشن درگیر شود.

مثال واقعی از Redis برای سایت فروشگاهی

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

اما با افزایش سرعت سایت با Redis Cache، قیمت و موجودی فقط یک بار از دیتابیس خوانده شده و در RAM ذخیره می‌شود. حالا تمام هزاران کاربر بعدی، اطلاعات را مستقیماً از حافظه رم می‌خوانند. به همین دلیل است که استفاده از Redis برای سایت فروشگاهی، تا حد زیادی به الزام تبدیل شده است.

پیش‌نیازهای نصب و راه‌اندازی Redis روی سرور لینوکس

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

برای شروع به موارد زیر نیاز دارید:

پیش‌نیازهاتوضیحات فنی
سیستم‌عامل پشتیبانی‌شدهتوزیع‌های لینوکسی معتبر (Ubuntu، Debian یا خانواده RHEL مثل AlmaLinux و CentOS)
سطح دسترسیدسترسی root سرور یا کاربری با دسترسی sudo برای اجرای دستورات سیستمی
منابع سخت‌افزاری (RAM)حداقل ۵۱۲ مگابایت رم آزاد (برای پروژه‌های تستی) / تخصیص رم متناسب با حجم داده‌ها در پروژه‌های واقعی

چرا نوع سرور در اجرای Redis به‌شدت مهم است؟

این یک قانون نانوشته اما قطعی است: در Redis، به‌جای پردازنده (CPU) حرف اول و آخر را RAM می‌زند. ازآنجایی‌که ردیس تمام داده‌ها را در حافظه اصلی نگه می‌دارد، اگر سرور شما با کمبود رم مواجه شود، سیستم‌عامل برای جبران آن به سراغ Swap (استفاده از هارد دیسک به جای رم) می‌رود. در این لحظه، تمام فلسفه وجودی ردیس که همان «سرعت» است نابود می‌شود. به همین دلیل است که اجرای این سرویس روی هاست‌های اشتراکی ضعیف معمولاً با شکست مواجه می‌شود. سرور بهینه برای Redis باید منابع کاملاً اختصاصی و ایزوله داشته باشد تا هیچ پروسه دیگری روی حافظه آن تاثیر نگذارد.

آموزش نصب Redis روی لینوکس (گام‌به‌گام)

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

آموزش نصب Redis روی Ubuntu و دبیان

در اوبونتو و دبیان، ردیس در مخازن رسمی سیستم‌عامل وجود دارد؛ بنابراین نصب آن بی‌دردسر است. ابتدا لیست پکیج‌ها را آپدیت کنید و سپس پکیج redis-server را نصب کنید:

sudo apt update
sudo apt install redis-server
نمایش دستور sudo apt install redis-server برای نصب و کانفیگ redis

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

sudo systemctl enable redis-server
sudo systemctl start redis-server

برای اطمینان از وضعیت سرویس:

sudo systemctl status redis

اگر عبارت active (running) را به رنگ سبز دیدید، یعنی همه‌چیز در اوبونتوی شما آماده است.

نمایش دستور sudo systemctl status redis

نصب Redis روی CentOS و AlmaLinux

توزیع‌های خانواده RedHat معمولاً در ارائه پکیج‌ها محتاط‌تر عمل می‌کنند. پکیج ردیس در مخازن پیش‌فرض CentOS یا AlmaLinux وجود ندارد؛ بنابراین پیش‌از نصب Redis، باید مخزن EPEL (بسته‌های اضافی برای لینوکس سازمانی) را به سرور اضافه کنیم:

sudo dnf install epel-release

(نکته: در نسخه‌های قدیمی‌تر CentOS، شاید نیاز باشد به‌جای dnf از yum استفاده کنید).

حالا مسیر نصب باز است:

sudo dnf install redis

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

sudo systemctl enable redis
sudo systemctl start redissudo systemctl enable redis

تست نصب Redis

تست سلامت Redis در یک نگاه

نصب تمام شد، سرویس هم درحال اجراست؛ اما آیا واقعاً می‌تواند داده‌ای را روی RAM بنویسد و بخواند؟ یکی از اشتباهات رایج این است که بلافاصله بعداز نصب به‌سراغ کانفیگ Redis برویم، بدون اینکه مطمئن شویم موتور اصلی سالم است. برای صحبت‌کردن با این دیتابیس، ابزاری به نام redis-cli (رابط خط فرمان ردیس) در اختیار داریم.

برای ورود به محیط ردیس، در ترمینال تایپ کنید:

redis-cli

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

127.0.0.1:6379> ping
/---------/
PONG

شنیدن پاسخ PONG از سمت سرور، یعنی ردیس بیدار است و ارتباط برقرار شده.

اما بیایید یک قدم فراتر برویم و قابلیت ذخیره و فراخوانی داده (Set & Get) را تست کنیم تا مطمئن شویم درگیری با حافظه رم درست انجام می‌شود. ابتدا یک کلید تستی می‌سازیم و مقداری به آن می‌دهیم:

127.0.0.1:6379> set mykey "FerdowsiCloud"
/---------/
OK

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

127.0.0.1:6379> get mykey
/---------/
"FerdowsiCloud"

اگر رشته‌ای که ذخیره کرده بودید (در اینجا FerdowsiCloud) با موفقیت برگشت داده شد، خسته نباشید! موتور کش شما کاملاً سالم است. برای خروج از محیط redis-cli کافیست کلمه exit را تایپ کنید.

آشنایی با فایل کانفیگ Redis

تمام رفتارها و قوانین ردیس در یک فایل متنیِ نسبتاً طولانی و پر از کامنت به نام redis.conf ذخیره می‌شود که باید برای عملکرد بهتر آن‌ها را خودمان تنظیم کنیم. در آموزش نصب و کانفیگ Redis، پیش‌از اینکه وارد فاز عملی کانفیگ شویم، بهتر است بدانید این فایل کجاست و قرار است با کدام بخش‌های آن سر و کله بزنیم.

مسیر این فایل بسته به سیستم‌عامل شما کمی متفاوت است:

  • در Ubuntu و Debian: مسیر فایل /etc/redis/redis.conf است.
  • در CentOS و AlmaLinux: مسیر فایل معمولاً /etc/redis.conf است.

وقتی این فایل را باز می‌کنید، با انبوهی از تنظیمات مواجه می‌شوید، اما برای شروع کار، چهار پارامتر حیاتی زیر از همه مهم‌تر هستند:

  • bind: مشخص می‌کند ردیس به کدام IPها گوش دهد (آیا همه دنیا می‌توانند به آن وصل شوند یا فقط سرور محلی؟).
  • port: پورتی که سرویس روی آن اجرا می‌شود (پیش‌فرض روی ۶۳۷۹ است).
  • maxmemory: خط قرمز مصرف RAM؛ یعنی ردیس نهایتاً حق دارد چقدر از حافظه سرور لینوکس را اشغال کند.
  • appendonly: تنظیمات مربوط به ذخیره دائمی داده‌ها روی هارد تا درصورت ری‌استارت سرور، اطلاعات از بین نرود.

کانفیگ اولیه Redis

۴ قدم طلایی در کانفیگ اولیه Redis

رهاکردن ردیس با تنظیمات کارخانه، دقیقاً مثل این است که درِ گاوصندوق را باز بگذارید و روی آن بنویسید: «بفرمایید داخل!». پس اولین قدم در امن سازی Redis Server، تغییر همین تنظیمات پیش‌فرض است.

برای شروع، فایل کانفیگ را با ویرایشگر nano باز کنید (مسیر را براساس سیستم‌عامل خود انتخاب کنید):

sudo nano /etc/redis/redis.conf

حالا با استفاده از کلیدهای Ctrl+W موارد زیر را جستجو و تغییرات را اعمال کنید:

۱. تنظیم Bind روی Localhost (قطع دسترسی عمومی)

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

خط زیر را پیدا کنید و مطمئن شوید که فقط IP محلی (Localhost) تنظیم شده است:

bind 127.0.0.1 ::1

۲. تغییر پورت پیش‌فرض

ربات‌های هکر دنبال پورت ۶۳۷۹ هستند و مدام آن را اسکن می‌کنند. با یک تغییر ساده، آن‌ها را گمراه کنید. خط port 6379 را پیدا کنید و عدد آن را به یک پورت دلخواه و آزاد (مثلاً ۶۳۸۰ یا هر عدد چهار/پنج رقمی دیگر) تغییر دهید:

port 8549

۳. فعال‌سازی رمز عبور

حتی اگر دسترسی را به Localhost محدود کرده‌اید، بازهم قرار دادن رمز عبور یک لایه امنیتی ضروری است. خط # requirepass foobared را پیدا کنید، علامت # (کامنت) را از ابتدای آن بردارید و یک رمز عبور قدرتمند جایگزین foobared کنید:

requirepass passwordghaviHere!

۴. مدیریت حافظه

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

ابتدا خط maxmemory را پیدا کنید (یا به انتهای فایل اضافه کنید) و محدودیت حافظه را بنویسید (مثلاً ۲۵۶ مگابایت):

maxmemory 256mb

سپس باید سیاست حذف داده‌های قدیمی را مشخص کنید تا وقتی این ۲۵۶ مگابایت پر شد، ردیس ارور ندهد و به کارش ادامه دهد. خط maxmemory-policy را پیدا و آن را روی allkeys-lru تنظیم کنید:

maxmemory-policy allkeys-lru

(نکته: الگوریتم allkeys-lru به‌سادگی کلیدهایی را که کمتر از همه استفاده شده‌اند پاک می‌کند تا جا برای داده‌های جدید باز شود).

بعداز ذخیره کردن فایل (Ctrl+O و سپس Enter و Ctrl+X)، برای اینکه این تغییرات اعمال شوند، باید سرویس ردیس را یک‌بار ری‌استارت کنید:

sudo systemctl restart redis-server

امن‌سازی Redis Server

احتمالاً برایتان سؤال شده که چرا دیتابیسی به این قدرتمندی، تااین‌حد بی‌دفاع طراحی شده است؟ پاسخ ساده است: فلسفه Redis سرعت مطلق است. سازندگان ردیس فرض را بر این گذاشته‌اند که شما این سرویس را در یک شبکه داخلی ایزوله و کاملاً امن اجرا می‌کنید؛ بنابراین هرگونه لایه امنیتی پیچیده که باعث افت سرعت (حتی در حدّ میکروثانیه) شود، در تنظیمات پیش‌فرض حذف شده است.

اما در واقعیت و روی سرورهای ابری، داستان فرق می‌کند. امن سازی Redis Server فقط محدود به رمز عبور و تغییر پورت نیست و شما باید جلوی اشتباهات داخلی و دسترسی‌های ناخواسته را هم بگیرید. علاوه‌بر مواردی که در بخش کانفیگ اولیه (تنظیم Bind و Password) گفتیم، دو اقدام حیاتی زیر را حتماً انجام دهید:

۱. تغییر نام یا غیرفعال کردن دستورات خطرناک

پاک شدن کل کش به‌خاطر یک اشتباه تایپی کوچک در ترمینال یا دسترسی یک اسکریپت مخرب، کابوس هر مدیر سیستمی است. در ردیس دستوری به نام FLUSHALL وجود دارد که در کسری از ثانیه تمام داده‌های حافظه را دود می‌کند و به هوا می‌فرستد!

برای جلوگیری از این فاجعه، می‌توانید این دستورات را در فایل redis.conf تغییر نام داده یا کلاً غیرفعال کنید. کافیست خطوط زیر را به فایل کانفیگ اضافه کنید:

rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""

(نکته: قرار دادن “” در مقابل دستور، آن را به‌طور کامل غیرفعال می‌کند. اگر می‌خواهید فقط نام آن را عوض کنید، می‌توانید یک عبارت پیچیده مثل rename-command FLUSHALL “MY_SECRET_FLUSH_99” بنویسید).

۲. استفاده از فایروال (Firewall)

حتی با تغییر پورت در فایروال، سرور شما نباید به درخواست‌های خارجی روی پورت ردیس پاسخ دهد. اگر از UFW در اوبونتو استفاده می‌کنید، مطمئن شوید که پورت ردیس فقط برای لوکال‌هاست یا IP سرورهای وبِ موردتایید شما باز است:

sudo ufw deny 6379
sudo ufw allow from 192.168.1.50 to any port 6379

(در این مثال، فقط به سروری با آی‌پی 192.168.1.50 اجازه دادیم به ردیس متصل شود).

تنظیم Redis Persistence

همان‌طورکه می‌دانید، ردیس یک دیتابیس In-Memory است؛ یعنی همه‌چیز روی RAM سرور شما است. حالا اگر سرور کرش کند، برق دیتاسنتر برود یا سرویس را ری‌استارت کنید چه اتفاقی می‌افتد؟ درست است، تمام داده‌ها پاک می‌شوند!

در چنین مواردی است که تنظیم Redis persistence به داد ما می‌رسد. این ویژگی به ردیس اجازه می‌دهد تا کپی داده‌های درون RAM را روی هارد دیسک ذخیره کند که برای این کار دو مکانیزم اصلی دارد:

  • مکانیزم RDB (Redis Database Backup):

در این روش، ردیس در بازه‌های زمانی مشخص (مثلاً هر ۵ دقیقه یک‌بار)، یک اسنپ‌شات کامل از کل داده‌ها می‌گیرد و در فایلی به نام dump.rdb ذخیره می‌کند.

  • مکانیزم AOF (Append Only File):

در این روش، ردیس هر دستور Write (نوشتن) که سمت سرور می‌آید را در یک فایل متنی لاگ می‌کند و درصورت ری‌استارت، تمام این دستورات را از اول اجرا می‌کند تا داده‌ها برگردند.

تفاوت RDB و AOF در یک نگاه

کدام روش بهتر است؟ (تنظیمات پیشنهادی)

انتخاب بین این دو کاملاً به سناریوی مصرف شما بستگی دارد:

  • اگر ردیس فقط نقش Cache را دارد:

نیازی به حساسیت بالا نیست. روش RDB به‌تنهایی کفایت می‌کند. حتی در سایت‌های بسیار پربازدید که I/O هارد دیسک برایشان حیاتی است، مدیران سرور کلاً Persistence را غیرفعال می‌کنند؛ چون اگر کش پاک شود، نهایتاً با چند ثانیه تاخیر دوباره از دیتابیس اصلی (MySQL) ساخته می‌شود.

  • اگر ردیس دیتابیس اصلی یا مدیر صف (Queue) است:

در اینجا از دست رفتن حتی یک رکورد هم مساوی با فاجعه است. بهترین معماری برای این حالت، فعال‌سازی همزمان RDB و AOF است تا هم سرعت بازیابی بالا باشد و هم امنیت داده‌ها صددرصد حفظ شود.

برای فعال‌سازی AOF (که به‌صورت پیش‌فرض خاموش است)، در فایل redis.conf مقدار زیر را تغییر دهید:

appendonly yes

بهینه‌سازی Redis برای عملکرد بهتر

چک‌لیست بهینه‌سازی کرنل برای Redis

اگر تا اینجای مسیر، فایل لاگ سرویس را باز کرده باشید، به احتمال زیاد با چند Warning (اخطار) زرد رنگ مواجه شده‌اید که سیستم‌عامل به ردیس گیر داده است. واقعیت این است که برای داشتن سرور بهینه برای Redis، فقط دست‌کاری فایل redis.conf کافی نیست؛ ما باید خود سیستم‌عامل (کرنل لینوکس) را هم برای میزبانی بی‌نقص از این دیتابیس تربیت کنیم.

در این بخش، تنظیماتی را انجام می‌دهیم که تفاوت بین کانفیگ آماتور و کانفیگ در سطح Enterprise را در نصب و کانفیگ Redis مشخص می‌کند.

۱. تنظیم vm.overcommit_memory

وقتی ردیس می‌خواهد روی هارد دیسک بکاپ بگیرد (همان مکانیزم RDB که در بخش قبل گفتیم)، یک کپی از خودش در پس‌زمینه می‌سازد. در این لحظه، لینوکس بررسی می‌کند که آیا رم کافی برای این کار وجود دارد یا نه. اگر لینوکس احساس کند رم کم است، جلوی عملیات را می‌گیرد و سرویس شما از کار می‌افتد. برای حل این مشکل، باید به سیستم‌عامل بگوییم: «همیشه فرض کن رم کافی داریم و درخواست‌های تخصیص حافظه را رد نکن»

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

sudo nano /etc/sysctl.conf

خط زیر را به انتهای فایل اضافه و ذخیره کنید:

vm.overcommit_memory = 1

سپس برای اعمال تغییرات بدون نیاز به ری‌استارت سرور، این دستور را بزنید:

sudo sysctl -p

۲. غیرفعال کردن THP (Transparent Huge Pages)

این دقیقاً همان اخطار معروفی است که ردیس موقع استارت شدن در ترمینال نشان می‌دهد. قابلیت THP در لینوکس، صفحات حافظه را به بلوک‌های بزرگ‌تر تبدیل می‌کند که برای برخی نرم‌افزارها عالی است. اما برای ردیس که با داده‌های بسیار کوچک سروکار دارد، این کار باعث ایجاد تاخیر شدید و قفل‌شدن موقت دیتابیس می‌شود.

برای غیرفعال کردن موقت آن (تا زمان ریبوت بعدی)، دستور زیر را اجرا کنید:

echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled

(نکته: برای دائمی کردن این تنظیم، معمولاً باید یک سرویس کوچک systemd بنویسید یا این دستور را در تنظیمات بوت سرور قرار دهید).

۳. انتخاب maxmemory-policy مناسب

در بخش‌های قبل، سقف مصرف حافظه را مشخص کردیم. اما وقتی این سقف پر شد، ردیس باید با داده‌های جدید چه کند؟ انتخاب سیاستِ حذف (Eviction Policy) مستقیماً به کاربرد شما بستگی دارد.

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

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

۴. جلوگیری از تکه‌تکه شدن حافظه

وقتی در یک دیتابیس مدام کلیدهای مختلف ساخته و پاک می‌شوند، حافظه رم مثل یک هارد دیسکِ قدیمی، پر از فضاهای خالی و پراکنده می‌شود (اصطلاحاً Fragment می‌شود). این موضوع باعث هدر رفتن شدید منابع خواهد شد. در نسخه‌های ۴ به بالای ردیس، قابلیت بی‌نظیری به نام Active Defrag وجود دارد که بدون نیاز به ری‌استارت، حافظه را در پس‌زمینه مرتب می‌کند.

کافیست در فایل redis.conf خط زیر را پیدا و از حالت کامنت خارج کنید:

activedefrag yes

اتصال Redis به اپلیکیشن‌ها

سرور ما کاملاً بهینه شده و آماده‌به‌کار است؛ اما یک دیتابیس ایزوله که با هیچ برنامه‌ای در ارتباط نیست، به چه دردی می‌خورد؟ حالا که مراحل سختِ نصب و کانفیگ Redis را پشت سر گذاشته‌ایم، باید این موتور قدرتمند را به اپلیکیشن‌های خود متصل کنیم.

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

۱. اتصال PHP به Redis

برای اتصال PHP به Redis، شما دو راه کاملاً متفاوت پیش رو دارید:

  • کتابخانه Predis: یک پکیج که کاملاً با زبان PHP نوشته‌شده و ازطریق Composer نصب می‌شود. راه‌اندازی آن راحت است، اما چون مفسر PHP باید آن را پردازش کند، کمی کندتر است.
  • اکستنشن PhpRedis: این افزونه به زبان C نوشته‌شده و مستقیماً روی خود PHP نصب می‌شود (به‌عنوان ماژول). اگر دنبال بالاترین سرعت هستید، حتماً سراغ این گزینه بروید. نصب PhpRedis روی اوبونتو با یک دستور ساده انجام می‌شود:
sudo apt install php-redis
sudo systemctl restart php-fpm

۲. استفاده از Redis در Laravel

فریم‌ورک لاراول عاشق ردیس است! در لاراول نیازی به کدهای پیچیده ندارید. کافیست پکیج predis را نصب کنید (یا همان اکستنشن php-redis را فعال داشته باشید) و سپس فایل .env پروژه را باز کنید. فقط با تغییر همین چند خط، تمام کش‌ها و سشن‌های لاراول روی ردیس سوار می‌شوند:

CACHE_DRIVER=redis
SESSION_DRIVER=redis
QUEUE_CONNECTION=redis

۳. استفاده از Redis در Django

در دنیای پایتون هم اوضاع همین‌قدر ساده است. برای نصب Redis برای Laravel و Django، پکیج‌های استانداردی وجود دارد. توسعه‌دهندگان جنگو معمولاً از پکیج django-redis استفاده می‌کنند. بعداز نصب پکیج با pip، کافیست تنظیمات کش را در فایل settings.py به این شکل تغییر دهید:

CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
}
}

کش سرور لینوکس در خدمت وردپرس

تفاوت وردپرس با Redis و بدون Redis

هرچقدر هم قالب سایت شما سبک باشد، هسته وردپرس و افزونه‌هایی مثل ووکامرس، ذاتا قاتلِ منابع دیتابیس (MySQL) هستند! در یک سایت پربازدید وردپرسی، برای لودشدن یک صفحه ساده ممکن است ده‌ها کوئری تکراری سمت دیتابیس ارسال شود؛ بنابراین باید به کانفیگ Redis برای وردپرس، نه به‌عنوان یک پیشنهاد لاکچری که به‌عنوان یک الزام حیاتی نگاه کرد.

مکانیزم Redis Object Cache چیست؟

به زبان ساده، وقتی وردپرس برای اولین بار یک کوئری به دیتابیس می‌فرستد (مثلاً لیست دسته‌بندی مقالات)، ردیس نتیجه این کوئری (Object) را می‌گیرد و در RAM ذخیره می‌کند. دفعه بعد که کاربر دیگری همان صفحه را باز کند، وردپرس اصلاً سمت MySQL نمی‌رود؛ بلکه اطلاعات را مستقیماً و در کسری از میلی‌ثانیه از ردیس می‌خواند.

تاثیر روی TTFB (Time to First Byte)

یکی از مهم‌ترین فاکتورهای سئو و تجربه کاربری، شاخص TTFB است؛ یعنی مدت زمانی که طول می‌کشد تا مرورگرِ کاربر، اولین بایت از اطلاعات را از سرور شما دریافت کند. وقتی دیتابیس درگیر باشد، TTFB به‌شدت بالا می‌رود (گاهی تا چند ثانیه). اما در اثر افزایش سرعت سایت با Redis Cache، پاسخ‌ها از روی رم خوانده می‌شوند و شاخص TTFB می‌تواند به زیر ۱۰۰ میلی‌ثانیه سقوط کند!

سناریوی نجات یک سایت فروشگاهی پرترافیک

اجازه دهید یک سناریوی واقعی را مرور کنیم. فرض کنید صاحب یک فروشگاه آنلاین کفش هستید و برای شب یلدا پیامک تبلیغاتی فرستاده‌اید. بدون Redis برای وردپرس، وقتی ۱۰۰ نفر همزمان روی یک مدل کفش کلیک می‌کنند، سرور باید ۱۰۰ بار قیمت، موجودی و نظرات را از هارد دیسک (MySQL) استخراج کند. نتیجه؟ خطای معروف 508 Resource Limit Is Reached یا کرش کردن دیتابیس.

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

خطاهای رایج Redis و روش رفع آن‌ها

خطاهای رایج Redis

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

در ادامه پرتکرارترین خطاهایی که معمولاً در لاگِ سرور (مسیر /var/log/redis/redis-server.log) با آن‌ها مواجه می‌شوید را بررسی می‌کنیم:

۱. رفع خطای Redis connection refused

این ارور احتمالاً  باید به‌عنوان کابوس شماره ۱ و معروف‌ترین خطای دنیای ردیس دسته‌بندی کنیم که مستقیماً می‌گوید: «درخواست اتصال شما رد شد!» برای رفع آن، اول از همه خونسردی خود را حفظ کنید. این ارور معمولاً به یکی از این سه دلیل ساده رخ می‌دهد:

  • سرویس Down شده است: ساده‌ترین حالت! با اجرای sudo systemctl status redis چک کنید که آیا سرویس اصلاً درحال اجراست یا Crashکرده است.
  • پورت اشتباه است: اگر در مرحله کانفیگ، پورت پیش‌فرض (۶۳۷۹) را تغییر داده‌اید، مطمئن شوید که اپلیکیشن شما (مثلاً افزونه وردپرس یا کدهای لاراول) درحال تلاش برای اتصال به همان پورت جدید است.
  • فایروال مسدود کرده است: اگر اپلیکیشن و ردیس روی دو سرور مجزا هستند، مطمئن شوید که پورتِ ردیس در فایروال سرورِ مقصد باز است.

۲. مشکل Bind و عدم دسترسی از بیرون

گاهی سرویس درحال اجرا است، روی شبکه محلی هم پینگ می‌دهد، اما سرورِ اپلیکیشن نمی‌تواند به آن متصل شود. این مشکل Bind است. همان‌طورکه در بخش کانفیگ Redis اشاره کردیم، اگر مقدار bind روی 127.0.0.1 تنظیم شده باشد، به هیچ موجودی خارج از سرورِ خودش پاسخ نمی‌دهد.

  • راه‌حل: فایل redis.conf را باز کنید و آی‌پی شبکه داخلی (Private IP) سروری که اپلیکیشن روی آن است را درکنار لوکال‌هاست اضافه کنید. (مثال: bind 127.0.0.1 10.0.0.5).

۳. خطای OOM (Out of Memory) و محدودیت رم

وقتی در لاگ‌ها با پیام OOM command not allowed when used memory > ‘maxmemory’ مواجه می‌شوید، یعنی ظرفِ حافظه لبریز شده است. این مشکل در پیاده‌سازی Redis در VPSهای ارزان‌قیمت یا هاست‌های اشتراکی به‌شدت شایع است.

  • راه‌حل اورژانسی: مقدار maxmemory-policy را روی allkeys-lru تنظیم کنید تا ردیس اجازه داشته باشد داده‌های قدیمی را دور بریزد و قفل نکند.
  • راه‌حل قطعی: دیتابیس شما درحال فریاد زدن برای RAM بیشتر است! باید به فکر سرور بهینه با منابع ایزوله باشید.

۴. ارور Permission Denied

گاهی ردیس استارت نمی‌شود و در لاگ پیام Fatal error, can’t open config file یا مشکلاتی در نوشتن فایلِ بکاپ (dump.rdb) می‌بینید. این یک مشکل کلاسیکِ لینوکسی است. یوزرِ مربوط به سرویسِ ردیس، سطح دسترسی لازم برای خواندن فایل کانفیگ یا نوشتن در دایرکتوری داده‌ها (معمولاً /var/lib/redis) را ندارد.

  • راه‌حل: با اجرای دستور زیر، مالکیت پوشه را به یوزر ردیس برگردانید:
sudo chown -R redis:redis /var/lib/redis

۵. ارور MISCONF (عدم توانایی در ذخیره بکاپ)

خطای MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk یکی از خطاهای به‌شدت روی اعصاب است! این ارور می‌گوید ردیس تلاش کرده روی هارد دیسک بکاپ بگیرد، اما نتوانسته و به همین دلیل برای جلوگیری از فاجعه، دریافت داده‌های جدید را کلاً متوقف کرده است.

  • راه‌حل: این مشکل معمولاً ناشی از کمبود فضای هارد دیسک یا عدم تنظیم vm.overcommit_memory (که در بخش بهینه‌سازی گفتیم) است. بررسی کنید که هارد سرور پر نشده باشد.

جدول راهنمای سریع عیب‌یابی Redis

برای اینکه بتوانید در مواقع بحرانی سریعاً مشکل را پیدا کنید، جدول زیر را به‌عنوان یک چک‌لیست دم‌دستی به خاطر بسپارید:

نشانه خطا (ارور در ترمینال یا لاگ)دلیل احتمالی مشکلاقدام سریع و مناسب
Connection Refusedخاموش بودن سرویس یا پورت اشتباهبررسی وضعیت سرویس با systemctl status و تطابق پورت در اپلیکیشن
Timeout / Network Errorبسته بودن پورت در فایروال یا مشکل Bindبررسی رول‌های UFW/iptables و چک‌کردن bind در فایل کانفیگ
OOM command not allowedپر شدن سقف حافظه (maxmemory)تغییر سیاست Eviction به allkeys-lru یا ارتقای RAM سرور
MISCONF Redis is configured…پر شدن هارد یا ارور Overcommit کرنلخالی کردن فضای هارد و اجرای sysctl vm.overcommit_memory=1
Permission Deniedعدم دسترسی یوزر redis به دایرکتوری‌هااصلاح مالکیت با chown -R redis:redis روی دایرکتوری دیتابیس

زیرساخت مناسب برای لود ۸۰۰ میلی‌ثانیه سایت با ردیس

بیایید تمام این مباحث فنی را در یک سناریوی واقعی خلاصه کنیم. در یکی از پروژه‌های فروشگاهی، زمان لود صفحات محصول در حالت عادی و با درگیری مستقیم دیتابیس MySQL حدود ۳ ثانیه بود. بعداز افزایش سرعت سایت با Redis Cache و اجرای دقیق تنظیماتی که در این مقاله بررسی کردیم، این زمان به ۸۰۰ میلی‌ثانیه کاهش پیدا کرد!

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

ردیس تشنه RAM است؛ گول سادگی‌اش را نخورید!

همان‌طورکه دیدیم، تمام قدرت ردیس به‌خاطر پردازش In-Memory (درون حافظه اصلی) است. اگر قصد راه‌اندازی Redis در VPSهای اشتراکی ارزان‌قیمت یا هاست‌های محدود را دارید، خودتان را برای ناپایداری‌های شدید، خطاهای OOM و دان‌تایم آماده کنید. وقتی سرور شما با همسایه‌های دیگر منابع مشترک داشته باشد، حافظه‌ای که برای ردیس درنظر گرفته‌اید هر لحظه ممکن است توسط یک پروسه دیگر بلعیده شود.

سرور بهینه برای Redis باید دارای منابع کاملاً اختصاصی (Dedicated) و محیطی کاملاً ایزوله باشد تا دیتابیس شما بدون افت پرفورمنس به درخواست‌ها پاسخ دهد.

سرور ابری؛ بهترین میزبان برای دیتابیس‌های In-Memory

برای پروژه‌های پروداکشن، به‌جای خرید سرورهای فیزیکی گران‌قیمت یا درگیری با محدودیت‌های VPS سنتی، اجاره سرور ابری از ابر فردوسی منطقی‌ترین کار ممکن است. اما چرا برای حصول کش سرور لینوکس پایدار، معماری ابری (Cloud) فردوسی را پیشنهاد می‌کنیم؟

  • مقیاس‌پذیری آنی (Scale-Up در لحظه): در ابر فردوسی، بدون نیاز به انتقال داده‌ها یا اختلال در عملکرد، با چند کلیک می‌توانید RAM سرور را افزایش دهید.
  • پرداخت به‌ازای مصرف: برای کمپین خود منابع را ارتقا دهید و پس‌از پایان کمپین، سرور را به حالت قبل برگردانید یا خاموش کنید. شما فقط هزینه همان ساعت‌هایی را می‌دهید که سرور روشن بوده است.
  • سخت‌افزار پرچم‌دار: وقتی صحبت از سرعت خواندن و نوشتن می‌شود، ترکیب رم‌های DDR4 و هاردهای NVMe روی سرورهای نسل جدید HPE (همراه با پردازنده‌های قدرتمند Intel و AMD EPYC) تفاوت را رقم می‌زند.
  • اتوماسیون با API: می‌توانید با استفاده از کلید API ابر فردوسی، اسکریپتی بنویسید که هر زمان مصرف حافظه ردیس به مثلاً ۸۰٪ رسید، منابع سرور به‌طور خودکار افزایش یابد.

یک پیشنهاد دوستانه

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

سرور ابری

 جمع‌بندی

نصب اولیه ردیس با یک دستور apt install در چند ثانیه تمام می‌شود. اما همان‌طورکه در این راهنما دیدیم، هنر یک ادمین حرفه‌ای در کانفیگ دقیق فایل redis.conf، مدیریت حافظه با سیاست‌های allkeys-lru، امن‌سازی دربرابر دستورات مخربی مثل FLUSHALL و از همه مهم‌تر، انتخاب یک زیرساخت قدرتمند است.

حالا شما بگویید. آیا تجربه از دست رفتن داده‌های ردیس به‌خاطر تنظیم نبودن RDB و AOF را داشته‌اید؟ یا با خطاهای عجیبِ کمبود حافظه دست‌وپنجه نرم کرده‌اید؟ تجربیات و سؤالات خود را در بخش نظرات همین پست بنویسید تا با هم عیب‌یابی‌شان کنیم.

منابع:
redis | redis use cases | install-redis | digitalocean | management redis | redis integrate | wp_object_cache | troubleshooting

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

Redis چیست و چرا برای سایت‌های وردپرسی و فروشگاهی ضروری است؟

ردیس یک دیتابیس In-Memory است که داده‌ها را به‌جای هارد دیسک، مستقیماً روی RAM نگه می‌دارد. در سایت‌های فروشگاهی یا وردپرسی که کوئری‌های دیتابیس بالا است، ردیس به‌عنوان کش سرور لینوکس عمل می‌کند و با خواندن اطلاعات از روی رم، سرعت لود صفحات را چند برابر افزایش می‌دهد و فشار را از روی سرور اصلی برمی‌دارد.

حداقل RAM موردنیاز برای نصب Redis چقدر است؟

برای آزمایش با ۵۱۲ مگابایت رم هم می‌توانید کار را شروع کنید، اما در محیط Production همه‌چیز به حجم دیتای شما بستگی دارد. فراموش نکنید که ردیس تماماً وابسته به رم است؛ پس همیشه فضایی بیشتر از حجم دیتای کش خود تخصیص دهید تا با خطای OOM (Out of Memory) مواجه نشوید.

آیا آموزش نصب Redis روی Ubuntu با خانواده RedHat (مثل CentOS) متفاوت است؟

کلیت کار یکی است؛ تفاوت اصلی در پکیج‌منیجرها و مخازن خلاصه می‌شود. آموزش نصب Redis روی Ubuntu با یک دستور ساده apt install انجام می‌شود، اما در CentOS یا AlmaLinux، ابتدا باید مخزن EPEL را به سیستم‌عامل بشناسانید و سپس سرویس را نصب کنید.

آیا قرار دادن رمز عبور برای امن‌سازی Redis Server مناسب است؟

خیر! پسورد فقط یک لایه از امنیت است. ردیس ذاتا برای شبکه‌های امن و داخلی طراحی‌شده. برای امنیت واقعی، باید حتماً تنظیمات bind را روی 127.0.0.1 (لوکال‌هاست) قفل کنید، پورت پیش‌فرض (۶۳۷۹) را تغییر دهید و با دستور rename-command، ترمزِ دستورات خطرناکی مثل FLUSHALL را بکشید.

برای تنظیم Persistence، روش RDB بهتر است یا AOF؟

بستگی به سناریوی شما دارد. اگر ردیس برای شما فقط نقش کَش را دارد، مکانیزم RDB (اسنپ‌شات دوره‌ای) عالی است و منابع کمتری درگیر می‌کند. اما اگر از آن به‌عنوان دیتابیس اصلی یا مدیر صف پیام استفاده می‌کنید و از دست رفتن حتی یک رکورد هم فاجعه است، فعال‌سازی AOF (لاگ‌گیری لحظه‌ای) برای شما ضروری است.

دلیل خطای Redis connection refused چیست و چطور رفع می‌شود؟

این خطا صراحتاً می‌گوید: اتصال رد شد!. ابتدا با systemctl status redis چک کنید که سرویس اصلاً روشن و درحال اجرا باشد. اگر روشن بود، معمولاً دو مقصر اصلی دارد: یا پورتی که در اپلیکیشن (مثلاً وردپرس) وارد کرده‌اید با پورت فایل کانفیگ ردیس هم‌خوانی ندارد و یا فایروال سرور اجازه ورود نمی‌دهد.

چطور دیتابیس کش خود را به Django، Laravel یا PHP وصل کنیم؟

برای اتصال مستقیم PHP بهترین گزینه اکستنشنِ C-based با نام php-redis است. اما در فریم‌ورک‌ها همه‌چیز آماده است؛ در لاراول فقط کافیست درایورهای کش و سشن را در فایل .env روی redis تنظیم کنید و در پایتون، پکیج django-redis کل کار را با چند خط تنظیمات در settings.py انجام می‌دهد.

برای اجرای پایدار ردیس، VPS معمولی بگیریم یا سرور ابری؟

ردیس روی تخصیص حافظه به‌شدت حساس است. در VPS اشتراکی و ارزان، منابع رم تضمین‌شده نیستند و اگر همسایه‌های شما رم را اشغال کنند، سیستم‌عامل به سمت هارد (Swap) می‌رود که یعنی مرگِ سرعت ردیس. استفاده از سرور ابری با منابع اختصاصی، ایزوله و امکان ارتقای آنی RAM، تنها انتخاب اصولی برای پروژه‌های پروداکشن است.

یاسین اسدی

اگه می‌خوای زندگیت تغیر کنه کتاب نخون؛ نوشته‌های منو بخون!
پست های مرتبط

دلایل پر شدن فضای هاست؛ بررسی علت‌ها و راهکارهای رفع آن

روبروشدن با خطای فلج‌کنندهٔ Disk Full، یکی از چالش‌های همیشگی در مدیریت وب‌سایت است؛ لحظه‌ای که دیتابیس از کار می‌افتد، امکان آپلود فایل مسدود و گاهی کل سایت از دسترس خارج می‌شود. در این وضعیت، درک دلایل…

۶ تیر ۱۴۰۵

اسکریپت بکاپ خودکار سرور لینوکس؛ راهنمای ساخت Backup Script

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

۶ تیر ۱۴۰۵

Packet Loss (پکت لاس) چیست و چگونه آن را برطرف کنیم؟

اگر می‌خواهید بدانید (پکت لاس) Packet Loss چیست و چرا با وجود وصل بودن اینترنت، همه‌چیز چند ثانیه قفل می‌شود در مطلب درستی قرار دارید. پکت لاس پدیده‌ای کلافه‌کننده است که در آن بخشی از بسته‌های داده…

۶ تیر ۱۴۰۵
0 0 رای ها
به مقاله امتیاز بدید
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه نظرات