域名无法访问的临时解决方案

我们监测到从今天(06/20)下午开始各个地区陆续出现部分网络无法解析 leancloud.cn 以及 ***.***.lncld.net 域名的问题。我们正在全力和域名提供商沟通该问题的解决方案。在问题彻底解决之前,我们建议开发者更换域名作为临时解决方案。

开发者如何访问 LeanCloud 控制台等服务

将原域名 leancloud.cn 切换成 avoscloud.com 即可:

官网:https://avoscloud.com/
博客:https://blog.avoscloud.com/
健康状态:https://status.avoscloud.com
论坛:https://forum.avoscloud.com

华北节点控制台:https://avoscloud.com/dashboard/
华东节点控制台:https://tab.avoscloud.com
美国节点控制台:https://us.avoscloud.com

华北节点

云引擎

云引擎本身不受影响(因为云引擎内部运行的代码访问 API 走的是内网),但是命令行工具部署代码可能有问题,需要进行如下配置后才能正常使用:

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://avoscloud.com
export LEANCLOUD_API_SERVER=https://avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://avoscloud.com
set LEANCLOUD_API_SERVER=https://avoscloud.com

2) 使用 lean login 重新登录

当然,如果在云引擎托管网站,其中的客户端 JavaScript 访问 LeanCloud API,
仍然需要按照下面 JavaScript SDK 一节中的方法切换域名。

服务端应用

如果是在自己的服务器上跑的应用(包括通过 REST API 和 SDK),
最简单快捷的方法是修改服务器的 /etc/hosts,加入以下行:

117.50.12.165        leancloud.cn
123.59.50.132        app-router.leancloud.cn
123.59.58.149        router-g0-push.leancloud.cn

此外,还需要加上 {{appid 前八位}}.api.lncld.netapi.leancloud.cn 这两项记录。

这两项记录的 IP 值通过在命令行 dig avoscloud.com 获取(在 ANSWER SECTION 部分查看结果),
dig 命令可能返回多个 IP,任选其一即可。

如果需要访问云函数,还需加上 {{appid 前八位}}.engine.lncld.net 这条记录,IP 值同样通过 dig avoscloud.com 获取。

注意,如果需要在本地调试服务端应用,那么本地机器的 hosts 文件同样需要修改(不同操作系统的 hosts 文件路径不同,请自行搜索相关方法)。

REST API

注意:

  1. 在云引擎内访问 REST API,同样走的是内网,不受影响,无需修改代码。
  2. 服务端访问 REST API 的话,请优先尝试上面提到的修改 /etc/hosts 的方法,不用修改代码。

客户端访问 REST API,需要在代码中将 api.leancloud.cn{{appid 前八位}}.api.lncld.net 域名替换为 avoscloud.com

客户端通过 REST API 访问云函数,需要将 {{appid 前八位}}.engine.lncld.net 替换为 avoscloud.com

SDK

注意:

  1. 云引擎 SDK 不受影响,无需修改代码。
  2. 服务端 SDK,请优先尝试上面提到的修改 /etc/hosts 的方法,不用修改代码。

客户端 SDK 需要进行如下修改:(注意,只有较新版本的 SDK 才支持设定 API 服务器地址)

JavaScript SDK

存储 SDK(3.0.0 以上支持,建议升级到 3.11.1 以上,详情见下)

AV.init({
  // appId, appKey,
  serverURLs: 'https://avoscloud.com',
});

>= 3.5.5, < 3.11.1 的应用可能会碰到仍然使用缓存默认配置的 bug,
更新后应用打开的第一次请求可能失败。

>= 3.0.0, < 3.5.5 的应用 不能按上述方法设置,需要使用如下的写法:

AV.init({
  // appId, appKey,
  serverURLs: {
    push: 'https://avoscloud.com',
    stats: 'https://avoscloud.com',
    engine: 'https://avoscloud.com',
    api: 'https://avoscloud.com',
  },
});

如果你使用了 LiveQuery 功能,还需要在初始化的时候额外指定 LiveQuery 模块的域名配置(需要版本 >= 3.5.0):

AV.init({
  // appId, appKey,
  // serverURLs,
  realtime: new AV._sharedConfig.liveQueryRealtime({
    appId,
    appKey,
    server: 'example.com',
  }),
});

即时通讯 SDK(4.0.0 以上支持)

