我是第一次尝试在远程/云VPS上设置应用程序(如果重要的话,我正在使用Digital Ocean)。我正在尝试从客户端创建SSH隧道到远程数据库。由于这不是我以前尝试过的,我引用了this,this和this。
查看文章后,我在客户端/本地计算机上运行了以下命令:
ssh -L 5433:localhost:5432 user@REMOTE_IP
然后我尝试连接:
psql -h localhost -p 5433 postgres;
但是,我收到以下错误:
psql: could not connect to server: Connection refused
Is the server running on host "localhost" (127.0.0.1) and accepting
TCP/IP connections on port 5433?
据我所知,我的pg_hba.conf(在远程服务器上)是默认的:
# 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 md5
# IPv6 local connections:
host all all ::1/128 md5
我将postgresql.conf中的“listen_addresses”更改为*
# - Connection Settings -
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost'; use '*' for all
# (change requires restart)
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)
我也尝试用127.0.0.1代替本地主机,但没有成功。
任何建议都将受到赞赏; SSH隧道等不是我熟悉的。
感谢。 编辑:
根据@drdaeman的优秀建议,我运行了以下内容:
sudo ssh -N -vvv -L 5433:localhost:5432 user @ host
最后几个调试行如下:
debug1: Local forwarding listening on 127.0.0.1 port 5433.
debug2: fd 5 setting O_NONBLOCK
debug3: fd 5 is O_NONBLOCK
debug1: channel 1: new [port listener]
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.
debug1: pledge: network
debug3: receive packet: type 80
debug1: client_input_global_request: rtype hostkeys-00@openssh.com want_reply 0
sudo netstat -ltpn | grep 5432
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 5835/postgres
它停在那里,对任何命令都没有反应。
感谢任何指示。
答案 0 :(得分:2)
根据您的描述,一切看起来都不错 - 不要看问题所在,但是您运行的命令和配置看起来是正确的。以下是诊断问题的一般步骤:
首先,检查你的PostgreSQL服务器是否真正在监听。在您的服务器上,运行:
$ sudo netstat -ltpn | grep 5432
(或者您可以使用来自iproute2的ss -ltpn
代替较旧的netstat
)
如果您没有看到任何内容,则表示没有进程正在侦听tcp / 5432。您可以尝试查看PostgreSQL是否在任何地方收听:
$ sudo netstat -lpn | grep postgre
如果没有 - 检查服务器实际运行的时间(取决于操作系统和分发,但先检查ps aux
输出)并检查服务器日志(可能在/var/log
)看到那里的任何问题。
然后,确保您不会在服务器上意外运行psql
(当您使用SSH时,它还会打开shell会话,除非您指定-N
标志)。您需要在本地计算机上运行它;)
然后,您还可以考虑将-v
(或甚至-vvv
)添加到您的ssh
命令中 - 它会发出大量有用的调试信息,例如正常操作如下所示:
debug1: Connection to port 5433 forwarding to localhost port 5432 requested.
debug1: channel 3: new [direct-tcpip]
debug1: channel 3: free: direct-tcpip: listening port 5433 for localhost port 5432, connect from ::1 port 60039 to ::1 port 5433, nchannels 4
如果您看到类似channel 3: open failed: connect failed: Connection refused
的内容,这意味着PostgreSQL拒绝了连接 - 您需要检查其日志以获取推理 - 可能在启用log_connections
和log_disconnections
之后配置(不要忘记重新加载配置)。