我一直在查看Hanami并发现我的续集连接因以下错误而死亡:
Sequel::DatabaseDisconnectError: PG::ConnectionBad: PQconsumeInput() SSL error: decryption failed or bad record mac: SELECT NULL
无论服务器(瘦,彪马,webrick)还是环境。经过一些实验,结果发现gem 'shotgun'
中的罪魁祸首是Gemfile
(hanami没有重新加载代码)。从霰弹枪文档:
每次收到请求时,它都会分叉,加载应用程序 子进程,处理请求,退出子进程。
在nginx的生产中使用时,分叉续集会因为同样的原因而丢弃连接。
这可以通过以下代码得到改善,但这意味着每个请求都必须重新连接:
SequelDB.extension :connection_validator
SequelDB.pool.connection_validation_timeout = -1
所以似乎Sefor的分叉后连接池已经损坏。
为什么续集会这样做?
答案 0 :(得分:1)
当进程分叉时,进程的每个副本共享用于与postgres通信的文件描述符。这不是续集特定的甚至Postgres特定的,虽然有些库检测到分叉并为你重新连接数据库(请参阅续集问题跟踪器上的这个discussion - 简短的版本是它不会发生续集)