在阿里云服务器运行Dart Server的踩坑实录

前言

笔者从2019年9月开始接触Flutter,用Flutter来做Capstone的项目,彼时使用了内置数据存储markdown格式文档,再通过markdown插件展示的纯前台应用,现在将其作为毕业设计的一部分进行改造,首先要解决的是后端使用什么语言的问题,我的备选方案有Python、Golang和Dart。本次就来尝试Dart Server吧。

先说结论,目前不推荐把使用大量插件的WebApp部署在阿里云上,除非你的服务器位于境外且性能不错,使用自带库的简单服务端应用还是可以的。

准备

阿里云轻量应用服务器,推荐使用Ubuntu和Debian,因为官方的下载只提供了这两种,但是我用的是Wordpress应用镜像,是CentOS系统,不过官方提供教程的两个一样也需要从谷歌的服务器下载sdk,还是推荐通过本地下载好再传输到服务器。

Dart SDK下载与配置环境变量

首先下载DartSDK,下载地址

使用命令scp -r dartsdk-linux-x64-release.zip user@yourhost:/tmp将你下载到本地的SDK上传到服务器的tmp路径,如果你和我一样在操作前重置过服务器,报错Host key verification failed.,删除know_host文件即可。

shh到服务器,解压SDK到lib目录。

cd /tmp
mv dartsdk-linux-x64-release.zip /usr/lib
cd /usr/lib
unzip dartsdk-linux-x64-release.zip 

复制路径,配置环境变量,测试一下没有问题。

添加到.bashrc方便以后使用。

创建第一个项目

创建我们的第一个http服务端项目。官方代码如下,需要注意的是阿里云服务端用户需要将InternetAddress.loopbackIPv4更改为你的服务器的内网地址,否则你将无法从外网访问你的http应用。在服务器控制台的ip地址可以看到它。

import 'dart:io';

Future main() async {
  // #docregion bind
  var server = await HttpServer.bind(
    InternetAddress.loopbackIPv4,//=>172.000.000.000 内网地址
    4040,
  );
  // #enddocregion bind
  print('Listening on localhost:${server.port}');

  // #docregion listen
  await for (HttpRequest request in server) {
    request.response.write('Hello, world!');
    await request.response.close();
  }
  // #enddocregion listen
}

直接运行即可,在客户端输入外网地址:端口号即可访问。

创建一个web app

通过下面代码安装webdev和stagehand

 pub global activate webdev
 pub global activate stagehand

这里会要求你为.pub-cache配置环境变量,用给出的临时更改环境变量的命令即可。

export PATH="$PATH":"$HOME/.pub-cache/bin"

通过以下代码创建官方示例。

 mkdir quickstart
 cd quickstart
 stagehand web-simple
 pub get

运行,指定hostname到内网地址,将0.0.0.0更改为你的服务器内网地址。

webdev serve --hostname 0.0.0.0

以上代码运行均需要一定时间,完成,去浏览器看看效果吧。

后记

前言中说到的不推荐在阿里云上部署Dart WebApp的原因如下图。创建和pub get实在是太消耗性能了。S