Lỗi: Could not connect to Redis at 127.0.0.1:6379: Connection refused
Bạn đang làm việc với Redis, có thể là trên một ứng dụng web, một bộ xử lý tác vụ nền hoặc một công cụ dòng lệnh đơn giản. Đột nhiên, bạn gặp phải lỗi: Could not connect to Redis at 127.0.0.1:6379: Connection refused. Thông báo này có nghĩa là hệ thống bạn cố gắng tiếp cận đã chủ động từ chối yêu cầu kết nối của bạn. Đây là một vấp váp phổ biến đối với các nhà phát triển và quản trị viên, thường chỉ ra các vấn đề với chính máy chủ Redis, thiết lập của nó hoặc quyền truy cập mạng.
Lỗi này thường xuyên xuất hiện trên nhiều hệ điều hành khác nhau, bao gồm các bản phân phối Linux phổ biến như Ubuntu, CentOS và Debian. Người dùng macOS cũng có thể thấy lỗi này. Nó cũng thường xuất hiện trong các container Docker, đặc biệt khi các ứng dụng client (như máy chủ web, worker nền, hoặc các script tùy chỉnh) cố gắng thiết lập kết nối đến một phiên bản Redis.
Hiểu lỗi "Connection refused"
Khi bạn gặp lỗi "Connection refused", nó báo hiệu rằng hệ điều hành trên máy chủ—nơi Redis đáng lẽ phải đang chạy—đã từ chối rõ ràng nỗ lực kết nối của bạn. Điều này khá khác so với lỗi "Connection timed out", lỗi này sẽ ngụ ý không có phản hồi nào từ máy chủ. Sự từ chối cho thấy máy chủ đã nhận được yêu cầu của bạn nhưng cố ý nói "không". Tình huống này thường phát sinh nếu:
- Tiến trình máy chủ Redis hoàn toàn không chạy.
- Redis được thiết lập để lắng nghe trên một địa chỉ IP hoặc cổng khác so với mong đợi của ứng dụng client của bạn.
- Tường lửa đang chủ động chặn các kết nối đến cổng Redis.
- Redis được cấu hình cho một giao diện mạng cụ thể mà client của bạn không thể truy cập.
Các bước khắc phục lỗi từ chối kết nối Redis
Bước 1: Kiểm tra xem máy chủ Redis có đang chạy không
Lý do phổ biến nhất cho lỗi "Connection refused" là rất đơn giản: tiến trình máy chủ Redis đơn giản là không hoạt động. Hãy xác minh trạng thái hiện tại của nó.
Trên Linux/macOS (sử dụng systemd hoặc init.d):
Hầu hết các bản phân phối Linux hiện đại, như Ubuntu 16.04+ hoặc CentOS 7+, đều dựa vào systemd. Nếu bạn đang sử dụng hệ thống cũ hơn, lệnh service có thể phù hợp.
# Đối với các hệ thống sử dụng systemd (ví dụ: Ubuntu 16.04+, CentOS 7+, Debian 8+)
sudo systemctl status redis-server
# Đối với các hệ thống cũ hơn sử dụng init.d (ví dụ: Ubuntu 14.04, CentOS 6)
sudo service redis-server status
Tìm đầu ra hiển thị rõ ràng "active (running)". Nếu Redis không chạy, hãy khởi động nó:
# Để khởi động Redis sử dụng systemd
sudo systemctl start redis-server
# Để khởi động Redis và cấu hình nó tự động khởi chạy khi khởi động
sudo systemctl enable redis-server
# Để khởi động Redis sử dụng init.d
sudo service redis-server start
Trên Docker:
Nếu phiên bản Redis của bạn nằm trong một container Docker, hãy kiểm tra trạng thái của container.
docker ps
Lệnh này liệt kê tất cả các container đang chạy. Quét đầu ra để tìm container Redis của bạn. Nếu bạn không thấy nó, container không chạy. Bạn có thể sẽ cần khởi động nó:
# Thay thế <redis-container-name> bằng tên hoặc ID thực của container Redis của bạn
docker start <redis-container-name>
Hoặc, nếu bạn đang sử dụng tệp docker-compose.yml:
docker-compose up -d
Bước 2: Xác minh cấu hình Redis (Địa chỉ liên kết và Cổng)
Có thể Redis đang lắng nghe trên một địa chỉ IP hoặc cổng khác với những gì ứng dụng của bạn mong đợi. Hãy nhớ, địa chỉ lắng nghe mặc định là 127.0.0.1 (localhost), và cổng tiêu chuẩn là 6379.
Tìm tệp cấu hình Redis của bạn. Các vị trí phổ biến bao gồm /etc/redis/redis.conf trên Linux hoặc /usr/local/etc/redis.conf (thường thấy với các cài đặt thủ công hoặc Homebrew trên macOS).
# Một vị trí điển hình trên Linux
sudo nano /etc/redis/redis.conf
# Hoặc đối với các cài đặt Homebrew trên macOS
nano /usr/local/etc/redis.conf
Sau khi vào bên trong, hãy kiểm tra các chỉ thị quan trọng này:
-
Chỉ thị
bind: Cài đặt này kiểm soát các giao diện mạng mà Redis lắng nghe.bind 127.0.0.1: Redis sẽ chỉ chấp nhận các kết nối từ máy cục bộ (localhost). Nếu client của bạn nằm trên một máy chủ khác (ví dụ:192.168.1.50), nó sẽ không thể kết nối.# bind 127.0.0.1 ::1: Nếu dòng này bị chú thích (bắt đầu bằng#), Redis có thể lắng nghe trên tất cả các giao diện có sẵn. Tuy nhiên, việc định nghĩa rõ ràng địa chỉ bind luôn rõ ràng và an toàn hơn.bind 0.0.0.0: Điều này cho Redis biết rằng nó sẽ lắng nghe trên tất cả các giao diện mạng IPv4 có sẵn, cho phép kết nối từ bất kỳ địa chỉ IP nào. Hãy sử dụng điều này một cách thận trọng trong môi trường sản xuất; thường thì tốt hơn là liên kết với một IP nội bộ cụ thể nếu cần truy cập từ xa.bind your_server_ip: Nếu Redis chạy trên một máy chủ với một IP riêng cụ thể (ví dụ:192.168.1.100) và ứng dụng của bạn kết nối từ một máy khác trong cùng mạng, hãy liên kết Redis với địa chỉ IP cụ thể đó.
Đảm bảo địa chỉ
bindcho phép client của bạn kết nối. Đối với các kết nối cục bộ,127.0.0.1hoạt động hoàn hảo. Đối với các kết nối từ xa, hãy điều chỉnh nó thành một địa chỉ IP có thể truy cập được. -
Chỉ thị
port: Điều này định nghĩa cổng TCP mà Redis sử dụng để lắng nghe.port 6379: Kiểm tra kỹ xem giá trị này có khớp với cổng mà ứng dụng của bạn được cấu hình để sử dụng hay không.
Sau khi bạn thực hiện bất kỳ thay đổi nào đối với redis.conf, hãy nhớ khởi động lại máy chủ Redis để các cài đặt mới có hiệu lực:
sudo systemctl restart redis-server
Bước 3: Kiểm tra quy tắc tường lửa
Ngay cả khi Redis đang hoạt động tốt và được cấu hình chính xác, một tường lửa có thể đang âm thầm chặn các kết nối đến cổng của nó (mặc định là 6379).
Trên Linux (sử dụng ufw - Uncomplicated Firewall, phổ biến trên Ubuntu/Debian):
# Kiểm tra trạng thái hiện tại của UFW
sudo ufw status
Nếu UFW đang hoạt động, hãy xác nhận rằng cổng 6379 (hoặc cổng Redis tùy chỉnh của bạn) được cho phép rõ ràng. Để mở cổng cho các kết nối từ mọi nơi:
sudo ufw allow 6379/tcp
Để tăng cường bảo mật, nếu chỉ máy chủ ứng dụng của bạn cần kết nối, hãy chỉ định địa chỉ IP nguồn của nó:
# Thay thế <your_app_server_ip> bằng địa chỉ IP thực của máy chủ ứng dụng của bạn
sudo ufw allow from <your_app_server_ip> to any port 6379
Trên Linux (sử dụng firewalld, phổ biến trên CentOS/RHEL/Fedora):
# Kiểm tra trạng thái và các quy tắc hiện có của firewalld
sudo firewall-cmd --list-all
Nếu firewalld đang hoạt động, hãy thêm cổng Redis vào vùng đã chọn của bạn (ví dụ: vùng public):
# Thêm cổng vĩnh viễn
sudo firewall-cmd --permanent --add-port=6379/tcp
# Tải lại firewalld để áp dụng các thay đổi này
sudo firewall-cmd --reload
Nhóm bảo mật/NACL mạng của nhà cung cấp Cloud:
Nếu máy chủ Redis của bạn hoạt động trên nền tảng đám mây như Amazon Web Services (AWS), Google Cloud Platform (GCP) hoặc Microsoft Azure, bạn cũng sẽ cần kiểm tra các quy tắc nhóm bảo mật hoặc danh sách kiểm soát truy cập mạng (NACL) tương ứng của họ. Chúng hoạt động như các tường lửa ảo. Đảm bảo các kết nối đến trên cổng Redis (mặc định là 6379) được phép từ địa chỉ IP hoặc dải mạng con cụ thể của ứng dụng của bạn.
Bước 4: Xác minh mật khẩu Redis (nếu được bật)
Mặc dù việc không khớp mật khẩu thường dẫn đến lỗi xác thực, chứ không phải "Connection refused", nhưng vẫn đáng để xác nhận. Kiểm tra xem máy chủ Redis của bạn có đặt mật khẩu hay không và client của bạn có cung cấp đúng mật khẩu đó hay không. Trong những trường hợp hiếm hoi, cấu hình sai nghiêm trọng hoặc thư viện client lỗi thời có thể báo cáo sai lỗi xác thực là lỗi từ chối kết nối.
Xem lại tệp redis.conf của bạn để tìm chỉ thị requirepass:
requirepass your_strong_password
Nếu mật khẩu được cấu hình, hãy đảm bảo ứng dụng client của bạn sử dụng nó. Bạn có thể nhanh chóng kiểm tra điều này với redis-cli:
redis-cli -h 127.0.0.1 -p 6379 -a your_strong_password
ping
Bạn sẽ thấy PONG là phản hồi, xác nhận xác thực thành công.
Bước 5: Kiểm tra kết nối mạng (nếu kết nối từ máy từ xa)
Nếu ứng dụng của bạn nằm trên một máy chủ khác với phiên bản Redis của bạn, trước tiên hãy xác minh khả năng truy cập mạng cơ bản giữa hai máy.
# Từ máy chủ ứng dụng của bạn, thử ping địa chỉ IP của máy chủ Redis
ping <redis_server_ip>
Nếu ping thành công, điều đó có nghĩa là đường dẫn mạng cơ bản đang mở. Tiếp theo, hãy thử thiết lập kết nối TCP thô đến cổng Redis. Điều này giúp xác nhận xem có thứ gì đó đang chặn chính cổng hay không.
# Sử dụng telnet (cài đặt nếu chưa có: sudo apt install telnet)
telnet <redis_server_ip> 6379
# Hoặc sử dụng nc (netcat - cài đặt nếu chưa có: sudo apt install netcat)
nc -vz <redis_server_ip> 6379
Nếu telnet hoặc nc ngay lập tức hiển thị "Connection refused" hoặc đơn giản là đóng kết nối, điều đó cho thấy vấn đề nằm ở phía máy chủ Redis. Điều này có thể là do Redis không chạy, có địa chỉ bind không chính xác hoặc bị tường lửa chặn trên chính máy chủ Redis—ngay cả khi ping thành công.
Các bước xác minh
Sau khi áp dụng bất kỳ bản sửa lỗi nào ở trên, bước tiếp theo ngay lập tức của bạn luôn là cố gắng kết nối với Redis bằng redis-cli. Đây là cách trực tiếp nhất để xác nhận tính khả dụng và khả năng phản hồi của máy chủ.
Từ chính máy chủ Redis (để kiểm tra kết nối cục bộ):
redis-cli
ping
Nếu Redis yêu cầu mật khẩu, hãy nhập nó:
redis-cli -a your_strong_password
ping
Phản hồi PONG xác nhận kết nối và giao tiếp thành công.
Từ máy chủ ứng dụng của bạn (để kiểm tra kết nối từ xa, nếu có):
redis-cli -h <redis_server_ip> -p <redis_port> -a your_strong_password
ping
Một lần nữa, bạn đang tìm kiếm PONG. Khi redis-cli có thể kết nối, hãy khởi động lại ứng dụng của bạn và theo dõi nhật ký của nó để đảm bảo nó hiện đã kết nối với Redis mà không gặp sự cố.
Mẹo để ngăn ngừa các vấn đề trong tương lai
-
Người dùng chuyên dụng: Luôn chạy tiến trình máy chủ Redis của bạn dưới một tài khoản người dùng chuyên dụng, không có đặc quyền. Điều này giúp tăng cường đáng kể bảo mật bằng cách hạn chế thiệt hại tiềm ẩn nếu tiến trình Redis bị xâm phạm.
-
Giám sát: Triển khai giám sát mạnh mẽ cho các phiên bản Redis của bạn. Các công cụ như Prometheus, Grafana hoặc các giải pháp giám sát đám mây bản địa có thể cảnh báo bạn ngay lập tức nếu tiến trình Redis dừng hoặc không thể truy cập được. Điều này cho phép bạn chủ động giải quyết các vấn đề trước khi chúng ảnh hưởng đến người dùng.
-
Quản lý cấu hình nhất quán: Ghi lại cấu hình Redis của bạn và sử dụng các công cụ quản lý cấu hình (ví dụ: Ansible, Puppet, Chef). Điều này đảm bảo các cài đặt của bạn—đặc biệt là địa chỉ
bindvà cài đặtport—luôn nhất quán trên tất cả các môi trường và phù hợp với mong đợi của ứng dụng của bạn. -
Quản lý tường lửa: Thường xuyên xem xét và kiểm tra các quy tắc tường lửa của bạn. Những thay đổi không mong muốn đối với các quy tắc tường lửa là một nguyên nhân phổ biến gây ra các vấn đề kết nối. Đảm bảo chỉ các cổng thiết yếu được mở và hạn chế IP nguồn bất cứ khi nào có thể để có thêm một lớp bảo mật.
-
Phân đoạn mạng: Trong các môi trường CNTT phức tạp, hãy tận dụng phân đoạn mạng để cách ly các phiên bản Redis của bạn. Điều này giúp thực thi các chính sách bảo mật chặt chẽ hơn và ngăn chặn truy cập trái phép bằng cách giữ các máy chủ Redis của bạn trên các phân đoạn mạng được bảo vệ riêng của chúng.

