我对这个问题的位置感到困惑,但基本上我把nginx代理websocket连接到一个后端ruby瘦服务器,后者在Ruby on Rails应用程序中用websocket-rails模块来连接服务。 除了可能所有的套接字都没有closures以外,其他所有的工作都可以正常工作,所以瘦服务器相对较快地耗尽了文件描述符。
我正在使用nginx 1.4.2,这是我的configuration:
map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen my.ip.num.ber:80; server_name admin3.mydomain.com; root /home/apps/mydomain/current/public; try_files $uri/index.html $uri @admin3.mydomain.com; access_log /var/log/nginx/admin3.access.log combined; error_log /var/log/nginx/admin3.error.log error; location /websocket { proxy_redirect off; proxy_pass http://localhost:3008; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; keepalive_timeout 90; proxy_connect_timeout 10; proxy_read_timeout 60; proxy_send_timeout 60; } }
我正在使用瘦1.5.1,这是configuration:
port: 3008 user: ploy group: ploy pid: /home/apps/mydomain/shared/pids/thin.pid timeout: 90 wait: 30 log: /home/apps/mydomain/shared/log/thin.log max_conns: 1024 require: [] environment: production max_persistent_conns: 512 servers: 1 threaded: false #no-epoll: false daemonize: true chdir: /home/apps/mydomain/current tag: admin3
一次只有几十个活动的websocket连接,而且从客户端浏览器或websocket-rails后端来看,它们似乎已经被build立和终止了。 但瘦服务器结束了1025打开的文件描述符,大多是套接字。
ls -l /proc/`ps aux | grep "thin server" | grep -v grep | head -n 1 | awk '{print $2}'`/fd
给出这样的事情:
lrwx------. 1 root root 64 Aug 31 15:15 993 -> socket:[1319549665] lrwx------. 1 root root 64 Aug 31 15:15 994 -> socket:[1319549762] lrwx------. 1 root root 64 Aug 31 15:15 995 -> socket:[1319549850] lrwx------. 1 root root 64 Aug 31 15:15 996 -> socket:[1319549974] lrwx------. 1 root root 64 Aug 31 15:15 997 -> socket:[1319846052] lrwx------. 1 root root 64 Aug 31 15:15 998 -> socket:[1319549998] lrwx------. 1 root root 64 Aug 31 15:15 999 -> socket:[1319550000]
类似的事情似乎随后发生在nginx上:
ls -l /proc/`ps aux | grep "nginx: worker" | grep -v grep | head -n 1 | awk '{print $2}'`/fd
虽然套接字文件描述符的数量慢慢地增加,到达1025需要更长的时间。事实上,我只看到过一次。
所以,在识别nginxconfiguration有问题的时候,或者在瘦客户端,或者在websocket-rails后端,我都有点不知所措。 我希望你的一些训练有素的眼睛可能会看到明显的错误,即使你不熟悉后端部分。
让我来回答我自己的问题……出了什么问题,与上面列出的configuration没有任何关系,这似乎是完全合理的。
websocket-rails模块的作者指出,我正在为websocket模块中触发的每个动作打开一个到Redis的新连接。 很明显,连接没有正确closures,导致开放的套接字不被closures,导致薄到停顿。 使用Redis连接设置一次并重新使用改变了一切。
所以,一个相当模糊的情况,我有点尴尬,甚至提出它作为服务器configuration问题。