-
Notifications
You must be signed in to change notification settings - Fork 117
Description
I'm using ngx_mruby to do dynamic lets encrypt ssl resolution. Currently building from source against nginx 1.16.0 and ngx_mruby 2.1.5.
Here's the relevant parts of the configuration:
# /etc/nginx/nginx.conf
http {
# ...
include /etc/nginx/conf.d/*.conf;
mruby_init_worker_code '
userdata = Userdata.new
redis_url = "redis://my.redis.url:6379"
redis_host, redis_port = redis_url[/redis:\/\/(.+)/, 1].split(":")
userdata.redis = Redis.new redis_host, redis_port.to_i
userdata.redis.select 2
';
}
# /etc/nginx/conf.d/app.conf
# ...
server {
listen 443 ssl;
# ...
mruby_ssl_handshake_handler_code '
ssl = Nginx::SSL.new
domain = ssl.servername
redis = Userdata.new.redis
ssl_certificate = redis["#{domain}.crt"]
ssl_key = redis["#{domain}.key"]
if ssl_certificate && ssl_certificate != "" && ssl_key && ssl_key != ""
ssl.certificate_data = ssl_certificate
ssl.certificate_key_data = ssl_key
end
';
# ...
}After roughly 45 minutes of running ngx_mruby, i start to see these redis connection failures:
2019/08/25 20:53:03 [error] 23164#0: *17960 ngx_mruby : mrb_run failed: return 500 HTTP status code to client: error: INLINE CODE:6: could not read reply (Redis::ConnectionError) while SSL handshaking, client: 122.36.17.229, server: 0.0.0.0:443
If I reload nginx, the errors stop. If I let the server run for about 45 minutes, they will inevitably return. Right now I'm avoiding these by reloading nginx every 15 minutes on a cron job, but it seems like there's some sort of issue with the embedded ruby code that causes the redis connection to stop working eventually. Maybe the embedded ruby code is leaving redis connections hanging or something.
The server this running on has unlimited ulimit and the number of open redis connections has never exceeded a couple hundred.
Has anyone else seen these types of errors?