目前支持 Node.js、Python、Java、PHP 和 .Net 运行环境,未来可能还会引入其他语言。
支持。命令行工具初始化项目选择语言环境时,依次选择 Others > Static Site 即可。
首先确认一下 Hook 被调用的时机是否与你的理解一致:
beforeSave
afterSave
beforeUpdate
afterUpdate
beforeDelete
afterDelete
onVerified
onLogin
become(sessionToken)
还需注意在本地进行云引擎调试时,运行的会是线上预备环境的 Hook,如果没有预备环境则不会运行。
然后检查 Hook 函数是否被执行过:
可以先在 Hook 函数的入口打印一行日志,然后进行操作,再到云引擎日志中检查该行日志是否被打印出来,如果没有看到日志原因可能包括:
如果日志已打出,则继续检查函数是否成功,检查控制台上是否有错误信息被打印出。如果是 before 类 Hook,需要保证 Hook 函数在 15 秒内结束,否则会被系统认为超时。
after 类 Hook 超时时间为 3 秒,如果你的体验实例已经休眠,很可能因为启动时间过长无法收到 after 类 Hook,建议升级到云引擎的标准实例避免休眠。
相关文档:云引擎指南:Hook 函数
有些地区 Homebrew 访问网络可能很慢,可以通过设置环境变量 http_proxy、https_proxy、all_proxy 加速访问(详见 man brew),或者也可以配置 Homebrew 索引和二进制预编译包的镜像。
http_proxy
https_proxy
all_proxy
或者也可以在 GitHub releases 页面 下载适用于 macOS 的二进制文件,重命名为 lean 后移动到 $PATH 下的路径,并添加可执行权限(chmod a+x /path/to/lean)。 如果运行 lean 时 macOS 报错「来自身份不明的开发者」,那么需要在 macOS 系统设置「隐私与安全」下配置一下,详见 Apple 官方文档。
lean
$PATH
chmod a+x /path/to/lean
Error: listen EADDRINUSE :::3000
listen EADDRINUSE :::3000 表示你的程序默认使用的 3000 端口被其他应用占用了,可以按照下面的方法找到并关闭占用 3000 端口的程序:
listen EADDRINUSE :::3000
lsof
kill
fuser
netstat
taskkill
也可以修改命令行工具默认使用的 3000 端口:
lean -p 3002
please login first
lean login
如果通过 lean login 登录的账号名下没有 LeanCloud 应用,会碰到这一问题。 需要创建一个应用再重新运行一下 lean login,之后就可以正常使用了。
访问云引擎服务时,服务端返回错误「Application not found」或在云引擎日志中出现同一错误。
云函数是 LeanCloud 提供的一个 相对受限 的自定义服务器端逻辑的功能,和我们的 SDK 有比较 深度的集成。我们将云函数设计为一种类似 RPC 的机制,在云函数中你只能关注参数和结果,而不能自定义超时时间、HTTP Method、URL,不能读取和设置 Header。如果希望更加自由地使用这些 HTTP 的语义化功能,或者希望使用第三方的框架提供标准的 RESTful API,请使用云引擎的 网站托管功能,自行来处理 HTTP 请求。
请参考 网站托管开发指南 · 预备环境和生产环境 。
系统赠送的预备环境体验实例会自动休眠,可能干扰定时任务的执行,因此一般建议在预备环境测试定时任务,在生产环境正式执行定时任务。 如果定时任务 CPU、内存占用非常高,担心影响生产环境的网站托管功能或其他云函数访问,那么可以在预备环境购买标准实例,并在预备环境执行定时任务。
只需要像普通的 Node.js 项目那样,在项目根目录的 package.json 中添加依赖即可:
package.json
{ "dependencies": { "async": "0.9.0", "moment": "2.9.0" } }
dependencies 内的内容表明了该项目依赖的三方模块(比如示例中的 async 和 moment)。关于 package.json 的更多信息见 网站托管开发指南 · package.json。
dependencies
async
moment
然后即可在代码中使用第三方包(var async = require('async')),如需在本地调试还需运行 npm install 来安装这些包。
var async = require('async')
npm install
注意:命令行工具部署时是不会上传 node_modules 目录,因为云引擎服务器会根据 package.json 的内容自动下载三方包。所以也建议将 node_modules 目录添加到 .gitignore 中,使其不加入版本控制。
node_modules
.gitignore
将 JavaScript SDK 和 Node SDK 升级到 1.2.2 以上版本可以彻底解决该问题。
如果你的应用时不时出现 Maximum call stack size exceeded 异常,可能是因为在 hook 中调用了 AV.Object.extend。有两种方法可以避免这种异常:
Maximum call stack size exceeded
AV.Object.extend
AV.Cloud.define
我们在 JavaScript 指南 - 构建对象 章节中也进行了描述。
首先建议检查云引擎日志,检查每分钟请求数、响应时间、CPU、内存统计,查看是否存在其他异常情况,如果有的话,先解决其他的问题。如果是从某个时间点开始内存使用变高,建议检查这个时间点之前是否有部署新版本,然后检查新版本的代码改动或尝试回滚版本。
然后这里有一些常见的原因可供对照检查:
如果还不能找到原因,可以尝试一些更高级的工具:
--trace_gc
scripts.start
node --trace_gc server.js
其他参考资料(第三方):
首先建议检查云引擎日志,检查每分钟请求数、响应时间、CPU、内存统计,查看是否存在其他异常情况,如果有的话,先解决其他的问题。如果是从某个时间点开始 CPU 使用变高,建议检查这个时间点之前是否有部署新版本,然后检查新版本的代码改动或尝试回滚版本。
因为 Node.js 是基于单线程的事件循环模型,如果事件循环中新的任务一直得不到执行(即事件循环被「阻塞」),那么就会造成 CPU 不高,但响应缓慢或不响应的情况。导致事件循环被阻塞的场景情况包括:
fs.readFileSync
child_process.execSync
sync-request
process.nextTick
setImmediate
其他会导致 Node.js 响应慢或不响应的情况:
dns.lookup
如果能不能找到原因,可以尝试一些更高级的工具:
node --prof
node --prof-process
云引擎中如果有 LeanCloud 的存储等 API 调用,按 API 收费策略 收费。另外如果使用的是云引擎 标准实例 也会产生使用费,具体请参考 云引擎运行方案。
「定义函数」的产生是为了方便大家初次体验云引擎,或者只是需要一些简单 hook 方法的应用使用。我们的实现方式就是把定义的函数拼接起来,生成一个云引擎项目然后部署。
所以可以认为「定义函数」和 「Git 部署」最终是一样的,都是一个完整的项目。
定义函数是一个单独功能,可以不用使用基础包,git 等工具快速的生成和编辑云引擎。
当然,你也可以使用基础包,自己写代码并部署项目。
这两条路是分开的,任何一个部署,就会导致另一种方式失效掉。
lean init
node-js-getting-started
cloud.js
AV.User.current()
request.currentUser
lean up
lean deploy
lean publish
可以通过 lean switch 切换项目所属应用,然后通过 lean deploy 部署。 lean switch 支持通过参数以非交互的方式使用:
lean switch
lean switch --region REGION --group GROUP_NAME APP_ID lean deploy --prod 1
上述命令中,REGION 代表应用所在区域,目前支持的值为 CN(华北节点)、TAB(华东节点)、US(国际版)。 --prod 1 表示部署到生产环境,如果希望部署到预备环境,换成 lean deploy 即可。 基于这两个命令可以自行编写 CI 脚本快速部署至多个应用的云引擎实例。
REGION
CN
TAB
US
--prod 1
将 JavaScript SDK 和 Node SDK 升级到 3.0 以上版本可以彻底解决该问题。
云函数在响应时会调用到 AV.Object#toJSON 方法,将结果序列化为 JSON 对象返回给客户端。在早期版本中 AV.Object#toJSON 方法为了防止循环引用,当遇到属性是 Pointer 类型会返回 Pointer 元信息,不会将 include 的其他字段添加进去,我们在 JavaScript SDK 3.0 中对序列化相关的逻辑做了重新设计,将 JavaScript SDK 和 Node SDK 升级到 3.0 以上版本便可以彻底解决该问题。
AV.Object#toJSON
如果暂时无法升级 SDK 版本,可以通过这样的方式绕过:
AV.Cloud.define('querySomething', function(req, res) { var query = new AV.Query('Something'); // user 是 Something 表的一个 Pointer 字段 query.include('user'); query.find().then(function(results) { // 手动进行一次序列化 results.forEach(function(result){ result.set('user', result.get('user') ? result.get('user').toJSON() : null); }); // 再返回查询结果给客户端 res.success(results); }).catch(res.error); });
Python SDK 也存在类似的问题,只会返回 Pointer 元信息,因此也需要额外进行一次查询并手动进行序列化。
使用 Node SDK 定义的云函数,如果返回一个不是 AVObject 的值,比如字符串、数字,RPC 调用得到的是空对象({})。 类似地,如果返回一个包含非 AVObject 成员的数组,RPC 调用的结果中该数组的相应成员也会被序列化为 {}。 这个问题将在 Node SDK 的下一个大版本(4.0)中修复。 目前绕过这一个问题的方法是将返回结果放在对象({})中返回。
{}
部署失败有多种原因,请根据显示的报错信息耐心排查。 一般来说,如果您使用命令行工具部署,首先建议您检查命令行工具是否是最新版,如果不是最新版,先升级到最新版再重试。
很多用户自己使用 Gitlab 搭建了自己的源码仓库,有时可能会遇到无法部署到 LeanCloud 的问题,即使设置了 Deploy Key,却仍然要求输入密码。
可能的原因和解决办法如下:
!
*
sudo service ssh restart
App dxzag3zdjuxbbfufuy58x1mvjq93udpblx7qoq0g27z51cx3's cloud code deploy key
npm ERR! peer dep missing
部署时出现类似错误:
npm ERR! peer dep missing: graphql@^0.10.0 || ^0.11.0, required by express-graphql@0.6.11
说明有一部分 peer dependency 没有安装成功,因为线上只会安装 dependencies 部分的依赖,所以请确保 dependencies 部分依赖所需要的所有依赖也都列在了 dependencies 部分(而不是 devDependencies)。
你可以在本地删除 node_modules,然后用 npm install --production 重新安装依赖来重现这个问题。
npm install --production
node --max-http-header-size
云引擎负载均衡限制 HTTP Header 大小为 8 KB(和Node.js 的默认值保持一致)。 因此无法通过 --max-http-header-size 指定大于 8 KB 的值。
--max-http-header-size
建议先检查文件大小写是否正确,线上的文件系统是区分大小写的,而 Windows 和 macOS 通常不区分大小写。
这个步骤对应在云端调用各个语言的包管理器(npm、pip、composer、maven)安装依赖的过程,我们有一个 依赖缓存 机制来加速这个安装过程,但缓存可能会因为很多原因失效(比如修改了依赖列表),在缓存失效时会比平时慢很多,请耐心等待。如果你在 leanengine.yaml 中指定了系统依赖也会在这个步骤中安装,因此请不要添加未用到的依赖。
npm
pip
composer
maven
leanengine.yaml
对于 Node.js 建议检查是否在 package-lock.json 或 yarn.lock 中指定了较慢的源(见 网站托管开发指南 · Node.js)。
package-lock.json
yarn.lock
同一环境(预备/生产)下有多个实例时,云引擎会同时在所有实例上部署项目。如因偶然因素部分实例部署不成功,会在几分钟后自动尝试再次部署,无需手动重新部署。
控制台显示的「部署中」状态泛指所有运维操作,例如唤醒休眠实例、服务器偶发故障引起的重新部署,不只是用户主动进行的部署。
云引擎的管理系统会每隔几分钟检查所有实例的工作状态(通过 HTTP 检查,详见 网站托管开发指南:健康监测),如果实例无法正确响应的话,管理系统会触发一次重新部署,并在控制台上打印类似下面的日志:
健康检查失败:web1 检测到 Error connect ECONNREFUSED 10.19.30.220:51797
如果一周内发生一两次属正常现象(有可能是我们的服务器出现偶发的故障,因为会立刻重新部署,对服务影响很小),如果频繁发生可能是你的程序资源不足,或存在其他问题(运行一段时间后不再响应 HTTP 请求),需结合具体情况来分析。
可以参考我们的 Demo: batch-update。
云引擎的应用日志(程序的标准输出和标准错误输出)可以在 应用控制台 > 云引擎 > 应用日志 查看;并且可以使用 命令行工具 导出最长 7 天的日志。
云引擎的访问日志(Access Log)可在 应用控制台 > 云引擎 > 访问日志 中导出,通过控制台下载经过打包的日志。
见 网站托管开发指南 · Java。
phpcomposer.com 镜像已经停止服务,PHP 项目的 composer.lock 文件如果包含了这个地址的 url,会导致依赖安装失败。 解决方法有两种:
composer.lock
coposer.json
composer update --lock
云引擎底层有一套缓存机制以加速构建过程,所以部署时显示的「存储镜像到仓库」后面的大小表示本次构建新产生的数据,可用于评估是否利用到了缓存,不代表整个项目的大小。
云引擎的负载均衡对于幂等的请求(GET、PUT),在 HTTP 层面出错或超时的情况下是会重试的。 可以使用正确的谓词(例如 POST)避免此类重试。
见 LeanCache 使用指南。
见 网站托管开发指南 · Node.js。
见 云函数开发指南 · Node.js。
Chrome 80 起 SameSite 的默认值为 Lax,如果你的应用的前端没部署在云引擎上,又需要向云引擎发送携带 Cookie 的 POST 请求,那么需要设置 SameSite 为 none。 AV.Cloud.CookieSession 会将所有参数都传递给浏览器的 cookies.set(),所以你可以将 sameSite 传入:
SameSite
Lax
none
AV.Cloud.CookieSession
cookies.set()
sameSite
AV.Cloud.CookieSession({sameSite: 'none'})
注意:
Secure
国际版可以在「控制台 > 云引擎 > 设置」配置 avosapps.us 子域名,也可以绑定云引擎自定义域名(不要求备案)。
avosapps.us
如果希望在国际版云引擎绑定裸域名,我们建议选择支持 ANAME 或 CNAME Flattening 记录的域名服务商。
云引擎常见问题和解答
云引擎都支持哪些语言
目前支持 Node.js、Python、Java、PHP 和 .Net 运行环境,未来可能还会引入其他语言。
云引擎支持托管纯静态网站吗
支持。命令行工具初始化项目选择语言环境时,依次选择 Others > Static Site 即可。
云引擎支持 HTTPS 吗
为什么 Class Hook 没有被运行?
首先确认一下 Hook 被调用的时机是否与你的理解一致:
beforeSave
:对象保存或创建之前afterSave
:对象保存或创建之后beforeUpdate
:对象更新之前afterUpdate
:对象更新之后beforeDelete
:对象删除之前afterDelete
:对象删除之后onVerified
:用户通过邮箱或手机验证后onLogin
:用户在进行登录操作时(become(sessionToken)
不是登录操作,因此不会调用onLogin
)还需注意在本地进行云引擎调试时,运行的会是线上预备环境的 Hook,如果没有预备环境则不会运行。
然后检查 Hook 函数是否被执行过:
可以先在 Hook 函数的入口打印一行日志,然后进行操作,再到云引擎日志中检查该行日志是否被打印出来,如果没有看到日志原因可能包括:
如果日志已打出,则继续检查函数是否成功,检查控制台上是否有错误信息被打印出。如果是 before 类 Hook,需要保证 Hook 函数在 15 秒内结束,否则会被系统认为超时。
相关文档:云引擎指南:Hook 函数
使用 Homebrew 安装命令行工具失败
有些地区 Homebrew 访问网络可能很慢,可以通过设置环境变量
http_proxy
、https_proxy
、all_proxy
加速访问(详见 man brew),或者也可以配置 Homebrew 索引和二进制预编译包的镜像。或者也可以在 GitHub releases 页面 下载适用于 macOS 的二进制文件,重命名为
lean
后移动到$PATH
下的路径,并添加可执行权限(chmod a+x /path/to/lean
)。 如果运行lean
时 macOS 报错「来自身份不明的开发者」,那么需要在 macOS 系统设置「隐私与安全」下配置一下,详见 Apple 官方文档。命令行工具在本地调试时提示
Error: listen EADDRINUSE :::3000
,无法访问应用listen EADDRINUSE :::3000
表示你的程序默认使用的 3000 端口被其他应用占用了,可以按照下面的方法找到并关闭占用 3000 端口的程序:lsof
和kill
fuser
netstat
和taskkill
也可以修改命令行工具默认使用的 3000 端口:
命令行工具初始化项目时报错
please login first
,可是之前明明已经通过lean login
成功登录了?如果通过
lean login
登录的账号名下没有 LeanCloud 应用,会碰到这一问题。 需要创建一个应用再重新运行一下lean login
,之后就可以正常使用了。Application not found 错误
访问云引擎服务时,服务端返回错误「Application not found」或在云引擎日志中出现同一错误。
云函数有哪些限制?
云函数是 LeanCloud 提供的一个 相对受限 的自定义服务器端逻辑的功能,和我们的 SDK 有比较 深度的集成。我们将云函数设计为一种类似 RPC 的机制,在云函数中你只能关注参数和结果,而不能自定义超时时间、HTTP Method、URL,不能读取和设置 Header。如果希望更加自由地使用这些 HTTP 的语义化功能,或者希望使用第三方的框架提供标准的 RESTful API,请使用云引擎的 网站托管功能,自行来处理 HTTP 请求。
如何判断当前是预备环境还是生产环境?
请参考 网站托管开发指南 · 预备环境和生产环境 。
定时任务应该在预备环境还是生产环境执行?
系统赠送的预备环境体验实例会自动休眠,可能干扰定时任务的执行,因此一般建议在预备环境测试定时任务,在生产环境正式执行定时任务。 如果定时任务 CPU、内存占用非常高,担心影响生产环境的网站托管功能或其他云函数访问,那么可以在预备环境购买标准实例,并在预备环境执行定时任务。
怎么添加第三方模块
只需要像普通的 Node.js 项目那样,在项目根目录的
package.json
中添加依赖即可:dependencies
内的内容表明了该项目依赖的三方模块(比如示例中的async
和moment
)。关于package.json
的更多信息见 网站托管开发指南 · package.json。然后即可在代码中使用第三方包(
var async = require('async')
),如需在本地调试还需运行npm install
来安装这些包。注意:命令行工具部署时是不会上传
node_modules
目录,因为云引擎服务器会根据package.json
的内容自动下载三方包。所以也建议将node_modules
目录添加到.gitignore
中,使其不加入版本控制。Maximum call stack size exceeded 如何解决?
如果你的应用时不时出现
Maximum call stack size exceeded
异常,可能是因为在 hook 中调用了AV.Object.extend
。有两种方法可以避免这种异常:AV.Cloud.define
方法之外),确保不会对一个 Class 执行多次AV.Object.extend
我们在 JavaScript 指南 - 构建对象 章节中也进行了描述。
如何排查云引擎 Node.js 内存使用过高(内存泄漏)?
首先建议检查云引擎日志,检查每分钟请求数、响应时间、CPU、内存统计,查看是否存在其他异常情况,如果有的话,先解决其他的问题。如果是从某个时间点开始内存使用变高,建议检查这个时间点之前是否有部署新版本,然后检查新版本的代码改动或尝试回滚版本。
然后这里有一些常见的原因可供对照检查:
如果还不能找到原因,可以尝试一些更高级的工具:
--trace_gc
:可以在 GC 时在标准输出打印简要的日志,包括 GC 的类型、耗时,GC 前后的堆体积和对象数量(在package.json
的scripts.start
里改成node --trace_gc server.js
来开启)。其他参考资料(第三方):
如何排查云引擎 Node.js CPU 使用过高(响应缓慢)?
首先建议检查云引擎日志,检查每分钟请求数、响应时间、CPU、内存统计,查看是否存在其他异常情况,如果有的话,先解决其他的问题。如果是从某个时间点开始 CPU 使用变高,建议检查这个时间点之前是否有部署新版本,然后检查新版本的代码改动或尝试回滚版本。
然后这里有一些常见的原因可供对照检查:
--trace_gc
打开 GC 日志来确认 GC 的影响。因为 Node.js 是基于单线程的事件循环模型,如果事件循环中新的任务一直得不到执行(即事件循环被「阻塞」),那么就会造成 CPU 不高,但响应缓慢或不响应的情况。导致事件循环被阻塞的场景情况包括:
fs.readFileSync
、child_process.execSync
或含有这些同步操作的第三方包(例如sync-request
)。process.nextTick
或setImmediate
,导致事件队列中的任务一直执行不完。其他会导致 Node.js 响应慢或不响应的情况:
dns.lookup
(多数 HTTP 客户端间接使用了该函数)、所有文件系统 API,如果大量使用这些 API 或这些操作非常慢,则会产生额外的等待。如果能不能找到原因,可以尝试一些更高级的工具:
node --prof
:可以统计程序中每一个函数的执行耗时和调用关系,导出一份日志文件,可以用node --prof-process
来生成一份报告,包括占用 CPU 时间最多的函数(包括 JavaScript 和 C++ 部分)列表。node --prof
对性能本身的影响很大,长时间运行生成的日志也很大,建议尽量在本地运行,如需在线上运行则需要你自己编码实现生成报告、下载报告等功能。其他参考资料(第三方):
调用云引擎方法如何收费?
云引擎中如果有 LeanCloud 的存储等 API 调用,按 API 收费策略 收费。另外如果使用的是云引擎 标准实例 也会产生使用费,具体请参考 云引擎运行方案。
「定义函数」和「Git 部署」可以混用吗?
「定义函数」的产生是为了方便大家初次体验云引擎,或者只是需要一些简单 hook 方法的应用使用。我们的实现方式就是把定义的函数拼接起来,生成一个云引擎项目然后部署。
所以可以认为「定义函数」和 「Git 部署」最终是一样的,都是一个完整的项目。
定义函数是一个单独功能,可以不用使用基础包,git 等工具快速的生成和编辑云引擎。
当然,你也可以使用基础包,自己写代码并部署项目。
这两条路是分开的,任何一个部署,就会导致另一种方式失效掉。
如何从「在线编辑」迁移到项目部署?
lean init
初始化项目,模板选择node-js-getting-started
(我们的 Node.js 示例项目)。cloud.js
(替换掉原有内容)。cloud.js
的代码,将AV.User.current()
改为request.currentUser
以便从 Node SDK 的 0.x 版本升级到 1.x,有关这个升级的更多信息见 升级到云引擎 Node.js SDK 1.0。lean up
,在 http://localhost:3001 的调试界面中测试云函数和 Hook,然后运行lean deploy
部署代码到云引擎(使用标准实例的用户还需要执行lean publish
)。同一个项目如何批量部署到多个应用的云引擎?
可以通过
lean switch
切换项目所属应用,然后通过lean deploy
部署。lean switch
支持通过参数以非交互的方式使用:上述命令中,
REGION
代表应用所在区域,目前支持的值为CN
(华北节点)、TAB
(华东节点)、US
(国际版)。--prod 1
表示部署到生产环境,如果希望部署到预备环境,换成lean deploy
即可。 基于这两个命令可以自行编写 CI 脚本快速部署至多个应用的云引擎实例。为什么云函数中 include 的字段没有被完整地发给客户端?
云函数在响应时会调用到
AV.Object#toJSON
方法,将结果序列化为 JSON 对象返回给客户端。在早期版本中AV.Object#toJSON
方法为了防止循环引用,当遇到属性是 Pointer 类型会返回 Pointer 元信息,不会将 include 的其他字段添加进去,我们在 JavaScript SDK 3.0 中对序列化相关的逻辑做了重新设计,将 JavaScript SDK 和 Node SDK 升级到 3.0 以上版本便可以彻底解决该问题。如果暂时无法升级 SDK 版本,可以通过这样的方式绕过:
Python SDK 也存在类似的问题,只会返回 Pointer 元信息,因此也需要额外进行一次查询并手动进行序列化。
RPC 调用云函数时,为什么会返回预期之外的空对象?
使用 Node SDK 定义的云函数,如果返回一个不是 AVObject 的值,比如字符串、数字,RPC 调用得到的是空对象(
{}
)。 类似地,如果返回一个包含非 AVObject 成员的数组,RPC 调用的结果中该数组的相应成员也会被序列化为{}
。 这个问题将在 Node SDK 的下一个大版本(4.0)中修复。 目前绕过这一个问题的方法是将返回结果放在对象({}
)中返回。使用命令行工具部署失败怎么办?
部署失败有多种原因,请根据显示的报错信息耐心排查。 一般来说,如果您使用命令行工具部署,首先建议您检查命令行工具是否是最新版,如果不是最新版,先升级到最新版再重试。
Gitlab 部署常见问题
很多用户自己使用 Gitlab 搭建了自己的源码仓库,有时可能会遇到无法部署到 LeanCloud 的问题,即使设置了 Deploy Key,却仍然要求输入密码。
可能的原因和解决办法如下:
!
修改为*
,原因参考 Stackoverflow - SSH Key asks for password,并重启 SSH 服务:sudo service ssh restart
。App dxzag3zdjuxbbfufuy58x1mvjq93udpblx7qoq0g27z51cx3's cloud code deploy key
),需要删除掉这部分再保存到 Gitlab。npm ERR! peer dep missing
错误怎么办?部署时出现类似错误:
说明有一部分 peer dependency 没有安装成功,因为线上只会安装 dependencies 部分的依赖,所以请确保 dependencies 部分依赖所需要的所有依赖也都列在了 dependencies 部分(而不是 devDependencies)。
你可以在本地删除 node_modules,然后用
npm install --production
重新安装依赖来重现这个问题。node --max-http-header-size
无效?云引擎负载均衡限制 HTTP Header 大小为 8 KB(和Node.js 的默认值保持一致)。 因此无法通过
--max-http-header-size
指定大于 8 KB 的值。在线上无法读取到项目中的文件怎么办?
建议先检查文件大小写是否正确,线上的文件系统是区分大小写的,而 Windows 和 macOS 通常不区分大小写。
部署时长时间卡在「正在下载和安装依赖」怎么办?
这个步骤对应在云端调用各个语言的包管理器(
npm
、pip
、composer
、maven
)安装依赖的过程,我们有一个 依赖缓存 机制来加速这个安装过程,但缓存可能会因为很多原因失效(比如修改了依赖列表),在缓存失效时会比平时慢很多,请耐心等待。如果你在leanengine.yaml
中指定了系统依赖也会在这个步骤中安装,因此请不要添加未用到的依赖。对于 Node.js 建议检查是否在
package-lock.json
或yarn.lock
中指定了较慢的源(见 网站托管开发指南 · Node.js)。部署到多个实例时,部分实例失败需要重新部署吗?
同一环境(预备/生产)下有多个实例时,云引擎会同时在所有实例上部署项目。如因偶然因素部分实例部署不成功,会在几分钟后自动尝试再次部署,无需手动重新部署。
云引擎实例部署后控制台多次显示「部署中」是怎么回事?
控制台显示的「部署中」状态泛指所有运维操作,例如唤醒休眠实例、服务器偶发故障引起的重新部署,不只是用户主动进行的部署。
云引擎的健康检查是什么?
云引擎的管理系统会每隔几分钟检查所有实例的工作状态(通过 HTTP 检查,详见 网站托管开发指南:健康监测),如果实例无法正确响应的话,管理系统会触发一次重新部署,并在控制台上打印类似下面的日志:
如果一周内发生一两次属正常现象(有可能是我们的服务器出现偶发的故障,因为会立刻重新部署,对服务影响很小),如果频繁发生可能是你的程序资源不足,或存在其他问题(运行一段时间后不再响应 HTTP 请求),需结合具体情况来分析。
如何使用云引擎批量更新数据?
可以参考我们的 Demo: batch-update。
如何下载云引擎的应用日志和访问日志
云引擎的应用日志(程序的标准输出和标准错误输出)可以在 应用控制台 > 云引擎 > 应用日志 查看;并且可以使用 命令行工具 导出最长 7 天的日志。
云引擎的访问日志(Access Log)可在 应用控制台 > 云引擎 > 访问日志 中导出,通过控制台下载经过打包的日志。
如何定制 Java 的堆内存大小?
见 网站托管开发指南 · Java。
PHP 项目从 files.phpcomposer.com 下载文件失败,部署失败怎么办?
phpcomposer.com 镜像已经停止服务,PHP 项目的
composer.lock
文件如果包含了这个地址的 url,会导致依赖安装失败。 解决方法有两种:composer.lock
后再部署(云引擎会直接根据coposer.json
安装依赖)。composer update --lock
更新composer.lock
文件中的下载链接(不改变具体的版本)。多次部署同一个项目时镜像大小为什么差别那么大?
云引擎底层有一套缓存机制以加速构建过程,所以部署时显示的「存储镜像到仓库」后面的大小表示本次构建新产生的数据,可用于评估是否利用到了缓存,不代表整个项目的大小。
云引擎会重复提交请求吗?
云引擎的负载均衡对于幂等的请求(GET、PUT),在 HTTP 层面出错或超时的情况下是会重试的。 可以使用正确的谓词(例如 POST)避免此类重试。
如何在本地调试依赖 LeanCache 的应用?
见 LeanCache 使用指南。
云引擎是否可以使用本地磁盘存储文件?
见 网站托管开发指南 · Node.js。
云引擎如何上传文件?
见 网站托管开发指南 · Node.js。
云引擎中如何处理用户登录和 Cookie?
见 网站托管开发指南 · Node.js。
定时任务 crontab 表达式
见 云函数开发指南 · Node.js。
跨域 POST 请求未携带 Cookie 怎么办?
Chrome 80 起
SameSite
的默认值为Lax
,如果你的应用的前端没部署在云引擎上,又需要向云引擎发送携带 Cookie 的 POST 请求,那么需要设置SameSite
为none
。AV.Cloud.CookieSession
会将所有参数都传递给浏览器的cookies.set()
,所以你可以将sameSite
传入:注意:
SameSite
要求与Secure
标记一同发送,因此请确保你的客户端是通过 HTTPS 协议访问云引擎的。SameSite
为none
,以免平白增加 CSRF 风险。国际版云引擎必须绑定自定义域名吗?
国际版可以在「控制台 > 云引擎 > 设置」配置
avosapps.us
子域名,也可以绑定云引擎自定义域名(不要求备案)。国际版云引擎可以绑定裸域名吗?
如果希望在国际版云引擎绑定裸域名,我们建议选择支持 ANAME 或 CNAME Flattening 记录的域名服务商。