Bluemix CIO上Node.js定时任务运行3次后崩溃重启求助
排查Bluemix CIO部署后Node.js应用重复崩溃重启问题
我来帮你梳理这个问题的排查方向,先把你的场景和核心报错信息整理清楚:
问题背景
你开发了一个Node.js应用,通过定时任务(cron jobs)运行从远程UNIX服务器迁移过来的Python脚本——这个脚本在原服务器稳定运行,本地测试功能也正常,但部署到Bluemix CIO后,应用只能运行3次就崩溃重启,且该过程不断重复。
核心报错信息
从日志来看,崩溃的根源是Python脚本发起HTTPS请求时连接超时,具体报错如下:
APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/util/retry.py", line 388, in increment 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='9.16.172.220', port=9443): Max retries exceeded with url: /ibm/iis/igc-rest/v1/search/ (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 110] Connection timed out',)) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 在处理上述异常期间,又发生了另一个异常: 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 raise MaxRetryError(_pool, url, error or ResponseError(cause)) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connectionpool.py", line 601, in urlopen 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connection.py", line 284, in connect 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 self._validate_conn(conn) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 chunked=chunked) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 TimeoutError: [Errno 110] Connection timed out 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 在处理上述异常期间,又发生了另一个异常: 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 sock.connect(sa) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 raise err 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 (self.host, self.port), self.timeout, **extra_kw) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 ----- Python 回溯信息 ----- 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at ChildProcess.emit (events.js:214:7) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at emitTwo (events.js:126:13) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at ChildProcess. (/home/vcap/deps/0/node_modules/python-shell/index.js:89:9) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at terminateIfNeeded (/home/vcap/deps/0/node_modules/python-shell/index.js:98:28) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 at PythonShell.parseError (/home/vcap/deps/0/node_modules/python-shell/index.js:184:17) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 ^ 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 throw err; 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 timeout=timeout 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "igc-cloudant_test.py", line 190, in 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 _stacktrace=sys.exc_info()[2]) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connectionpool.py", line 639, in urlopen 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/requests/adapters.py", line 440, in send 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 回溯(最近的调用最先): 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 回溯(最近的调用最先): 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 在处理上述异常期间,又发生了另一个异常: 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 urllib3.exceptions.NewConnectionError: : Failed to establish a new connection: [Errno 110] Connection timed out 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connection.py", line 150, in _new_conn 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 conn = self._new_conn() 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connectionpool.py", line 850, in _validate_conn 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0/home/vcap/app/server.js:42 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0Error: requests.exceptions.ConnectionError: HTTPSConnectionPool(host='9.16.172.220', port=9443): Max retries exceeded with url: /ibm/iis/igc-rest/v1/search/ (Caused by NewConnectionError(': Failed to establish a new connection: [Errno 110] Connection timed out',)) 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/connection.py", line 141, in _new_conn 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/util/connection.py", line 83, in create_connection 2018年5月11日 下午04:08:10.243 APP/PROC/WEB/0 File "/home/vcap/deps/1/python/lib/python3.6/site-packages/urllib3/util/connection.py", line 73, in create_connection
排查思路
1. 网络连通性验证
- 先确认Bluemix CIO环境能否访问目标服务器
9.16.172.220:9443:可以在应用容器内执行telnet 9.16.172.220 9443或curl -v https://9.16.172.220:9443/ibm/iis/igc-rest/v1/search/测试连通性。如果无法连接,大概率是网络策略限制(比如防火墙、安全组、Bluemix出站规则)导致的——原UNIX服务器可能在企业内网,能直接访问目标服务,而Bluemix的公共网络被目标服务器防火墙拦截。 - 联系企业IT团队,确认是否需要将Bluemix的出口IP加入目标服务器的白名单。
2. 连接资源泄漏检查
- 脚本运行3次后崩溃,可能是每次请求失败后未正确释放连接资源,导致连接池耗尽。检查Python脚本中的
requests调用:是否用requests.Session()复用连接?是否在请求后关闭了连接? - 查看Node.js端调用Python脚本的逻辑:是否每次运行后都正确回收了子进程资源?有没有子进程泄漏导致应用资源耗尽的情况?
3. Bluemix资源限制排查
- 检查Bluemix给你的应用分配的内存、CPU资源是否足够:在Bluemix控制台查看应用的资源监控数据,看3次运行后是否达到了资源阈值(比如内存占满),触发平台自动重启。
- 确认定时任务的频率是否过高,短时间内资源占用累积超过限制。
4. SSL证书信任问题
- 目标服务用HTTPS,检查Bluemix环境的Python是否信任目标服务器的SSL证书:如果是自签名证书,要么在脚本中临时关闭验证(仅测试用,不推荐生产),要么将CA证书导入应用的信任存储。
- 测试代码示例:
requests.get(url, verify=False),如果能成功连接,说明是证书信任问题。
5. 异常捕获与进程稳定性优化
- Bluemix默认会在应用崩溃后自动重启,核心是要避免Node.js进程因Python脚本的错误而崩溃。在Node.js代码中添加异常捕获逻辑:
const { PythonShell } = require('python-shell'); PythonShell.run('igc-cloudant_test.py', null, function (err, results) { if (err) { console.error('Python脚本执行出错:', err); // 这里添加错误处理:比如记录日志、延迟重试,不要直接抛出错误导致进程崩溃 return; } console.log('脚本执行结果:', results); });
6. 目标服务限流策略确认
- 联系目标服务
9.16.172.220:9443的管理员,确认是否有限流规则(比如限制同一IP的请求次数)。原服务器可能在白名单内,而Bluemix的出口IP不在,导致3次请求后被限流,后续请求超时。
内容的提问来源于stack exchange,提问作者Vijay Sarathy
相关产品推荐
相关产品推荐

