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

EC2实例部署JSPaint及HAProxy负载均衡脚本执行异常排查

问题描述

我编写了一套Bash脚本,计划在两台Ubuntu EC2实例上部署JSPaint,同时在另一台实例部署HAProxy实现负载均衡。但目前仅第一台JSPaint实例部署成功,第二台实例的JSPaint及负载均衡实例的HAProxy均未成功部署,仅手动执行脚本可完成部署。现询问是否是scp/ssh命令写法问题,或是其他原因导致该异常。

JSPaint安装脚本(install.sh)

#installing necessary packages
sudo apt update

#installing git into instance
sudo apt install git -y

#curling code to install nodejs packages
curl -fsSL https://deb.nodesource.com/setup_19.x | sudo -E bash - &&sudo apt-get install -y nodejs

# git cloning jspaint repo
git clone https://github.com/1j01/jspaint.git

cd jspaint

# install node package manager for dependencies
npm i

# executes dev script defined in package
npm run dev

HAProxy负载均衡配置脚本(loadbalancer.sh)

# Installing packages
sudo apt update -y

# Installing haproxy
sudo apt install haproxy -y

# Changing configuration file
sudo sh -c "cat >> /etc/haproxy/haproxy.cfg << _END_

frontend myfrontend
  bind 0.0.0.0:1999
  default_backend myservers

backend myservers
  server server1 $REMOTE_IP1:1999
  server server2 $REMOTE_IP2:1999
_END_"

sudo systemctl daemon-reload
# Restart haproxy
sudo systemctl restart haproxy

文件传输及脚本执行命令

scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP1:~
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP2:~
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@REMOTE_IP_LB:~

ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP1 chmod +x ./files/install.sh
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 chmod +x ./files/install.sh
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB chmod +x ./files/loadbalancer.sh 

ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP1 ./files/install.sh 
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 ./files/install.sh 
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB ./files/loadbalancer.sh

问题排查与修复建议

1. SCP命令的变量引用错误

你的scp命令中,REMOTE_IP1、REMOTE_IP2、REMOTE_IP_LB未加$前缀,变量无法被正确展开,scp会尝试连接名为REMOTE_IP1这类字符串的主机,而非实际的EC2实例IP。这是第二台实例和LB实例脚本传输失败的直接原因之一,需修正为:

scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP1:~
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP2:~
scp -r -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY files ubuntu@$REMOTE_IP_LB:~

2. HAProxy脚本的变量传递问题

HAProxy脚本中的$REMOTE_IP1和$REMOTE_IP2是本地变量,远程实例执行脚本时不会自动继承,会被替换为空字符串,导致HAProxy配置文件无效、启动失败。解决方法是执行脚本时将变量传递给远程会话:

ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB "REMOTE_IP1=$REMOTE_IP1 REMOTE_IP2=$REMOTE_IP2 ./files/loadbalancer.sh"

3. 远程执行脚本的错误日志缺失

默认ssh远程执行命令仅返回最终状态,无详细错误输出。可修改执行命令获取详细日志,方便定位问题:

ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP2 "bash -x ./files/install.sh 2>&1"
ssh -o StrictHostKeyChecking=no -i ~/.ssh/$PEM_KEY ubuntu@$REMOTE_IP_LB "REMOTE_IP1=$REMOTE_IP1 REMOTE_IP2=$REMOTE_IP2 bash -x ./files/loadbalancer.sh 2>&1"

-x会打印每个执行的命令,2>&1将错误输出重定向到标准输出,便于查看哪一步出错。

4. 脚本执行的环境与权限问题

  • 非交互式Shell环境变量:远程执行ssh时默认是非交互式shell,PATH等环境变量可能与手动登录时不同,比如npm路径可能不在默认PATH中。可在脚本开头添加source ~/.profile或source ~/.bashrc确保环境变量加载。
  • 前台进程终止:npm run dev是前台运行命令,ssh会话关闭后进程会终止。若需长期运行,应改用nohup npm run dev &或配置systemd服务管理JSPaint进程。

5. 脚本错误检查增强

在install.sh和loadbalancer.sh开头添加set -e,让脚本遇到错误时立即停止,避免后续无效命令执行:

set -e

也可为关键命令添加错误检查,例如:

sudo apt update || { echo "apt update失败"; exit 1; }
git clone https://github.com/1j01/jspaint.git || { echo "git克隆失败"; exit 1; }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 07:50:27