Postgresql Benutzer, der keine Verbindung zur database herstellt (Nginx Django Gunicorn)

Seit fast einem Monat habe ich mit diesem Problem gekämpft. Immer wenn ich versuche, auf meine Django Admin- Seite auf Produktion zuzugreifen, erhalte ich den folgenden Fehler:

OperationalError at /admin/login/ FATAL: password authentication failed for user "vpusr" FATAL: password authentication failed for user "vpusr" 

Meine production.py- Einstellungsdatei lautet wie folgt:

 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'vpdb', 'USER': 'vpusr', 'PASSWORD': os.environ["VP_DB_PASS"], 'HOST': 'localhost', } } 

Hinweis: die Umgebungsvariable funktioniert ordnungsgemäß. auch wenn ich das normale Passwort fest codierte, funktioniert es nicht.

Hier ist die list der databaseen mit ihrem Besitzer:

  List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- postgres | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | template0 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/postgres + | | | | | postgres=CTc/postgres vpdb | vpusr | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =Tc/vpusr + | | | | | vpusr=CTc/vpusr 

Und hier ist die list der Benutzer :

  List of roles Role name | Attributes | Member of -----------+------------------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {} vpusr | Superuser, Create DB | {} 

Wie Sie sehen können, habe ich auch versucht, die Rollen von Superuser und Create DB zum vpusr hinzuzufügen, aber das hatte keine Wirkung.

Selbst wenn ich versuche, eine Verbindung über das Terminal herzustellen, bekomme ich denselben Fehler:

 sudo -u postgres psql -U vpusr vpdb 

Ich bekomme immer noch den Fehler: psql: FATAL: Peer authentication failed for user "vpusr"

Wenn ich diesen Befehl mache:

 psql -U vpusr -h localhost vpdb 

Ich verbinde mich richtig mit psql als vpusr.

Noch ein paar Anmerkungen: Ich habe die database und den Benutzer gelöscht und neu erstellt. Ich stellte sicher, dass das Passwort korrekt war. Ich benutze Gunicorn, Nginx, Virtualenv, Django, Postgres auf einem Ubuntu server von Digital Ocean.

Vielen Dank im Voraus, dass Sie sich die time genommen haben, dies zu lesen und mir zu helfen!

EDIT: Ich habe festgestellt, dass es keine Migrationen in meinem Apps-Migrationsordner gibt! Könnte es sein, dass Django oder mein Benutzer oder Postgres nicht die Erlaubnis hat, die file zu schreiben ?

BEARBEITEN SIE: HINWEIS: Ich änderte den Benutzer zu Tony In meiner Postgres-Protokolldatei wurden die folgenden Fehler gefunden:

  2017-09-09 18:09:55 UTC [29909-2] LOG: received fast shutdown request 2017-09-09 18:09:55 UTC [29909-3] LOG: aborting any active transactions 2017-09-09 18:09:55 UTC [29914-2] LOG: autovacuum launcher shutting down 2017-09-09 18:09:55 UTC [29911-1] LOG: shutting down 2017-09-09 18:09:55 UTC [29911-2] LOG: database system is shut down 2017-09-09 18:09:56 UTC [2711-1] LOG: database system was shut down at 2017-09-09 18:09:55 UTC 2017-09-09 18:09:56 UTC [2711-2] LOG: MultiXact member wraparound protections are now enabled 2017-09-09 18:09:56 UTC [2710-1] LOG: database system is ready to accept connections 2017-09-09 18:09:56 UTC [2715-1] LOG: autovacuum launcher started 2017-09-09 18:09:57 UTC [2717-1] [unknown]@[unknown] LOG: incomplete startup packet 2017-09-09 18:10:17 UTC [2740-1] tony@vpdb LOG: provided user name (tony) and authenticated user name (postgres) do not match 2017-09-09 18:10:17 UTC [2740-2] tony@vpdb FATAL: Peer authentication failed for user "tony" 2017-09-09 18:10:17 UTC [2740-3] tony@vpdb DETAIL: Connection matched pg_hba.conf line 90: "local all all peer" 

BEARBEITEN:

pg_hba.conf file:

 # Database administrative login by Unix domain socket local all postgres peer # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 password # IPv6 local connections: host all all ::1/128 md5 # Allow replication connections from localhost, by a user with the # replication privilege. #local replication postgres peer #host replication postgres 127.0.0.1/32 md5 #host replication postgres ::1/128 md5 

was kannst du sagen, form das?

Solutions Collecting From Web of "Postgresql Benutzer, der keine Verbindung zur database herstellt (Nginx Django Gunicorn)"

