云引擎 FAQ
综合
云引擎都支持哪些语言
目前支持 Node.js、Python、Java、PHP、.NET、Go 运行环境,未来可能还会引入其他语言。
云引擎支持托管纯静态网站吗
支持。命令行工具初始化项目选择语言环境时,依次选择 Others > Static Site 即可。
云引擎支持 HTTPS 吗
- 自定义域名在绑定时启用 SSL 即可支持 HTTPS。
- 如需配置自动跳转,请看云引擎下如何重定向到 HTTPS?。
云引擎采用什么样的休眠策略?
标准实例不会休眠。
体验实例会执行休眠策略:
- 如果应用最近一段时间(半小时)没有任何外部请求,则休眠。
- 休眠后如果有新的外部请求实例则马上启动。访问者的体验是第一个请求响应时间是 5 ~ 30 秒(视实例启动时间而定),后续访问响应速度恢复正常。
- 强制休眠:如果最近 24 小时内累计运行超过 18 小时,则强制休眠。此时新的请求会收到 503 的错误响应码,该错误可在 云服务控制台 > 云引擎 > 云引擎分组 > 统计 中查看。
云引擎的请求有哪些限制?
云引擎的负载均衡组件限制了请求不能超过 100 MB(包括直接上传文件到云引擎)、请求处理不得超过 60 秒,WebSocket 60 秒无数据会被断开连接。
国内节点未绑定独立 IP 的云引擎默认为纯静态站点优化。请求会先经过边缘节点,再视缓存命中情况回源到负载均衡组件,最后到达你的应用。 边缘节点额外限制了请求不能超过 60 MB、请求处理不得超过 10 秒,另外边缘节点不支持 WebSocket 请求和 HTTP PATCH 方法,也不支持获取客户端 IP。 因此,如果您在国内节点云引擎托管动态网站,我们建议您绑定独立 IP,使用独立入口,不经过边缘节点,自然也就没有上述限制。
云引擎运行日志大小有限制吗?
日志单行最大 4096 个字符,多余部分会被丢弃;日志输出频率大于 600 行/分钟,多余的部分会被丢弃。
云引擎使用什么时区?
国内版使用北京时间(东八区),国际版使用 UTC+0 时区。
如何查看云引擎的出入口 IP 地址?
如果开发者希望在第三方服务平台(如微信开放平台)上配置 IP 白名单而需要获取云引擎的入口或出口 IP 地址,请进入 云服务控制台 > 云引擎 > 设置 > 出入口 IP 来自助查询。
我们会尽可能减少出入口 IP 的变化频率,但 IP 突然变换的可能性仍然存在。因此在遇到与出入口 IP 相关的问题,我们建议先 进入控制台来核实一下 IP 列表是否有变化。
如需保持入口 IP 不变,建议为云引擎绑定独立 IP。
如何访问云引擎预备环境中托管的网站?
需要在控制台手动绑定一个 stg- 开头的域名。stg- 开头的自定义域名(例如 stg-web.example.com)会被自动地绑定到预备环境。
如何判断当前云引擎是预备环境还是生产环境?
默认情况,云引擎只有一个「生产环境」,对应的域名是 web.example.com。在生产环境中有一个「体验实例」来运行应用。
当生产环境的体验实例升级到「标准实例」后会有一个额外的「预备环境」,对应域名 stg-web.example.com,两个环境所访问的都是同样的数据,你可以用预备环境测试你的云引擎代码,每次修改先部署到预备环境,测试通过后再发布到生产环境;如果你希望有一个独立数据源的测试环境,建议单独创建一个应用。
另外,stg-web.example.com 域名是需要在控制台自行绑定的。
Application not found 错误
访问云引擎服务时,服务端返回错误「Application not found」或在云引擎 日志中出现这个错误,可能有以下原因:
- 调用错了环境。最常见的情况是,免费的体验实例是没有预备环境,开发者却主动设置去调用预备环境。
- 云引擎自定义域名填错了,比如微信回调地址。
- 因为免费版(体验版)的云引擎是有休眠的,休眠期间被调用会出现这个错误。建议升级到标准实例以保证实例一直运行。
云引擎会重复提交请求吗?
云引擎的负载均衡对于幂等的请求(GET、PUT),在 HTTP 层面出错或超时的情况下是会重试的。 可以使用正确的谓词(例如 POST)避免此类重试。
云引擎中如何处理用户登录和 Cookie?
如果你的页面主要由服务端渲染,可以使用我们在部分 SDK 中提供的管理 Cookie 和 Session 的中间件或模块,也可以其他第三方的中间件或模块,在 Cookie 中维护用户状态。
使用 Cookie 作为鉴权方式需要注意防范 CSRF 攻击(其他站点伪造带有正确 Cookie 的恶意请求)。 业界通常使用 CSRF Token 来防御 CSRF 攻击,你需要传递给客户端一个随机字符串(即 CSRF Token,可通过 Cookie 传递),客户端在每个有副作用的请求中都要将 CSRF 包含在请求正文或 Header 中,服务器端需要校验这个 CSRF Token 是 否正确。
如果你的页面主要是由浏览器端渲染,那么建议在前端使用 SDK 登录用户,调用 SDK 的接口获取 session token,通过 HTTP Header 等方式将 session token 发送给后端。
例如,在前端登录用户并通过 user.getSessionToken() 获取 sessionToken 并发送给后端:
AV.User.login(user, pass).then(user => {
return fetch('/profile', {
headers: {
'X-LC-Session': user.getSessionToken()
}
});
});
相应的后端 Node.js 代码:
app.get('/profile', function (req, res) {
AV.User.become(req.headers['x-lc-session']).then(user => {
res.send(user);
}).catch(err => {
res.send({ error: err.message });
});
});
app.post('/todos', function (req, res) {
var todo = new Todo();
todo.save(req.body, { sessionToken: req.headers['x-lc-session'] }).then(() => {
res.send(todo);
}).catch(err => {
res.send({ error: err.message });
});
});
云引擎下如何管理用户会话?
使用各框架自带的组件或第三方模块即可 。
例如:
- Node.js 的 Express 框架可以使用 cookie-session 组件。它和
AV.Cloud.CookieSession组件可以并存。注意,Express 框架的express.session.MemoryStore在云引擎中是无法正常工作的,因为云引擎是多主机、多进程运行,因此内存型 session 是无法共享的。 - Python 的 Flask 框架和 Django 框架都自带 session 组件。
- PHP 可以使用 SDK 提供的
CookieStorage保存会话属性。注意,PHP 默认的$_SESSION在云引擎中是无法正常工作的,因为云引擎是多主机、多进程运行,因此内存型 session 是无法共享的。
云引擎下如何发送 HTTP 请求?
使用各语言的标准库或社区提供的模块即可。
例如:
- Node.js 项目可以使用 superagent 等社区提供的模块。
- Python 项目可以使用标准库中的
urllib.request模块或社区的 requests 模块。 - PHP 项目可以使用 PHP 内置的
curl模块或 guzzle 等第三方库。 - Java 项目可以使用
URL或者是HttpClient等基础类或 OkHttp 等第三方库。
云引擎下如何获取客户端 IP?
如果你想获取客户端的 IP,可以直接从用户请求的 HTTP 头的 x-real-ip 字段获取。
下面给出各语言的示例代码。
Node.js(Express):
app.get('/', function (req, res) {
var ipAddress = req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log(ipAddress);
res.send(ipAddress);
});
Python(Flask):
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/')
def index():
print(request.headers['x-real-ip'])
return 'ok'
Python(Django):
def index(request):
print(request.META['HTTP_X_REAL_IP'])
return render(request, 'index.html', {})
PHP:
$app->get('/', function($req, $res) {
error_log($_SERVER['HTTP_X_REAL_IP]);
return $res;
});
Java:
EngineRequestContext.getRemoteAddress();
Go(Echo):
func fetchRealIP(c echo.Context) error {
realIP = c.RealIP()
//...
}
注意,国内节点的云引擎应用,如果启用了边缘节点加速功能,由于边缘节点的限制,可能无法获取客户端 IP。 如需获取客户端 IP,建议绑定独立 IP。
云引擎如何上传文件?
托管在云引擎的网站可以使用相应 SDK 提供的接口上传文件。 不过,一般情况下建议在客户端 SDK 上传文件,而不是通过云引擎中转,以免增加不必要的云引擎流量。
云引擎下如何重定向到 HTTPS?
大部分 SDK 提供了重定向至 HTTPS 的中间件。 部署并发布到生产环境之后,访问你的 LeanEngine 网站都会强制通过 HTTPS 访问。
Node.js(Express):
app.enable('trust proxy');
app.use(AV.Cloud.HttpsRedirect());
Node.js(Koa):
app.proxy = true;
app.use(AV.Cloud.HttpsRedirect({ framework: 'koa' }));
Python:
import leancloud
application = get_your_wsgi_func()
application = leancloud.HttpsRedirectMiddleware(application)
PHP(Slim):
SlimEngine::enableHttpsRedirect();
$app->add(new SlimEngine());
Java:
LeanEngine.setHttpsRedirectEnabled(true);
Go SDK 暂未提供跳转至 HTTPS 的中间件。
.NET:
app.UseHttpsRedirection();
如何判断请求是通过 HTTPS 还是 HTTP 访问的?
因为 HTTPS 加密是在负载均衡层面处理的,所以通常部署在云引擎上的 web 框架获取的请求 URL 总是使用 HTTP 协议,建议通过 X-Forwarded-Proto HTTP 头来判断原请求是通过 HTTP 还是 HTTPS 访问的。
每个应用最多有几个实例?
每个应用最多拥有 12 个实例,如果需要更多资源请通过工单联系我们的技术支持。
在线上无法读取到项目中的文件怎么办?
建议先检查文件大小写是否正确,线上的文件系统是区分大小写的,而 Windows 和 macOS 通常不区分大小写。
云引擎响应时间增加怎么办
响应时间的增加有很多种原因:可能因为只是单纯的请求处理的数据更加复杂导致耗时变长;也有可能是因为请求量过高实例的处理能力不足从而导致响应时间增加。 建议分析当前的代码并参考 CPU、内存占用量找出瓶颈,确定是否需要调高实例规格或增加实例数量。 如果需要定位具体是哪些 API 或云函数响应较慢,可以下载访问日志分析。