You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker-Compose部署Laravel项目:sudo运行Horizon遇Redis连接拒绝问题

问题:sudo执行php artisan horizon时Redis连接拒绝

环境与配置

docker-compose.yml 内容

version: '3.8'
services:
  appetit-php:
    build:
     context: ./docker-file/php
     dockerfile: Dockerfile
   container_name: appetit-php
   restart: always
   volumes:
     - ./services/legacy:/var/www/
     - ./docker-data/config/php/php.ini:/usr/local/etc/php/php.ini
     - ./docker-data/config/php/supervisor/conf.d/:/etc/supervisor/conf.d/
   working_dir: /var/www
   networks:
     - appetit-network

 appetit-redis:
  image: "redis"
  container_name: appetit-redis
  restart: always
  volumes:
    - ./docker-data/data/redis/:/data/
  ports:
    - "6378:6379"
  networks:
    - appetit-network

networks:
  appetit-network:
    driver: bridge

问题现象

  • 直接执行php artisan horizon正常运行
  • 执行sudo php artisan horizon时触发Redis连接拒绝错误:
RedisException 

Connection refused
at vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:161
  • 当前执行用户为root(whoami输出root)

解决方案

1. 保留环境变量执行命令

sudo默认不会继承当前用户的环境变量,导致Laravel加载的Redis配置异常。执行命令时添加-E参数保留环境变量:

sudo -E php artisan horizon

2. 检查Redis连接配置

打开Laravel的config/database.php,确认Redis配置段的host和port:

  • 如果是在php容器内部执行命令,host必须是docker服务名appetit-redis,port为6379
  • 如果是在宿主机执行命令,host为localhost或127.0.0.1,port为映射的6378

同时确认.env文件中的REDIS_HOST和REDIS_PORT参数正确,且root用户能读取该文件(权限至少为644,可通过ls -l .env检查)。

3. 指定运行环境执行

如果多环境配置存在差异,执行时明确指定环境:

sudo php artisan horizon --env=production # 替换为你的实际环境名

4. 确认命令执行上下文

如果是在宿主机执行命令,确保没有混淆容器内部和外部的Redis端口;如果是在容器内部执行,直接使用docker服务名appetit-redis作为Redis主机地址即可。

内容的提问来源于stack exchange,提问作者Hanie Asemi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:21:27