new Realtime({
  // appId, appKey,
  server: {
    api: 'avoscloud.com',
    RTMRouter: 'router-g0-push.avoscloud.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://game-router-cn-n1.avoscloud.com/v1',
});
微信小程序

微信小程序白名单增加:

存储:
request:https://avoscloud.com

即时通讯:
request:https://router-g0-push.avoscloud.com/
Socket:
wss://cn-n1-cell1.avoscloud.com,
wss://cn-n1-cell2.avoscloud.com,
wss://cn-n1-cell5.avoscloud.com,
wss://cn-n1-cell7.avoscloud.com

多人在线对战:
Request:https://game-router-cn-n1.avoscloud.com/
Socket:
wss://cn-n1-wechat-mesos-cell-1.avoscloud.com
wss://cn-n1-wechat-mesos-cell-2.avoscloud.com
wss://cn-n1-wechat-mesos-cell-3.avoscloud.com
wss://cn-n1-wechat-mesos-cell-4.avoscloud.com

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://router-g0-push.avoscloud.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://avoscloud.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK(16.1.0 以上)

let configuration = LCApplication.Configuration(
    customizedServers: [
        .api("https://avoscloud.com"),
        .engine("https://avoscloud.com"),
        .push("https://avoscloud.com"),
        .rtm("https://router-g0-push.avoscloud.com")
    ]
)
try LCApplication.default.set(
    id: "APP_ID",
    key: "APP_KEY",
    configuration: configuration
)

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://avoscloud.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://avoscloud.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://avoscloud.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://router-g0-push.avoscloud.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://avoscloud.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://avoscloud.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://avoscloud.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://router-g0-push.avoscloud.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.NET SDK

AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://avoscloud.com"),
                EngineServer = new Uri("https://avoscloud.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://router-g0-push.avoscloud.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://game-router-cn-n1.avoscloud.com/v1");
await client.Connect();

PHP SDK 和 Python SDK

这两个属于服务端 SDK,请使用上面「服务端应用」一节提到的修改 /etc/hosts 的方法,不用修改代码。

华东节点

华东节点的大部分服务不受此次事件的影响。

云引擎命令行工具

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://tab.avoscloud.com
export LEANCLOUD_API_SERVER=https://avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://tab.avoscloud.com
set LEANCLOUD_API_SERVER=https://avoscloud.com

2) 使用 lean login 重新登录

JavaScript

即时通讯 SDK

const appId = 'YOUR_APP_ID';
new Realtime({
  // appId, appKey,
  server: {
    api: 'APPID 前八位.api.lncldapi.com',
    RTMRouter: 'APPID 前八位.rtm.lncldapi.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://{{APPID 前八位}}.play.lncldapi.com/1/multiplayer/router',
});

如果在小程序中使用,还需要将 APPID 前八位.api.lncldapi.comAPPID 前八位.rtm.lncldapi.comAPPID 前八位.play.lncldapi.com 添加到域名白名单列表中。

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.api.lncldapi.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.push.lncldapi.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.engine.lncldapi.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.rtm.lncldapi.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.stats.lncldapi.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK 升级到最新版即可。

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://{{APPID 前八位}}.api.lncldapi.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://{{APPID 前八位}}.engine.lncldapi.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://{{APPID 前八位}}.push.lncldapi.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://{{APPID 前八位}}.rtm.lncldapi.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://{{APPID 前八位}}.api.lncldapi.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://{{APPID 前八位}}.engine.lncldapi.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://{{APPID 前八位}}.push.lncldapi.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://{{APPID 前八位}}.rtm.lncldapi.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.NET SDK

// 配置存储和云引擎
AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://{{APPID 前八位}}.api.lncldapi.com"),
                EngineServer = new Uri("https://{{APPID 前八位}}.engine.lncldapi.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://{{APPID 前八位}}.rtm.lncldapi.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://{{APPID 前八位}}.play.lncldapi.com/1/multiplayer/router");
await client.Connect();

美国节点

美国节点的大部分服务不受此次事件的影响。

云引擎命令行工具

0) 升级命令行工具到最新版 0.20.1

1) 根据具体的环境,执行下列命令:

Shell 环境

export LEANCLOUD_DASHBOARD=https://us.avoscloud.com
export LEANCLOUD_API_SERVER=https://us.avoscloud.com

Windows 环境

set LEANCLOUD_DASHBOARD=https://us.avoscloud.com
set LEANCLOUD_API_SERVER=https://us.avoscloud.com

2) 使用 lean login 重新登录

在 Shell 中执行 export LEANCLOUD_DASHBOARD=; export LEANCLOUD_API_SERVER= 后再运行命令行工具(需要用 lean login 重新登录)

JavaScript

即时通讯 SDK

