世界上最伟大的投资就是投资自己的教育
Websocket 学习笔记系列文章教程之 部署 (十)
1. 介绍
之前我们说过,有两种方式可以运行在 rails 应用中运行 websocket,一种是以rack hijack
的方式嵌入到 rails 应用中,以路由的形式挂载,成为 rails 应用的一部分,这种方式的话,就不用另开一个进程,因为它是 rails 应用的一部分,而还有另一种式,就是以Standalone
的方式,另开一个独立于 web 进程的 websocket 进程,这个进程是专门处理 websocket 连接和请求的,这样的话就把 web 和 websocket 进程分开了。
而今天我们要讲的是 websocket 的部署。
这个部署分为两部分,第一部分是 websocket 的进程的部署,另一部分是 nginx 的配置。
如果 websocket 是以rack hijack
方式运行,就不用考虑进程的部署,只有当 websocket 是以Standalone
方式运行的时候才要把那个进程部署起来,然而,不管是什么方式,nginx 的配置都是需要的。
2. 使用
当 websocket 是以Standalone
方式运行时,在测试端是以下面的方式运行的。
bundle exec puma -p 28080 cable/config.ru
也就是说,我们要把这个指令产生的效果和 nginx 结合搬到服务器主机上。而且我们在每次部署自动控制这个服务器的重启。
首先还是得先部署 puma 的服务,再来处理 nginx。
2.1 mina-puma 的改造
刚开始会尝试使用mina-puma。
你会发现这个过程是失败的。虽说 mina-puma 也是 puma 结合 pumactl 的指令来控制 puma 的启动,重启等。
但是查看下 mina-puma 就会知道,它也没像上面那样使用端口,也没有指令配置文件。
所以我们需要结合我们自己的条件来改造。
在config/deploy.rb
文件中添加下面的内容。
set :puma_cmd, -> { "#{bundle_prefix} puma" }
set :puma_pid, -> { "#{deploy_to}/#{shared_path}/pids/puma.pid" }
set :puma_state, -> { "#{deploy_to}/#{shared_path}/pids/puma.state" }
set :pumactl_cmd, -> { "#{bundle_prefix} pumactl" }
set :puma_env, -> { fetch(:rails_env, 'production') }
set :pumactl_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/pumactl.sock" }
set :puma_socket, -> { "#{deploy_to}/#{shared_path}/tmp/sockets/puma.sock" }
desc 'Start puma'
task :puma_start : :environment do
queue! %[
if [ -e '#{pumactl_socket}' ]; then
echo 'Puma is already running!';
else
cd #{deploy_to}/#{current_path} && #{puma_cmd} -q -d -e #{puma_env} -b 'unix://#{puma_socket}' -S #{puma_state} --pidfile #{puma_pid} --control 'unix://#{pumactl_socket}' #{deploy_to}/#{current_path}/cable/config.ru
fi
]
end
desc 'Stop puma'
task :puma_stop : :environment do
queue! %[
if [ -e '#{pumactl_socket}' ]; then
echo 'Puma is stopping!'
cd #{deploy_to}/#{current_path} && #{pumactl_cmd} -S #{puma_state} stop
rm -f '#{pumactl_socket}'
else
echo 'Puma is not running!';
fi
]
end
desc 'Restart puma'
task puma_restart: :environment do
invoke :'puma_stop'
invoke :'puma_start'
end
也可以把这些内容封装成文件放到 lib 目录,再来 require,不过这不重要。
在 mina 部署重启用应的地方引用就好了。
desc "Deploys the current version to the server."
task :deploy : :environment do
deploy do
invoke :'sidekiq:quiet'
...
to :launch do
...
invoke :'puma_restart'
...
end
end
end
上面的代码显示,还是用 unix socket 来监听,而不用端口。所以接下来,对 nginx 的配置还是跟前面部署 unicorn 差不多,只是多了 websocket 的部分。
2.2 nginx
nginx 中的配置文件是这样的。
upstream tt {
server unix:/tmp/unicorn_production.sock fail_timeout=0;
}
upstream ws {
server unix:///home/eason/tt_deploy/shared/tmp/sockets/puma.sock fail_timeout=0;
}
server {
server_name www.rails365.net;
root /home/eason/tt_deploy/current/public;
try_files $uri/index.html $uri @tt;
location @tt {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://tt;
}
location /ws/ {
proxy_pass http://ws;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
...
}
不重要的部分被我省略了,最重要的是location /ws/
这部分。其实就多了三行关于 websocket 的配置,很简单。
要测试是否配置成功。可以有两种简单的方法。
第一种是用 chrome 的开发者工具中的 network 部分查看是否有 101 状态码的请求。
第二种是在 chrome 的 console 里测试,比如new WebSocket('ws://www.rails365.net/ws');
,如果没报错,返回正常 ,一般就没问题的。有一点需要注意,假如用的是 https,ws 就得改成 wss。
完结。
本站文章均为原创内容,如需转载请注明出处,谢谢。
© 汕尾市求知科技有限公司 | Rails365 Gitlab | 知乎 | b 站 | csdn
粤公网安备 44152102000088号 | 粤ICP备19038915号
Top