Ihre Anwendung versucht mithilfe einer Kennwortauthentifizierungsmethode eine Verbindung zu PostgreSQL pg_hba.conf , aber in Ihrer file pg_hba.conf der Verbindungstyp mit der md5 Methode pg_hba.conf , sodass eine md5 authentication erwartet wird. Wir können dies in Ihren Log-Nachrichten sehen

 2017-09-01 11:42:17 UTC [16320-1] vpusr@vpdb FATAL: password authentication failed for user "vpusr" 2017-09-01 11:42:17 UTC [16320-2] vpusr@vpdb DETAIL: Connection matched pg_hba.conf line 92: "host all all 127.0.0.1/32 md5" 

pg_hba.conf Sie Ihre pg_hba.conf file in Ihrem PostgreSQL-dataverzeichnis, vim die file pg_hba.conf und aktualisieren Sie die Zeile

 host all all 127.0.0.1/32 md5 

und ändere es in

 host all all 127.0.0.1/32 password 

und dann starte deinen PostgreSQL-Dienst neu

 [root@server] service postgresql restart 

und versuchen Sie dann erneut, sich zu authentifizieren

Wenn Sie den folgenden Befehl sudo -u postgres psql -U vpusr vpdb Sie die anderen Nachrichten: sudo -u postgres psql -U vpusr vpdb Sie den Parameter -h <host> , sodass die Verbindung versucht, die Zeile sudo -u postgres psql -U vpusr vpdb

 local all all 127.0.0.1/32 <method> 

Sie müssen also prüfen, welche Methode der authentication für lokale Verbindungen erwartet wird und auf diese Weise authentifizieren, oder Sie übergeben den Parameter -h <host> , und dann wird Ihre Zeile übereinstimmen

 host all all 127.0.0.1/32 password 

Das bedeutet, dass Sie dann Ihr Passwort eingeben können, wenn Sie dazu aufgefordert werden, oder ändern Sie Ihre Verbindungszeichenfolge zu

 sudo -u postgres -c "PGPASSWORD=<password>;psql -h localhost -U vpusr vpdb" 

EDIT: Wenn das Ihr Problem nicht behebt, können Sie alle Zeilen in Ihrer pg_hba.conf file pg_hba.conf

Aus der Dokumentation :

db_user_namespace (boolesch)

Dieser Parameter aktiviert die Benutzernamen pro database. Es ist standardmäßig deaktiviert. Dieser Parameter kann nur in der postgresql.conf-file oder in der server-Befehlszeile festgelegt werden.

Wenn dies aktiviert ist, sollten Sie Benutzer als Benutzername @ DB-Name erstellen. Wenn der Benutzername von einem verbindenden Client übergeben wird, werden @ und der databasename an den Benutzernamen angehängt und der datenbankspezifische Benutzername wird vom server nachgeschlagen. Beachten Sie, dass Sie beim Erstellen von Benutzern mit Namen, die @ innerhalb der SQL-Umgebung enthalten, den Benutzernamen angeben müssen.

Wenn dieser Parameter aktiviert ist, können Sie weiterhin normale globale Benutzer erstellen. Fügen Sie einfach @ hinzu, wenn Sie den Benutzernamen im Client angeben, z. B. joe @. Das @ wird abgezogen, bevor der Benutzername vom server nachgeschlagen wird.

db_user_namespace bewirkt, dass sich die Benutzernamen-Repräsentation des Clients und des servers unterscheidet. authenticationsprüfungen werden immer mit dem Benutzernamen des servers durchgeführt, sodass die authenticationsmethoden für den Benutzernamen des servers und nicht für den Client konfiguriert werden müssen. Da md5 den Benutzernamen sowohl auf dem Client als auch auf dem server als Salt verwendet, kann md5 nicht mit db_user_namespace verwendet werden.

Obwohl dies nicht erklärt, warum psql das Richtige tut, lohnt es sich, darauf einzugehen.

Eine andere Möglichkeit ist, dass psycopg2 mit einer anderen psycopg2 verlinkt, die mit einem anderen und FIPS-konformen OpenSSL verknüpft ist. Es hätte keine Möglichkeit, md5-Hashing durchzuführen, da OpenSSL den md5-Algorithmus nicht enthält. Ich würde eine andere Fehlermeldung erwarten, aber dieser Fehler ist alles andere als offensichtlich.

UPDATE : Das sieht nach einem Ablenkungsmanöver aus. Anscheinend bringt psycopg2 eine eigene Kryptoversion mit.

Das letzte zu überprüfende Element wäre die charactercodierung. Testen Sie mit einem Passwort, das nur ASCII-character enthält, wie abcdefghijkl . Wenn Django funktioniert, dann schaue in die LANG_* und LC_* in der Umgebung.

fox fix password authentication failed for user "vpusr" versuche password wie es ist zu den settings und dem Test für os.environ["VP_DB_PASS"],

Motor wechseln

 'ENGINE': 'django.db.backends.postgresql_psycopg2' 

bei Bedarf installieren:

 pip install psycopg2 

für Fix psql: FATAL: Peer authentication failed for user "vpusr" versuchen Sie einfach Host hinzufügen

 psql -h localhost -U vpusr vpdb # ^^^^^^^^^^^^