const appId = 'YOUR_APP_ID';
new Realtime({
  // appId, appKey,
  server: {
    api: 'APPID 前八位.api.lncldglobal.com',
    RTMRouter: 'APPID 前八位.rtm.lncldglobal.com',
  },
};

多人在线对战 SDK

new Client({
      appId: '',
      appKey: '',
      userId: 'tar1',
      playServer: 'https://{{APPID 前八位}}.play.lncldglobal.com/1/multiplayer/router',
});

如果在小程序中使用,还需要将 APPID 前八位.api.lncldglobal.comAPPID 前八位.rtm.lncldglobal.comAPPID 前八位.play.lncldglobal.com 添加到域名白名单列表中。

iOS SDK

Objective-C SDK

// 配置 SDK 储存
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.api.lncldglobal.com" forServiceModule:AVServiceModuleAPI];
// 配置 SDK 推送
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.push.lncldglobal.com" forServiceModule:AVServiceModulePush];
// 配置 SDK 云引擎
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.engine.lncldglobal.com" forServiceModule:AVServiceModuleEngine];
// 配置 SDK 即时通讯
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.rtm.lncldglobal.com" forServiceModule:AVServiceModuleRTM];
// 配置 SDK 统计
[AVOSCloud setServerURLString:@"https://{{APPID 前八位}}.stats.lncldglobal.com" forServiceModule:AVServiceModuleStatistics];
// 初始化
[AVOSCloud setApplicationId:APP_ID clientKey:APP_KEY];

Swift SDK 升级到最新版即可。

Android SDK

// 配置 SDK 储存
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, "https://{{APPID 前八位}}.api.lncldglobal.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.ENGINE, "https://{{APPID 前八位}}.engine.lncldglobal.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.PUSH, "https://{{APPID 前八位}}.push.lncldglobal.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, "https://{{APPID 前八位}}.rtm.lncldglobal.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

Java Unified SDK

import cn.leancloud.core.AVOSService;

// 配置 SDK 储存
AVOSCloud.setServer(AVOSService.API, "https://{{APPID 前八位}}.api.lncldglobal.com");
// 配置 SDK 云引擎
AVOSCloud.setServer(AVOSService.ENGINE, "https://{{APPID 前八位}}.engine.lncldglobal.com");
// 配置 SDK 推送
AVOSCloud.setServer(AVOSService.PUSH, "https://{{APPID 前八位}}.push.lncldglobal.com");
// 配置 SDK 即时通讯
AVOSCloud.setServer(AVOSService.RTM, "https://{{APPID 前八位}}.rtm.lncldglobal.com");
// 初始化
AVOSCloud.initialize(this,APP_ID,APP_KEY);

.Net 即时通讯 SDK

// 配置存储和云引擎
AVClient.Initialize(new AVClient.Configuration {
                ApplicationId = appId,
                ApplicationKey = appKey,
                ApiServer = new Uri("https://{{APPID 前八位}}.api.lncldglobal.com"),
                EngineServer = new Uri("https://{{APPID 前八位}}.engine.lncldglobal.com")
            });
// 通过 RTM Router 配置即时通讯
var realtime = new AVRealtime(new AVRealtime.Configuration
           {
                ApplicationId = "app-id",
                ApplicationKey = "app-key",
                RTMRouter = new Uri("https://{{APPID 前八位}}.rtm.lncldglobal.com")
           });

多人在线对战,v0.5.0-alpha.0 及之后的版本

var client = new Client(appId, appKey, userId, playServer: "https://{{APPID 前八位}}.play.lncldglobal.com/1/multiplayer/router");
await client.Connect();

域名无法访问的临时解决方案》有63个想法

  1. Pingback引用通告: 关于 LeanCloud 国内域名解析问题的情况更新 | LeanCloud Blog

  2. 头像凤飞飞飞

    我在想能不能在控制台做一个更改域名的设置入口,无需修改客户端的小程序,不然太麻烦了,还得等腾讯审核,用户都抱怨的不停,用户流失严重。

    回复
    1. 头像weakish

      抱歉,因为域名处于 ClientHold 状态,许多地区小程序客户端访问相关域名时会遇到错误,这个不是我们能够控制的。需要在客户端切换。

      回复
  3. 头像zhao

    我们有个 app 用的老版本的 sdk,提示 setServer 方法不存在, 方法名是不是其他的?

    AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.API, “https://avoscloud.com”);
    // 配置即时消息服务
    AVOSCloud.setServer(AVOSCloud.SERVER_TYPE.RTM, “https://router-g0-push.avoscloud.com”);

    回复
    1. 头像weakish

      av-min.js 可以用 jsdelivr CDN 的,其实很久以前文档已经推荐使用 jsdelivr 了,详见:https://avoscloud.com/docs/sdk_setup-js.html#hash-99064366

      回复
      1. 头像david

        能提供新的能用的华北节点的云存储的 cdn 么,以前的用不了啊,cdn.jsdelivr.net/npm/leancloud-storage@3/dist/av-min.js

        回复
        1. 头像weakish

          3.0.0 应该是可用的,但是设置 serverURLs 的写法不一样。建议考虑升级 SDK 版本,或者参考文章中的写法(刚刚更新过文章里的写法)。

          回复
  4. 头像wells

    小程序 是不是 要添加 socket

    wss://cn-n1-cell2.avoscloud.com 不在以下 socket 合法域名列表中,请参考文档:

    回复
  5. 头像邱建辉

    JavaScript SDK
    new Realtime({
    // appId, appKey,
    server: {
    api: ‘avoscloud.com’,
    RTMRouter: ‘router-g0-push.avoscloud.com’,
    },
    };
    没有用呀,访问的使用还是 leanclou.cn

    回复
  6. 头像

    我登录不了控制台,因为我平时登录都是 QQ 登录,但是 现在用不了了. 我不知道我账号是多少,所以找回密码都不得行。

    回复
    1. lazyseqlazyseq

      确实任何域名都无法保证不被封掉,特别是有多个应用共享的域名。所以我们建议用户绑定自己的域名,这样是最保险的。请看我们发的最新的帖子。

      回复
  7. Pingback引用通告: 关于 LeanCloud 国内域名解析问题的情况更新(6 月 21 日)| LeanCloud Blog

      1. 头像

        是否还要更改这里
        AV.init({
        // appId, appKey,
        serverURLs: ‘https://avoscloud.com’,
        });
        我按照上面的两个版本的改了都不行,是不是还要升级到最新的 SDK

        回复
  8. 头像JianPeng Xiao

    我们现在在华北节点提供了自助绑定 API 自定义域名,自定义域名可用于访问数据存储、云函数、短信、推送等服务(实时通讯目前仍会返回 avoscloud.com 的 Web Socket 域名)。你可以在控制台的「存储 -> 设置 -> 自定义 API 服务域名」中提供一个已备案的域名(如需开启 HTTPS 还需提供对应的证书)来自助绑定。

    这里说的绑定自定义域名, 绑定后 我在应用中这样初始化 AV 对象,是这样用的吗?

    AV.init({
    // appId, appKey,
    serverURLs: '自定义域名',
    });

    今天下午 我们应用无法登陆

    回复
  9. 头像JianPeng Xiao

    我们现在在华北节点提供了自助绑定 API 自定义域名,自定义域名可用于访问数据存储、云函数、短信、推送等服务(实时通讯目前仍会返回 avoscloud.com 的 Web Socket 域名)。你可以在控制台的「存储 -> 设置 -> 自定义 API 服务域名」中提供一个已备案的域名(如需开启 HTTPS 还需提供对应的证书)来自助绑定。

    按这个设置后,我们在使用 SD 时需要这样初始化 AV 对象?

    AV.init({
    // appId, appKey,
    serverURLs: '自定义域名',
    });

    回复
    1. lazyseqlazyseq

      会一直保持兼容和可用。但是按照有关部门的规定,我们很快会要求国内节点的应用在一定时间内绑定自己的域名。保持 avoscloud.com 可用只是为了保证老版本的兼容性。

      回复
  10. 头像

    [AVOSCloud setServerURLString:@”https://avoscloud.com” forServiceModule:AVServiceModuleAPI];
    加上这段代码后,如果原域名恢复使用会有影响吗

    回复
    1. lazyseqlazyseq

      在原域名恢复后,avoscloud.com 也会一直保持兼容和可用。但是按照有关部门的规定,我们很快会要求国内节点的应用在一定时间内绑定自己的域名。保持 avoscloud.com 可用只是为了保证老版本的兼容性。

      回复
  11. 头像远离LeanCloud

    原本简单咨询一下恢复方面的问题,甚至没有催,结果 LeanCloud 单方面直接封号。

    这种不负责任的行为让我非常震惊,再也不用 LeanCloud 的服务了,不爱惜用户的平台早日远离吧。

    回复
  12. 头像李俊

    我用了 Python 作为本地脚本,相当于作为客户端在使用。有没有办法可以通过修改继续使用?

    回复
    1. 头像weakish

      如果仅仅只是您一个人或者小团队内部使用的话,可以参考服务端应用的做法改本地机器的 hosts 文件。

      回复
  13. Pingback引用通告: 关于 LeanCloud 国内域名问题的更新(6 月 24 日)| LeanCloud Blog

发表评论

电子邮件地址不会被公开。 必填项已用*标注