Rails 3.2プロジェクトでリモートPostgreSQLデータベースに接続しようとすると、次のエラーが発生します。
FATAL: no pg_hba.conf entry for Host "10.0.0.3", user "projectx", database "projectx", SSL off
Railsの設定は次のようになります:
staging:
adapter: postgresql
database: projectx
username: projectx
password: 123456
Host: 10.0.0.3
encoding: utf8
template: template0
min_messages: warning
postgreSQLでは次のようになります。
hostssl all all 0.0.0.0/0 md5
hostssl all all ::/0 md5
両方のマシンはUbuntu12.04で実行されています。
自動的に機能するはずだという投稿を見つけましたが、明らかに発生しません。 libpqでSSLが有効になっておらず、有効にすると問題が解決したという意見もありましたが、有効にする方法についての説明はありませんでした。 libpqの依存関係を見ると、いくつかのSSLパッケージに依存していることがわかります。したがって、SSLサポートがコンパイルされていると思います。
いくつかの投稿はこれを追加することを推奨しました:
sslmode: require
またはこれ:
sslmode: enabled
sslモードを有効にしますが、効果はありませんでした。私はそれが黙って無視されていることを読みました。
また、データベース文字列アプローチを試しましたが、最終的には次のようになりました。
staging:
adapter: postgresql
database: "Host=10.0.0.3 dbname=projectx user=projectx password=123456 sslmode=require"
そして、私はエラーが発生しました:
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
これは、Railsが10.0.0.3ではなくローカルホストまたはローカルPostgreSQL(存在しない)に接続しようとしていたことを示しているようです。
何か案は?
あなたが書いたように、通常、Ubuntu 12.xパッケージは、SSLがアクティブ化され、箱から出してすぐに機能するように設定されています。さらに、最初のメソッドRails
、またはlibpq
にこのような処理を許可するクライアント、つまりほぼすべてのクライアントによって試行されました。
この自動有効化は、他のPostgreSQLパッケージや自己コンパイルされたサーバーでは必ずしも当てはまらないため、これらの他のコンテキストに適用される回答やアドバイスは役に立ちません。
セットアップは直接機能するはずなので、この回答は何がうまくいかないかを見つけるためにチェックすることのリストです。できれば、psql
ではなくRails
を最初に使用して接続設定をテストし、一般的なpostgresqlの問題を最初に除外できるようにします。
クライアント側 sslmode
パラメーターは、接続試行のシーケンスを制御します。
SSLを自発的に回避するには、クライアントは接続文字列のどこかにsslmode=disable
を置くか、環境のPGSSLMODE=disable
を置くか、他のいずれかを台無しにする必要があります PGSSL*
変数。万が一、あなたのRailsプロセスがその環境でこれを持っていた場合、pg_hba.conf
が非SSL接続を許可しないことを考えると、それはあなたが得ているエラーを説明するでしょう。
SSLを試さないもう1つの理由は、明らかにlibpq
がSSLサポート付きでコンパイルされていない場合ですが、Ubuntuパッケージの場合はそうではありません。
sslmode
のデフォルトはprefer
で、次のように記述されます。
優先(デフォルト)
first try an SSL connection; if that fails, try a non-SSL connection
エラーメッセージの最後にあるSSL=off
は、失敗した最後の接続試行に関連しています。 SSLが試行されて失敗したか、まったく試行されなかった可能性があります。このメッセージだけではわかりません。 SSL=off
での接続試行は、通常、pg_hba.conf
(最初の列のhostssl
)で設定されたポリシーに従ってサーバーによって拒否されます。
問題がサーバー側にあることはもっともらしいです。なぜなら、うまくいかない可能性があるよりも多くのことがあるからです。
サーバー側で確認するさまざまな事項は次のとおりです。
ssl=on
にはpostgresql.conf
があるはずです(デフォルトの場所:/etc/postgresql/9.1/main/
)
psql
を使用してローカルホストに接続すると、次のようなメッセージが表示されます。
psql(9.1.13)
SSL接続(暗号:DHE-RSA-AES256-SHA、ビット:256)
ヘルプを表示するには「help」と入力してください。
ca-certificates
パッケージがインストールされ、最新である必要があります。
ssl-cert
パッケージがインストールされ、最新である必要があります。
Postgresデータディレクトリ(デフォルトでは/var/lib/postgresql/9.1/main
)内に、ソフトリンクがあるはずです。server.crt -> /etc/ssl/certs/ssl-cert-snakeoil.pem
または別の有効な証明書、およびserver.key -> /etc/ssl/private/ssl-cert-snakeoil.key
または別の有効なキー。
/etc/ssl/certs
および親ディレクトリは、postgresによって読み取り可能でCD可能である必要があります。
postgres
unixユーザーはssl-cert
unixグループに属している必要があります(id -a postgres
で確認してください)。そうでない場合、秘密鍵を読み取ることができません。
postgresql.conf
を変更する場合は、他のテストを行う前に、postgresqlが再起動されることを確認してください。
起動時または接続試行の失敗時に、/var/log/postgresql/postgresql-9.1-main.log
にSSLに関する疑わしいメッセージが表示されないようにする必要があります。
RailsはpostgresにPGgemを使用して接続します。実装については、こちらをご覧ください。
PG gemは、libpg(cライブラリ)とここにある「PG :: Connection.new」に関するドキュメントを使用します: http://deveiate.org/code/pg/PGconn.html
次のオプションを提案します。
Host
server hostname
hostaddr
server address (avoids hostname lookup, overrides Host)
port
server port number
dbname
connecting database name
user
login user name
password
login password
connect_timeout
maximum time to wait for connection to succeed
options
backend options
tty
(ignored in newer versions of PostgreSQL)
sslmode
(disable|allow|prefer|require)
krbsrvname
kerberos service name
gsslib
GSS library to use for GSSAPI authentication
service
service name to use for additional parameters
したがって、これは接続文字列が機能しないことを示します(アダプターによって認識されないため、これはmysqlアダプターオプションである可能性があります)
また、これはsslmode=required
オプションは、libpgの基本機能であるため、機能するはずです。
そう:
database.yml
staging:
...
sslmode: "require"
...
間違いなくトリックを行う必要があります、ステージングモードを使用してもよろしいですか? //念のため、他の環境にもsslmodeを追加します。
また、libpgは最初の試行としてデフォルトでSSLを使用します。SSLモードが最初に失敗したためにSSLオフでエラーが表示され、次にlibpqがsslなしで再試行し、最終的にエラーが発生しました。