如何使用Laravel建立和保持与数据库的远程连接
如何通过Laravel设置和保持与数据库的远程连接
远程连接数据库是在Laravel开发中经常遇到的问题。当客户端不发送信息时,服务器端的ssh守护程序(sshd)会关闭连接,导致连接丢失。为了避免这种情况,我们可以通过设置ssh客户端定期向服务器发送保持连接信号来解决。
解决方法是在文件$HOME/.ssh/config中配置相关内容。如果该文件不存在,请创建它(该配置文件不应该对其他用户可读,因此在创建文件后运行chmod 600 ~/.ssh/config命令来设置权限)。为了每隔四分钟(240秒)向远程主机发送信号,将以下内容放入配置文件中:
Host remotehost
HostName remotehost.com
ServerAliveInterval 240
如果想要对所有主机启用发送保持连接信号的功能,请在配置文件中添加以下内容:
Host * ServerAliveInterval 240
配置文件必须只对当前用户可写,可读性不是问题。使用600作为权限级别是可以的,因为这只会对当前用户可写。
很多时候,关于配置名称会有困惑:客户端使用ServerAliveInterval,而服务器使用ClientAliveInterval。这真是一团糟。
作为API设计人员,我可能会以两种方式都放置配置项,这种困惑很常见。最重要的是选择一个标准,并进行良好的文档说明。
对于Windows用户,配置文件位于c:/users/youruser/.ssh/config。
这就像当你去Carl的房子时,在冰箱上看到一张纸条上写着"Mike's address:
"。混淆的是Mike的名字被写在Carl的房子上,Carl是唯一一个不需要出现在Carl的房子上的名字。在使用AT&T的移动热点时,我总是需要这个设置...他们喜欢每5分钟关闭TCP连接,这真是有趣。
为什么我们"必须"使用chmod 600?默认的644权限有什么问题?
644权限允许组和公共用户读取您的配置文件,可能会泄露信息。ssh_config的man页指定"用户可读/写,其他用户不可写",这意味着644权限是可以的。但是通常更安全的做法是使用600权限,因为在某些情况下,644权限可能会触发错误。
如何通过Laravel设置和保持与数据库的远程连接
有些人可能想知道,如何在Laravel中设置和保持与数据库的远程连接。下面是解决这个问题的原因和方法。
原因:
- 在远程连接中,如果没有从客户端接收到任何数据,sshd(8)将通过加密通道发送一条消息来请求客户端的响应。
- 如果在发送客户端保持活动的消息时达到了阈值,sshd(8)将断开与客户端的连接,终止会话。
解决方法:
- 在服务器端的/etc/ssh/sshd_config
文件中添加以下代码:
ClientAliveInterval 60 ClientAliveCountMax 2
- 将ClientAliveInterval
设置为服务器检查客户端活动的时间间隔,以秒为单位。
- 将ClientAliveCountMax
设置为在不接收到客户端消息的情况下可以发送的客户端活动消息的数量。
- 如果您希望服务器在没有响应的死连接上断开连接,并且可以自定义发生这种情况的频率和时间,请只在服务器上设置ClientAliveInterval
。
- 在我的情况下,服务器端设置了ClientAliveInterval 15
和ClientAliveCountMax 2
,客户端端设置了-o reconnect
,在通过sshfs传输大文件时运行良好。
通过在服务器端设置ClientAliveInterval
和ClientAliveCountMax
以及在客户端端设置-o reconnect
,可以解决Laravel中设置和保持与数据库的远程连接的问题。这样可以确保远程连接的稳定性和持久性。
问题的原因是想要在与Laravel的数据库建立和保持远程连接。然而,现有的解决方案只能提供一次性的连接,而不能保持长期连接。为了解决这个问题,有几种方法可以尝试。
第一种方法是使用以下命令建立一个一次性连接:
ssh -o ServerAliveInterval=60 myname.com
然后将其存储为别名:
alias sshprod='ssh -v -o ServerAliveInterval=60 myname.com'
通过以下方式连接:
me:~$ sshprod
然而,这并不是一个真正的“一次性解决方案”。如果需要多次连接服务器,为什么不使用Host *
和ServerAliveInterval 240
的方法来设置连接呢?或者,可以在~/.bashrc
中创建一个别名:alias ssh='ssh -o ServerAliveInterval=60'
。
还有一种方法是使用.ssh/config
文件来设置连接。可以在文件中添加以下内容:
Host myname.com ServerAliveInterval 60
,这样就可以在连接时自动设置ServerAliveInterval
参数。
另外,也可以使用别名来连接到具有非标准端口的开发/生产服务器,以避免每次都输入端口号。例如:alias sshweb='ssh -o ServerAliveInterval=60 zak.com -p 9999'
或alias sshdev='ssh -o ServerAliveInterval=60 zak.example.com -p 7777'
。
对于IP地址会经常改变的情况,使用别名可能不是一个好的解决方案。更好的方法是使用工具内置的配置选项,而不是重新发明自己的方法来解决这个问题。
有多种方法可以解决Laravel与数据库建立和保持远程连接的问题。可以选择使用命令行参数、别名或配置文件来设置连接参数,以满足不同的需求。