برای نصب 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 را کمی کمتر از حافظه آزاد سرور بگذارید و مصرف را پایش کنید.





