Redis Unix Socket, Installazione Ubuntu

Sto cercando di installare Discourse, ho configurato il mio database, Redis e SMTP. Per il database PostgreSQL non ci sono stati problemi con il socket Unix, ma per Redis sembra esserci un errore.

Impostazioni di 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"

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

Durante l’installazione di Discourse:

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

Errore nella segnalazione: Errore di connessione a Redis su localhost:///var/run/redis/redis-server.sock:6379 (SocketError) 2 Errore di connessione a Redis su localhost:///var/run/redis/redis-server.sock:6379 (SocketError
) sottoscrizione fallita, riconnessione tra 1 secondo. Stack di chiamate ["/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 abortato!
Redis::CannotConnectError: Errore di connessione a Redis su 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'

Se desideri installare Discourse per la produzione, dovresti utilizzare l’Installazione Standard Ufficiale di Discourse. Se desideri installare un ambiente di sviluppo, ci sono argomenti specifici per ogni sistema operativo.

1 Mi Piace

Grazie per la risposta.

Solo per chiarire: il sistema è completamente operativo e tutto funziona, ma ho dovuto impostare l’host di Redis su “localhost” perché la connessione tramite socket Unix non funzionava.

Ho seguito questa guida: Install Discourse Forum on Ubuntu 18.04 Without Docker
Poiché la guida è un po’ datata, ho dovuto apportare alcune modifiche qui e là, ma dato che ho molta familiarità con Linux, sono riuscito a risolvere tutto senza problemi.

La mia installazione è su un container LXC Proxmox con Ubuntu 20.04.

Non trovo molti riferimenti online sull’uso di Redis tramite socket Unix; mi chiedo se questa possa essere una funzionalità relativamente nuova per Redis. Ho trovato un link, ma sembra che lì venga utilizzato Docker, mentre nel mio caso no, quindi non è direttamente applicabile: Discourse PR for redis.socketed.template.yml - Discourse System Administration - Unix Linux Community

1 Mi Piace

Allora sarai quasi solo, poiché qui è supportata solo l’installazione standard ufficiale di Discourse.

Penso che sarà piuttosto difficile installare o mantenere un’istanza di produzione che non utilizza Docker. Ci sono diversi aspetti delicati nell’interazione tra nginx e Discourse che risulteranno complicati da gestire senza il contenitore Docker fornito da loro, ma suppongo che tutto sia possibile.

Sì, per fortuna forniscono un esempio di configurazione nginx

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

Da quanto ho letto, nemmeno l’immagine Docker supporta ancora Redis tramite socket Unix.

È improbabile che questo cambi. Se il modello attuale non supporta l’uso di un socket, significa che CDCK non utilizza un socket Redis nella loro configurazione di hosting o nell’installazione Docker supportata.

Non sono sicuro di quale problema stia cercando di risolvere non utilizzando la configurazione supportata ./launcher e docker, ma è probabile che troverà anche molti altri problemi.

Non sono sicuro che tu abbia mai usato Proxmox, ma secondo me è fantastico! Posso accedere all’interfaccia web e con un solo clic creare un backup; posso quindi apportare modifiche e, se qualcosa va storto, scelgo semplicemente il backup e clicco su ripristina.

Inoltre, ottieni prestazioni molto migliori da un contenitore LXC rispetto a un’immagine Docker: non c’è paragone.

Non dico che Docker sia negativo, perché, come hai giustamente sottolineato, rende MOLTO semplice la configurazione.

Immagino che per gli usi che ne hai fatto sia stato ottimo!

Sono abbastanza sicuro che qualcuno abbia fatto questo confronto e che ci siano da 100 a 1000 volte più immagini in esecuzione su Docker rispetto a LXC (che ho usato, una volta).

Non sto dicendo che Proxmox sia cattivo, ma se vuoi che Discourse sia facile da configurare e mantenere, userai Docker. Per fare un confronto, se chiedessi aiuto su Marketplace con un budget inferiore a 1.000 dollari, non risponderei.

Il punto del thread era chiedere lo stato attuale del socket Unix di Redis. Non si trattava di discutere se LXC o Docker siano più adatti per Discourse. Ho solo menzionato perché non stavo usando Docker perché sembrava che potessi essere curioso a riguardo. Per la persona media, Docker vince ogni volta perché è semplice. È anche per questo motivo che per molto tempo molte applicazioni hanno usato MySQL invece di PostgreSQL. Ma io amo assolutamente PostgreSQL.

Finché non incontrerò problemi devastanti, continuerò sicuramente a usare LXC, semplicemente funziona benissimo! Sono anche completamente d’accordo sul fatto che se pensi di aver bisogno di supporto esterno, dovresti probabilmente attenerti a quanto consigliato dalle impostazioni predefinite. Io stesso ho 20 servizi diversi, ognuno nel proprio contenitore LXC, in esecuzione su un singolo nodo Proxmox, e funzionano tutti egregiamente, e questo è solo un singolo nodo in un cluster Proxmox. Backup automatizzati, monitoraggio, migrazione tra i nodi del cluster: sono tutte cose fantastiche :slight_smile:

Ho già detto che la mia installazione è andata liscia? Finora amo Discourse; a parte dover usare localhost per Redis invece del socket Unix, non ho avuto alcun problema. Cercherò di ricordare di tornare a scrivere tra qualche mese per farvi sapere se la situazione è ancora la stessa :wink:

2 Mi Piace

Eh no! Fantastico! Sono contento che tu abbia risolto! Sembra che, se sei disposto a usare localhost per Redis, non avrai più problemi in futuro.

Suppongo che sia usermod -aG redis discourse o in alternativa unixsocketperm 777 in modo che unicorn abbia i permessi per accedere al socket. Assicurati anche che la directory in cui deve essere creato il socket esista e abbia l’utente redis come proprietario. Tuttavia, il comune pacchetto redis-server basato su systemd-service su Ubuntu lo garantisce.