1. 缘由

公司有一个项目,需要用到websocket,所谓websocket是基于tcp/ip的协议,它跟http协议是同等级的。它解决的问题是长轮循的资源消耗问题。也就是用它做类似长轮循的应用时,因为本身协议的支持,资源消耗是较低的。类似的应用可以是聊天室,通知系统,股票实时更新等。具体的我们不再细说。由于我们项目是部署在nginx上的,用的ruby on rails开发的,使用的gem是actioncable。rails程序是用unicorn部署的,websocket是用puma来部署,也是actioncable默认建议的。也就是两个程序,一个是web的,一个是websocket的。两个都是挂在nginx下。nginx作为反向代理服务器,代理请求到unicorn或puma,unciron或puma处理后,交给nginx,nginx再转发给客户端。nginx作为高性能的服务器,起到缓冲作用,主要的压力也是集中在nginx上,这也是一般rails程序的部署情况。

之前unicorn是部署好的。这个时候要加上puma。仿照unicorn在nginx的配置,puma在nginx也是一样的。都是用proxy_pass加上upstream就可以搞定。关于nginx的具体配置问题可以查看本站nginx相关的文章。这里不再详述。

配置好了。刚开始第一次发出请求可以成功的,因为我监控了puma的日志,能够产生正确的请求日志,但发出第二次就不行了,总是超时。最后我查到了原因,原来是nginx在1.4以上才支持websocket。我发现线上centos用yum安装的nginx版本才是1.0,真是醉了。关于如果如何查看websocket请求的问题可以查看本站websocket相关的文章。

我想给nginx来个升级,但最好是无破坏的升级。假如你在线上还有程序在跑,你可不能破坏掉。不然由此造成的业务损失,可得怪你。

2. 升级过程

在安装前先执行下面的命令,这是我安装过程中遇到的问题。先安装就能避免了。

  1. sudo yum -y install pcre-devel openssl openssl-devel

在官网上找到了nginx的最新稳定版本,下载下来,然后解压缩。

  1. cd nginx
  2. ./configure \
  3. --prefix=/etc/nginx \
  4. --sbin-path=/usr/sbin/nginx \
  5. --conf-path=/etc/nginx/nginx.conf \
  6. --pid-path=/var/run/nginx.pid \
  7. --lock-path=/var/run/nginx.lock \
  8. --error-log-path=/var/log/nginx/error.log \
  9. --http-log-path=/var/log/nginx/access.log \
  10. --with-http_gzip_static_module \
  11. --with-http_stub_status_module \
  12. --with-http_ssl_module \
  13. --with-pcre \
  14. --with-file-aio \
  15. --with-http_realip_module \
  16. --without-http_scgi_module \
  17. --without-http_uwsgi_module \
  18. --without-http_fastcgi_module
  19. make
  20. sudo make install

关于这里面的参数,可以使用nginx -V查看。

这个时候已经安装完毕了,但是你还没有用新nginx来启动,还有,老的nginx还在用着呢,如何无缝启动呢。

Makefile提供了一个命令

  1. sudo make upgrade

就好了。这样可以杀死旧的nginx进程,用新的来代替。详细的你可以查看Makefile文件。

完结。