You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Capistrano部署Ubuntu服务器Rails 6应用时预编译阶段卡顿求助

排查与解决Capistrano资产预编译卡顿问题

1. 调整Capistrano的SSH输出缓冲设置

Capistrano通过SSH执行命令时,默认的输出缓冲可能导致进程挂起,尤其是资产预编译这类输出量大的任务。

  • 在deploy.rb或对应环境配置文件中开启PTY(伪终端),强制禁用输出缓冲:
    set :pty, true
    
    或者针对资产预编译任务单独配置:
    namespace :deploy do
      namespace :assets do
        task :precompile do
          on roles(fetch(:assets_roles)) do
            within release_path do
              with rails_env: fetch(:rails_env) do
                execute :bundle, :exec, :rake, "assets:precompile", pty: true
              end
            end
          end
        end
      end
    end
    
    原理:开启PTY会让远程命令识别为交互式终端环境,避免因输出缓冲溢出导致进程阻塞。

2. 排查资产预编译后续环节的问题

从卡顿日志看,进程停留在NPM构建完成阶段,大概率是Capistrano后续的资产清理/同步任务出问题。

  • 临时禁用资产清理任务,测试部署是否恢复:
    在deploy.rb中添加:
    Rake::Task["deploy:assets:clean"].clear_actions
    
    如果部署正常,再逐步排查assets:clean或assets:backup_manifest等任务的权限冲突、文件锁问题。

3. 优化SSH连接的超时与保活设置

从netstat结果看,卡顿存在额外SSH连接,可能是会话超时或服务器连接限制导致进程挂起。

  • 调整服务器端/etc/ssh/sshd_config配置:
    ClientAliveInterval 60
    ClientAliveCountMax 10
    TCPKeepAlive yes
    
    重启sshd服务:sudo systemctl restart sshd
  • 同时在本地config/deploy.rb中设置SSH保活:
    set :ssh_options, {
      keepalive: true,
      keepalive_interval: 60,
      timeout: 300
    }
    

4. 对比Capistrano与手动执行的环境差异

手动执行正常但Capistrano卡顿,大概率是环境变量不一致导致的。

  • 在Capistrano的资产预编译任务中输出完整环境变量,和手动执行的结果对比:
    修改任务添加环境输出:
    namespace :deploy do
      namespace :assets do
        task :precompile do
          on roles(fetch(:assets_roles)) do
            within release_path do
              execute :printenv
              with rails_env: fetch(:rails_env) do
                execute :bundle, :exec, :rake, "assets:precompile"
              end
            end
          end
        end
      end
    end
    
    重点对比PATH、RBENV_VERSION、NODE_ENV、RAILS_ENV等变量,确保Capistrano执行时的环境和手动操作一致。

5. 检查服务器资源限制

Rails 6的Webpacker编译需要较多内存,服务器资源不足可能导致进程挂起。

  • 部署时在另一个SSH会话中用htop或top监控内存、CPU占用:
    如果出现内存耗尽(OOM),可以:
    • 临时启用swap空间:sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
    • 调整Webpacker配置,关闭source map、拆分编译chunk以降低资源占用
    • 升级服务器内存

6. 更新Capistrano及相关依赖版本

老旧的Capistrano插件可能和Rails 6、Webpacker存在兼容性问题。

  • 更新Gemfile中的Capistrano相关依赖:
    gem 'capistrano', '~> 3.17'
    gem 'capistrano-rails', '~> 1.6'
    gem 'capistrano-rbenv', '~> 2.2'
    
    执行bundle update capistrano capistrano-rails capistrano-rbenv后重新测试部署。

内容的提问来源于stack exchange,提问作者Syl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 11:15:04