[英]local server can't connect to remote postgresql database using PHP, but local terminal can connect
標題可能會使這看起來像是 SO 上一些現有問題的重復,但在我看來,這在某種程度上不是。
但是我一生都無法使這些線程的答案起作用,而不是在這些線程上提問,我想創建自己的問題,我想討論我的設置,然后討論我的問題,然后我試過的
我的服務器設置是這樣的,我有一個本地(一台實際的物理機器)和一個我租用的 VPS,兩者都在 Centos7.x、PostgreSQL10、 Php 7.x 和 Python-2.x 上運行,兩者都可以 ping 和ssh 對方通過VPN就好了。
兩者都可以通過 PHP、Python、PSQL 終端很好地連接到各自的數據庫
在我的 VPS 服務器上,我可以完全使用 Python(psycopg2)、PHP(php-pgsql) 和 Terminal(psql) 連接到本地服務器的 PostgreSQL 數據庫。
在我的本地服務器上,我可以使用 Python(psycopg2)和終端(psql)連接到我的 VPS PostgreSQL,除了 PHP(php-pgsql)
每當我通過 PHP 連接到 VPS 的 PostgreSQL 時,我都會像其他人一樣收到此錯誤
pg_connect(): Unable to connect to PostgreSQL server:
could not connect to server: Permission denied
Is the server running on host "123.456.0.789" and accepting TCP/IP connections on port 5432?
這是我所做的。
這些是我的 netstat 的結果
#netstat -na | grep 5432
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN
tcp6 0 0 :::5432 :::* LISTEN
tcp6 0 94 ::1:55110 ::1:5432 ESTABLISHED
tcp6 0 0 ::1:5432 ::1:55060 ESTABLISHED
tcp6 0 0 ::1:5432 ::1:55110 ESTABLISHED
tcp6 12 0 ::1:5432 ::1:55108 ESTABLISHED
tcp6 0 12 ::1:55108 ::1:5432 ESTABLISHED
tcp6 0 0 ::1:55060 ::1:5432 ESTABLISHED
unix 2 [ ACC ] STREAM LISTENING 31102 /var/run/postgresql/.s.PGSQL.5432
unix 2 [ ACC ] STREAM LISTENING 31104 /tmp/.s.PGSQL.5432
iptables
#iptables-save | grep 5432
-A IN_public_allow -p tcp -m tcp --dport 5432 -m conntrack --ctstate NEW,UNTRACKED -j ACCEPT
強制執行
#getenforce
Disabled
Selinux
#/usr/sbin/sestatus | grep SELinux
SELinux status: disabled
#sudo setsebool -P httpd_can_network_connect_db 1
setsebool: SELinux is disabled.
postgresql.conf
listen_addresses = '*'
port = 5432
pg_hba.conf(我剛剛更改了 ip 以便在此處發布)我嘗試使用trust
,但它仍然相同
# "local" is for Unix domain socket connections only
local all all password
# IPv4 local connections:
host all all 127.0.0.1/32 password
host all all 123.456.0.1/32 password
host all all 123.456.0.11/32 password
host all all 123.456.0.20/32 password
# IPv6 local connections:
host all all ::1/128 password
編輯開始:我的 PHP pg_connect 代碼(我只是為這篇文章更改了 IP,但它指向 VPS IP)
$pgcon = pg_connect("dbname=database1 user=some_user password=some_password host=123.456.0.789");
編輯結束:==
我想強調的是,兩台服務器可以通過其他方式相互連接以及他們自己的 PostgreSQL 數據庫,除了我的本地服務器,它無法使用 PHP 連接到 VPS PostgreSQL。
VPS To Self(本地主機連接)
VPS to Self via PHP is OK
VPS to Self via Python is OK
VPS to Self via PSQL(Terminal) is OK
VPS 到本地服務器(使用本地服務器的 VPN IP 連接)
VPS to Local Server via PHP is OK
VPS to Local Server via Python is OK
VPS to Local Server via PSQL(Terminal) is OK
本地服務器到自身(本地主機連接)
Local Server to Self via PHP is OK
Local Server to Self via Python is OK
Local Server to Self via PSQL(Terminal) is OK
本地服務器到 VPS(使用 VPS 的 IP 通過 VPN 和公共 IP 連接)
Local Server to VPS via Python is OK
Local Server to VPS via PSQL(Terminal) is OK
Local Server to VPS via PHP Is NOT OK
我真的很抱歉這個長線程,我想提供盡可能多的信息。
讓我們按類型划分錯誤。 我已經對您的案例進行了幾次測試以及我的發現:
如果我們弄亂了連接參數(即錯誤的端口,或 IP 地址),我們會收到錯誤“無法連接到服務器:連接被拒絕”或“操作超時服務器在主機“128.0.0.1”上運行並接受“)
如果我們弄亂憑據,我們會收到錯誤“致命:用戶密碼驗證失敗...”
僅當您無權從 PHP 庫中打開 TCP 連接時,才能拋出 Permission denied。
請仔細檢查您是否像我一樣在本地服務器上禁用 SElinux,這仍然是您的問題最接近的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.