我的网站全站使用 https 访问的,现在使用 faye 做推送服务,参考了这篇文章http://afitnerd.com/2012/08/14/websockets-over-ssl-stunnel-haproxy-node-js/ 因为 nginx 目前的版本是不支持 websocket 的,如果使用 longpoll 方式推送,消息的延时是非常明显的,同时,faye 的后台日志里也有大量的错误。
http |nginx:80 |
client-->|stunnel:443|-->|haproxy:8080|----> |nginx:8443|-->|thin:3000|
| websocket
|--------------------^
1.首先,服务器开放 80 和 433 的端口,用户对 80 端口的访问将重新定向到 443 的 https 服务上。这个工作是由 nginx 完成的。
2.为了使用 haproxy 转发 websocket 的请求,必须对请求内容进行分析,由于 ssl 是加密的内容,必须现在 stunnel 中将 ssl 解开,转换成 http 协议。 3.haproxy 根据协议头中的信息,区分是 websocket 协议还是 http 协议,分别转向到 nginx:8443 还是 thin:3000 的 faye 服务上。因为我把 faye 和 rails 合并在一个 thin 上运行,所以,haproxy 和 nginx 都会请求这个 thin 的服务。
安装 stunnel 的方法如下:
$ wget -c http://www.stunnel.org/downloads/stunnel-4.53.tar.gz
$ tar -xvzf stunnel-4.53.tar.gz
$ cd stunnel-4.53
$ ./configure
$ make
$ sudo make install
$ useradd stunnel
$ mkdir -p /opt/stunnel/ssl
$ mkdir -p /opt/stunnel/pid
$ vi /opt/stunnel/stunnel.conf
$ cat ssl.crt server.key > /opt/stunnel/ssl/cert.key_pem
$ chmod 600 cert.key_pem
stunnel 配置文件如下
pid = /opt/stunnel/pid/stunnel.pid
#foreground = yes
setgid = stunnel
setuid = stunnel
cert = /opt/stunnel/ssl/cert.key_pem
[https]
accept = 443
connect = 8080
启动 stunnel
$ stunnel /opt/stunnel/stunnel.conf
安装 haproxy
$ wget -c http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz
$ tar -xvzf haproxy-1.4.22.tar.gz
$ make TARGET=linux26
$ make TARGET=linux26 PREFIX=/opt/haproxy
$ useradd haproxy
$ sudo make install PREFIX=/opt/haproxy
vi /etc/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local0 notice
maxconn 4096
daemon
nbproc 1
pidfile /var/run/haproxy.pid
user haproxy
group haproxy
defaults
mode http
frontend all *:8080
timeout client 86400000
default_backend nginx_backend
acl is_websocket hdr(Upgrade) -i WebSocket
acl is_websocket hdr_beg(Host) -i ws
acl is_faye url_sub comet
use_backend faye_backend if is_faye
use_backend ws_backend if is_websocket
backend ws_backend
option forwardfor
timeout queue 5000
timeout connect 86400000
timeout server 86400000
server server1 localhost:3000 maxconn 2000 check
backend faye_backend
option forwardfor
timeout connect 4000
timeout server 30000
server server1 localhost:3000 maxconn 1024 check
backend nginx_backend
option forwardfor
timeout connect 4000
timeout server 86400000
server server1 localhost:8443 maxconn 1024 check
启动 haproxy
sudo /opt/haproxy/sbin/haproxy -f /etc/haproxy.cfg