Rails 4 ActiveRecord löst PG :: UnableToSend unter Ubuntu 13.04 aus

8

Wir haben eine Ruby v.2.0.0-p247 für Rails v4.0.1 -Anwendung mit pg gem v0.17.0 .

Die Anwendung läuft reibungslos unter Mac OS X Mavericks v10.9 mit PostgreSQL Server v9.2.4 installiert unter Verwendung von HomeBrew , aber es gibt die folgende Ausnahme unter Ubuntu v13.04 mit PostgreSQL Server 9.1 :

PG::UnableToSend: server closed the connection unexpectedly

This probably means the server terminated abnormally before or while processing the request.

Die Ausnahme tritt nach Transaktionsabfragen (Formularübergabe) auf.

Ich habe Folgendes mit database.yml versucht:

  1. Hinzufügen von reconnect: true
  2. Hinzufügen von port: 5432
  3. Hinzufügen von socket: /var/run/postgresq/SOCKET_FILE

Und versuchte folgendes mit PostgreSQL-Konfiguration unter Ubuntu:

  1. Deaktivieren von SSL.
  2. Ändern der TCP-Keepalives-Parameter zum Pumpen-Timeout.
  3. Ändern der Protokollebene in DEBUG und Suchen nach möglichen Fehlern auf PostgreSQL Server.

Auch versucht:

  1. Downgrade auf pg gem v0.16.0.
  2. Aktualisieren Sie alle Ubuntu 13.04-Pakete auf die neuesten Versionen.

Was könnte möglicherweise falsch sein?

UPDATES:

12/03/2013: Einige haben vorgeschlagen, die Firewall-Einstellungen zu überprüfen. ufw status hat angegeben, dass ufw deaktiviert ist. 12/08/2013: Nach dem Ausprobieren mit einer Vanilla Rails App und vielen Fehlern mit der aktuellen Anwendung, stammt das Problem von rails4/activerecord-session_store gem. Zeile 47 in lib/active_record/session_store/session.rb ist der Täter.

    
Omar Ali 03.12.2013, 11:07
quelle

4 Antworten

4

Dies geschieht im Wesentlichen, wenn Sie eine alte Version von launchy verwenden und gemäß diesem Anfrage auf Launchys Git Repo-Zitat @infertux

  

Im seltenen Fall, dass exec den Befehl nicht ausführen kann - normalerweise, wenn die Datei nicht geöffnet werden kann, indem Errno::ENOENT ausgelöst wird - würde Launchy eine Ausnahme auslösen, aber keine Ausgabe anzeigen

Sie können Ihre Gemfile.lock überprüfen, um zu sehen, ob Sie eine Version von launchy unter 2.4.1 verwenden, und ich bezweifle, dass Sie letter_opener Gem in Ihrer Entwicklungsumgebung verwenden, die von launchy abhängt. Wenn also letter_opener auf 1.2.0 aktualisiert wird, wird launchy auf eine Version über 2.4.0 aktualisiert, meistens 2.4.2, bei der dieses Problem behoben ist

Alle Kredite gehen an @infertux

    
Ahmed Youssef 24.04.2014, 09:14
quelle
1

Es würde wirklich helfen, wenn Sie Ihre Datei database.yml

bereitstellen würden

Die Standardverbindungsmethode ist ein Unix-Domain-Socket, der nicht mit einem TCP / IP-Socket zu verwechseln ist. Die Unix-Domain-Socket-Verbindungsmethode wird standardmäßig verwendet.

Sie sollten überprüfen, ob der Unix-Benutzer, unter dem Sie rails ausführen möchten, über ausreichende Berechtigungen für den Zugriff auf den Domänen-Socket verfügt (normalerweise in /var/run/postgresql/.s.PGSQL.5432 )

Geben Sie Folgendes als Ihr rails-Benutzer ein:

%Vor%

Wenn Sie einen Datenbankverbindungsfehler bekommen, ist es wahrscheinlich ein Berechtigungsproblem, wenn postgres tatsächlich ausgeführt wird.

Sie können Ihre /etc/postgresql.conf -Datei überprüfen und postgres die Gruppe und die Berechtigungen für den Socket beim Start konfigurieren:

%Vor%

Eine weitere Option besteht darin, den Benutzer zu der Gruppe hinzuzufügen, die Schreibzugriff auf den Socket hat, oder allen Benutzern auf dem Computer Zugriff mit den oben genannten 0777-Berechtigungen zu gewähren. Vielleicht möchten Sie eine postres_users -Gruppe für diesen Zweck erstellen, wenn die Standard-Ubuntu-Gruppen nicht genügend Granularität für Ihre Bedürfnisse bieten.

    
Andrew Hacking 09.12.2013 14:16
quelle
0

Es sieht für mich so aus, als gäbe es Verwirrung über die Verbindungsmethode. PostgreSQL unterstützt die beiden Methoden:

  1. Sockel
  2. TCP / IP

Diese sind völlig, ganz anders. : -)

In Ihrer Frage zeigen Sie eine socket Einstellung, aber erwähnen Sie TCP. Ich schlage vor, dass ich mich auf jeden dieser beiden Wege konzentriere, mich isoliert zu verbinden und zu sehen, was Ergebnisse hervorbringt. Das heißt, erstellen Sie zwei Versionszweige pg-socket und pg-tcpip , nur um die Dinge zu verdeutlichen. Bereinigen Sie dann Ihre Konfigurationsdatei und versuchen Sie, eine Verbindung über beide Methoden herzustellen.

Oft ist eine Socket-Verbindung einfacher, weil Sie nur den Pfadnamen der Socket-Datei kennen müssen. Es sind keine Fireware-Einstellungen erforderlich (da kein TCP / IP-Netzwerk beteiligt ist).

Aktualisieren Sie Ihre Frage, nachdem Sie dies getan haben und sagen Sie uns, wie jede der beiden Methoden für Sie getan hat.

    
Dogweather 06.12.2013 21:19
quelle
0

Haben Sie keepalives wie hier angegeben Ссылка festgelegt Das Problem wurde damit gelöst: Ссылка

    
bjhaid 06.12.2013 21:47
quelle