こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

phpからPostgreにconnectで失敗

DBサーバーに対して、WEBサーバーからアクセスしています。
同じphpソースで同じDBにアクセスしているのに一方はconnectに成功して、一方は失敗します。

<前提>
インターネット上のDBサーバーにPostgreSqlがあります。

それとは別のローカルWEBサーバーのphpからPostgreSqlのデータを読んでいてこれは上手く行っています。

ローカルWEBサーバーのコピー環境をインターネット上に立てようとしていますが、これが上手く行きません。


<DBサーバー>
OS:CentOS7
dbms:PostgreSql
host:dbserver.net
port:5432
user:user1
password:password1
dbname:db1

設定ファイル
/var/lib/pgsql/data/pg_hba.conf
# PostgreSQL Client Authentication Configuration File
# TYPE DATABASE USER ADDRESS METHOD
host all user1 0.0.0.0/0 md5

設定ファイル
# /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'
port = 5432


<ローカルWEBサーバー>
host:test.local
OS:CentOS7

Server version: Apache/2.4.6 (CentOS)
Server built: Oct 19 2017 20:39:16

PHP 5.4.16 (cli) (built: Nov 15 2017 16:33:54)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies


<php中のコネクト部分>
<?PHP
// PostgreSQL 接続をオープンする
$dbconn = pg_connect("host=dbserver.net port=5432 user=user1 password=password1 dbname=db1");
 :
 :
 :


<セットアップ中のWEBサーバー>
host:test.com
OS:CentOS7

Server version: Apache/2.4.6 (CentOS)
Server built: Oct 19 2017 20:39:16

PHP 5.4.16 (cli) (built: Nov 15 2017 16:33:54)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies


<セットアップ中のWEBサーバーでのエラー>
Warning: pg_connect(): Unable to connect to PostgreSQL server: could not connect to server: Permission denied Is the server running on host


同じ事をしているのに、どうして一方はconnectに失敗するのでしょうか?

投稿日時 - 2017-12-27 17:25:39

QNo.9412265

すぐに回答ほしいです

質問者が選んだベストアンサー

DBサーバー(PostgreSQL)
 ←サーバー1のPHPからはリモートのDBサーバーへ接続可能
 ←サーバー2のPHPからリモートのDBサーバーへ接続不可

ということなら、チェックすべきは
・サーバー2にphp-pgsql等の必要なモジュールがインストールされているか
・サーバー2のSELinux で リモートへのpg_connect を禁止していないか
・サーバー2のFirewallでOutbound方向をポート制限していないか
・DBサーバーのpg_hba.conf でIP制限していないか
・DBサーバーのFirewallでIP制限していない
・途中にルータやFirewallやL3スイッチがあるなら、それのIP制限やポート制限
かと思われますが、
pg_connect()で「Permission denied Is the server running on host」 ということなら
SELinuxが怪しい気がしますので一度、setenforce 0 して試してみてはどうでしょう。
(これで成功するならselinuxをdisabledにするか、selinuxの設定で許可をいれるか)

投稿日時 - 2017-12-28 16:19:31

お礼

SELinuxでした。
SELinuxを止めたら繋がりました。

投稿日時 - 2017-12-29 09:50:09

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

>$dbconn = pg_connect("host=dbserver.net port=5432 user=user1 password=password1 dbname=db1");

実際のDBサーバのホスト名の指定はどうなっていますか?設定に左右されたくなかったら、localhostと書くほうがいいと思いますが・・・

(localhostでなく)ホスト名を書くと「外部アクセスと同じ扱いになる」ことがあるのは自宅サーバなどでもしばしば遭遇すると思います。さすがにネット上のDBサーバが外部アクセスを許可しているとは思えません(そもそもDBサーバより手前の段階で弾かれていると思う)。

投稿日時 - 2017-12-28 10:43:33

お礼

ありがとうございました。

投稿日時 - 2017-12-29 09:49:26

ANo.1

ローカル環境のOSと、サーバ環境のOSでは、FireWallの設定が違っているんじゃないですか?

投稿日時 - 2017-12-27 19:51:49

お礼

有難うございます。

<ローカルWEBサーバー>
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: enp0s25
sources:
services: dhcpv6-client http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:


<WEBサーバー>
# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: ssh dhcpv6-client http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:


ちなみに、双方
systemctl stop firewalld した後でも状況変わらずです。

投稿日時 - 2017-12-28 09:17:45

あなたにオススメの質問