Redis Unix 소켓, Ubuntu 설치

Discourse를 설치하려고 하고 있습니다. 데이터베이스, Redis, SMTP를 설정했습니다. PostgreSQL DB는 유닉스 소켓에 문제가 없었지만, 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 소켓 구성:
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

Failed to report error: Error connecting to Redis on localhost:///var/run/redis/redis-server.sock:6379 (SocketError) 2 Error connecting to Redis on localhost:///var/run/redis/redis-server.sock:6379 (SocketError
) subscribe failed, reconnecting in 1 second. Call stack ["/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 aborted!
Redis::CannotConnectError: Error connecting to Redis on localhost:///var/run/redis/redis-server.sock:6379 (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에 유닉스 소켓으로 연결하는 것이 작동하지 않아 Redis 호스트를 "localhost"로 설정해야 했습니다.

다음 가이드를 따랐습니다: Install Discourse Forum on Ubuntu 18.04 Without Docker
가이드가 다소 오래되어 여기저기 몇 가지 조정이 필요했지만, 저는 리눅스에 익숙해서 문제없이 진행할 수 있었습니다.

제 설치 환경은 Ubuntu 20.04가 실행 중인 Proxmox LXC 컨테이너입니다.

온라인에서 Redis를 유닉스 소켓으로 사용하는 방법에 대한 참고 자료가 많이 보이지 않습니다. 이것이 Redis에서 비교적 새로운 기능인지 궁금합니다. 관련 링크를 하나 찾았지만, 그곳에서는 도커를 사용하고 있어 제 환경에는 직접적으로 적용되지 않습니다: 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를 지원하지 않는 것 같습니다.

이것은 아마도 변하지 않을 것입니다. 현재 템플릿이 소켓 사용을 지원하지 않는다면, 이는 CDCK가 호스팅이나 지원되는 Docker 설치에서 Redis 소켓을 사용하지 않는다는 것을 의미합니다.

지원되는 ./launcher 및 docker 구성을 사용하지 않는 것이 어떤 문제를 해결하려는 것인지 확실하지는 않지만, 다른 많은 문제들도 발견하게 될 가능성이 높습니다.

Proxmox을 사용해보신 적이 있는지 잘 모르겠지만, 제 생각에는 정말 훌륭합니다! 웹 인터페이스에 로그인하면 한 번의 클릭으로 백업을 만들 수 있고, 이후 설정을 변경한 후 문제가 발생하면 해당 백업을 선택해 복구하기만 하면 됩니다.

게다가 LXC 컨테이너는 도커 이미지보다 훨씬 더 나은 성능을 제공하며, 비교의 대상이 되지 않습니다.

도커가 나쁘다는 말은 아닙니다. 말씀하신 대로 도커는 설정을 매우 쉽게 해줄 수 있으니까요.

사용 용도에 따라 훌륭했을 것이라 확신합니다!

사람들이 그 비교를 해왔고, LXC(저도 한때 사용했었습니다)보다 Docker에서 100~1000배 더 많은 이미지들이 실행되고 있다는 점을 확신합니다.

Proxmox가 나쁘다고 말하는 것은 아니지만, Discourse를 쉽게 설정하고 유지보수하려면 Docker를 사용하게 될 것입니다. 참고로, #marketplace에서 1,000달러 미만의 예산으로 도움을 요청한다면 저는 응답하지 않을 것입니다.

이 스레드의 목적은 Redis Unix Socket의 현재 상태에 대해 묻는 것이었습니다. LXC와 Docker 중 어느 것이 Discourse에 더 적합한지에 대해 논쟁하자는 것이 아니에요. Docker를 사용하지 않는 이유를 언급한 것은 여러분이 궁금해하실 것 같아서 그랬습니다. 일반 사용자라면 Docker가 항상 이길 것입니다. 왜냐하면 간단하기 때문이죠. 오랫동안 많은 애플리케이션이 PostgreSQL 대신 MySQL을 사용했던 이유도 바로 그것입니다. 하지만 저는 PostgreSQL을 정말 좋아합니다.

치명적인 문제에 부딪히지 않는 한 저는 분명히 LXC를 계속 사용할 것입니다. 성능이 정말 좋으니까요! 외부 지원이 필요할 수 있다고 생각되면 권장되는 기본 설정을 따르는 것이 좋겠다는 의견에도 전적으로 동의합니다. 저는 Proxmox 노드 하나에서 20개의 서로 다른 서비스를 각각 별도의 LXC 컨테이너로 실행하고 있으며, 모두 훌륭하게 작동하고 있습니다. 그리고 이는 Proxmox 클러스터의 노드 단 하나일 뿐입니다. 자동 백업, 모니터링, 클러스터 내 노드 간 마이그레이션, 이 모든 것이 정말 좋은 점들이죠 :slight_smile:

설치가 순조롭게 진행되었다고 언급했나요? 지금까지 Discourse를 정말 좋아하고 있습니다. Redis에 Unix 소켓 대신 localhost를 사용해야 한다는 점을 제외하면 문제가 전혀 없었습니다. 몇 달 후에도 여전히 그런지 확인해 보려고 이 스레드에 다시 와서 알려드릴 것을 기억해 보겠습니다 :wink:

하! 아니요! 멋지네요! 문제를 해결하셨다니 다행입니다! Redis에 대해 로컬호스트(localhost)를 사용하는 것에 동의하신다면, 앞으로는 문제없이 진행될 것 같습니다.

아마도 usermod -aG redis discourse를 사용하거나, 또는 unixsocketperm 777을 설정하여 unicorn이 소켓에 액세스할 수 있는 권한을 부여해야 할 것입니다. 또한 소켓이 생성될 디렉터리가 존재하고 소유자가 redis 사용자인지도 확인하십시오. 다만 Ubuntu에서 일반적으로 사용되는 systemd 기반의 redis-server 패키지는 이를 자동으로 보장합니다.