Redis Unix Socket,Ubuntu 安装

我正在尝试安装 Discourse,已配置好数据库、Redis 和 SMTP。对于 PostgreSQL 数据库,Unix socket 没有问题,但 Redis 似乎报错了。

Redis 设置:

sudo sed -i 's/^# unixsocket /unixsocket /' /etc/redis/redis.conf
sudo sed -i 's/^# unixsocketp.*/unixsocketperm 770/' /etc/redis/redis.conf
sudo sed -i 's/^# maxmemory <bytes>/maxmemory 1024mb/' /etc/redis/redis.conf
sudo sed -i 's/^# maxmemory-policy noeviction/maxmemory-policy allkeys-lru/' /etc/redis/redis.conf
sudo cat /etc/redis/redis.conf | grep "^maxmemory\|^unixsocket"

配置 Redis socket:
nano /var/www/discourse/config/discourse.conf
redis_host = "/var/run/redis/redis-server.sock"

Discourse 安装过程中:

RAILS_ENV=production /root/.rbenv/versions/2.7.2/bin/bundle exec rake db:migrate

报告错误失败:无法连接到 localhost:///var/run/redis/redis-server.sock:6379 上的 Redis(SocketError)2 无法连接到 localhost:///var/run/redis/redis-server.sock:6379 上的 Redis(SocketError
)订阅失败,将在 1 秒后重新连接。调用堆栈 ["/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:362:in `rescue in establish_connection'", "/var/www/discourse/vendor/b
undle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:343:in `establish_connection'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:107:in `block in connect'", "/var/www/disc
ourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:308:in `with_reconnect'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:106:in `connect'", "/var/www/disco
urse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:289:in `with_socket_timeout'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:139:in `call_loop'", "/var/www
/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/subscribe.rb:44:in `subscription'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/subscribe.rb:14:in `subscribe'", "/var/
www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:3506:in `_subscription'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:2326:in `block in subscribe'", "/var/www
/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `block in synchronize'", "/root/.rbenv/versions/2.7.2/lib/ruby/2.7.0/monitor.rb:202:in `synchronize'", "/root/.rbenv/versions/2.7.2/lib/ru
by/2.7.0/monitor.rb:202:in `mon_synchronize'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `synchronize'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/
redis.rb:2325:in `subscribe'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.1/lib/message_bus/backends/redis.rb:287:in `global_subscribe'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems
/message_bus-3.3.1/lib/message_bus.rb:754:in `global_subscribe_thread'", "/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/message_bus-3.3.1/lib/message_bus.rb:702:in `block in new_subscriber_thread'"]
rake 执行失败!
Redis::CannotConnectError: 无法连接到 localhost:///var/run/redis/redis-server.sock:6379 上的 Redis(SocketError)
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:362:in `rescue in establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:343:in `establish_connection'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:107:in `block in connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:308:in `with_reconnect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:106:in `connect'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:381:in `ensure_connected'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:233:in `block in process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:320:in `logging'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:232:in `process'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis/client.rb:126:in `call'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:557:in `block in del'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `block in synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:69:in `synchronize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/redis-4.2.1/lib/redis.rb:556:in `del'
/var/www/discourse/lib/discourse_redis.rb:81:in `block in del'
/var/www/discourse/lib/discourse_redis.rb:29:in `ignore_readonly'
/var/www/discourse/lib/discourse_redis.rb:79:in `del'
/var/www/discourse/lib/cache.rb:73:in `delete'

如果您想在生产环境中安装 Discourse,请使用 Discourse 官方标准安装指南。如果您想安装开发环境,针对每个操作系统都有相应的主题。

感谢您的回复。

澄清一下,我的系统已经完全正常运行,一切功能正常,但我不得不将 Redis 主机设置为"localhost",因为通过 Unix 套接字连接 Redis 无法正常工作。

我参考了这篇指南:https://www.linuxbabe.com/ubuntu/install-discourse-ubuntu-18-04-server-without-docker。由于该指南有些过时,我不得不在某些地方进行了一些调整,但我对 Linux 非常熟悉,因此能够顺利解决所有问题。

我的安装环境是在运行 Ubuntu 20.04 的 Proxmox LXC 容器中。

我在网上很少见到关于通过 Unix 套接字使用 Redis 的相关资料,我在想这是否对 Redis 来说是比较新的功能。我确实找到了一个链接,但看起来他们使用的是 Docker,而我并没有使用,因此该链接并不直接适用:Discourse PR for redis.socketed.template.yml - Discourse System Administration - Unix Linux Community

那么,你基本上只能靠自己了,因为这里仅支持 Discourse 官方标准安装

我认为,如果不使用 Docker,要安装或维护一个生产环境实例会相当困难。nginx 与 Discourse 之间的交互存在一些棘手的问题,如果没有他们提供的 Docker 容器,维护起来会非常复杂。不过,我想一切皆有可能。

是的,幸运的是他们提供了一个 nginx 配置示例:

/var/www/discourse/config/nginx.sample.conf

根据我目前看到的信息,甚至连 Docker 镜像尚未支持通过 Unix 套接字连接 Redis。

这不太可能改变。如果当前模板不支持使用 socket,那就意味着 CDCK 在其托管环境或支持的 Docker 安装中并未使用 Redis socket。

我不确定你为何要绕过官方支持的 ./launcherdocker 配置来解决某个问题,但你很可能会遇到其他一系列问题。

我不确定您是否用过 Proxmox,但在我看来,它非常棒!我可以登录 Web 界面,只需单击一下就能创建备份;之后我可以进行修改,如果出现问题,只需选择备份并点击“恢复”即可。

此外,LXC 容器的性能远优于 Docker 镜像,两者完全无法相提并论。

我并不是说 Docker 不好,正如您所指出的,它让部署变得非常简单。

我敢打赌,对于您使用它的场景来说,它的表现一定非常出色!

我相当确信,人们已经做过这样的比较,而且运行在 Docker 上的镜像数量是运行在 LXC 上的 100 到 1000 倍(LXC 我确实用过,那都是很久以前的事了)。

我也不是说 Proxmox 不好,但如果您希望 Discourse 易于设置和维护,您就会选择 Docker。举个参考例子:如果您在 Marketplace 频道寻求帮助,且预算低于 1000 美元,我是不会回复的。

本线程的初衷是询问 Redis Unix Socket 的当前状态,而非争论 LXC 和 Docker 哪个更适合 Discourse。我之所以提到未使用 Docker,只是觉得你可能对此感兴趣。对于普通用户而言,Docker 总是更胜一筹,因为它更简单。这也是长期以来许多应用选择 MySQL 而非 PostgreSQL 的原因。不过,我确实非常喜爱 PostgreSQL。

除非遇到某些毁灭性的问题,否则我肯定会继续使用 LXC,它的性能非常出色!我也完全同意:如果你认为可能需要外部支持,那么最好坚持使用推荐的默认配置。我自己有 20 个不同的服务,每个都运行在独立的 LXC 容器中,部署在单个 Proxmox 节点上,它们都运行良好,而这还只是一个 Proxmox 集群中的节点。自动化备份、监控、集群内节点间的迁移,这些都是非常棒的功能 :slight_smile:

我是否提到过我的安装过程非常顺利?到目前为止,我非常喜欢 Discourse,除了不得不使用 localhost 连接 Redis 而不是 Unix Socket 之外,我没有任何问题。我会记得在几个月后回来发帖,看看情况是否依旧如此:wink:

哈!没有!太棒了!很高兴你解决了这个问题!听起来如果你能接受在本地主机上运行 Redis,那么今后应该就不会再遇到麻烦了。

我猜是 usermod -aG redis discourse 或者 unixsocketperm 777,这样 unicorn 才能有权限访问套接字。另外,请确保要创建套接字的目录存在,并且所有者是 redis 用户。不过,Ubuntu 上常见的基于 systemd 服务的 redis-server 包会确保这一点。