65.9K
CodeProject 正在变化。 阅读更多。
Home

在树莓派上设置 ASP.NET Core CMS 运行站点

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2018年5月15日

CPOL

9分钟阅读

viewsIcon

17885

如何在 Windows 上使用 CMS (Lynicon CMS) 构建 ASP.NET Core 站点,然后在树莓派上托管它

引言

我想在便宜的商业宽带和静态 IP 上测试一个带有 CMS 的网站在 .NET Core 的树莓派上的运行速度。这将使我能够免费托管我自己的 Web 项目,而不是使用商业托管。

我使用的东西

我来自英国,所以以下是英国的供应商和费用。我使用了树莓派 3(https://uk.rs-online.com/web/p/processor-microcontroller-development-kits/8968660/?src=raspberrypi),目前价格为 35 英镑。我在这上面安装了一个三星 EVO Plus Micro SDXC 64GB,最高速度 100MB/s,内存卡(含 SD 适配器)MB-MC64GA/AMZ(17.95 英镑)。我通过 PlusNet 的无限商业宽带设置了它,它提供了一个静态 IP。

软件方面,我在 Windows 10 和 Visual Studio 2017 Community 上使用 .NET Core 2.0。我使用了一个我参与构建的 CMS,Lynicon CMS for .Net Core。另一个关键软件是 Windows Subsystem for Linux。在树莓派上,我使用 Raspbian Pi Desktop 作为操作系统,并安装了 Apache Web 服务器。

设置树莓派

第一项工作是将树莓派与 Raspbian Linux 在 micro SD 卡上运行起来。据我所知,并非所有 SD 卡都能与树莓派一起使用,因此如果您不使用我推荐的那一款,我建议您查看 https://elinux.org/RPi_SD_cards 来查找别人已经测试过的一款。我需要一个带 SD 适配器的,这样我就可以在我的 Surface Laptop 上使用它了。

这篇文章告诉您如何格式化 SD 卡。我想要一个尺寸合适的,并且需要重新格式化才能正常工作。

我运行了其中提到的 SD 格式化工具,然后是 guiformat.exe

然后我下载了 Raspbian,如

中所述,并使用 Etcher(文章中有详细说明)将其刷入 SD 卡。

然后我按照这里的说明进行操作(第 1 部分的步骤 1 到 6 已涵盖)。这里介绍了如何设置树莓派并安装 .NET Core 2。

要创建它在第 1 部分步骤 7 中提到的“ssh”文件,请弹出新刷入的 SD 卡并重新插入。

从笔记本电脑上操作树莓派

在尝试从 PC 通过家庭网络连接到树莓派之前,我强烈建议您设置 Windows Subsystem for Linux,如下文所述

我使用的是 Ubuntu 发行版,因为我已经安装过了,但我认为 Debian 可能更适合树莓派的工作,因为 Raspbian 与 Debian 非常接近,两边的操作会更相似。

如果您不在 Windows 10 上,您就没有这个选择。在这种情况下,我建议使用 Putty

并使用 pscp 传输文件 - 安装说明

要连接到您的树莓派,请打开您的 Debian 终端并输入

ssh pi@192.168.1.1

将 IP 地址更改为您树莓派的 IP 地址。然后系统会提示您输入您之前设置的“pi”用户的密码。之后,您将在树莓派上获得一个远程命令提示符。

如果您不懂 Linux,它与 Windows 中的 cmd shell 非常相似,网上有很多信息。

获取树莓派的固定内部 IP

如果您重新启动树莓派,您内部网络上的 DHCP 服务会动态分配一个 IP 地址。您不希望这样,因为您希望能够可靠地连接到同一个内部 IP,而且它也可能破坏您的端口转发设置。您可以在此处找到如何配置树莓派以拥有固定内部 IP 的方法

https://raspberrypi.stackexchange.com/questions/37920/how-do-i-set-up-networking-wifi-static-ip-address/74428#74428

安装 Apache

然后我安装了 Apache。理论上,您可以使用 ASP.NET Core 内置的 Kestrel 服务器,但如果您想在树莓派上运行多个站点,并且希望其中一些站点只是静态的,那么设置一个带有 Apache 的反向代理是更好的选择。

在安装任何东西之前,运行

sudo apt-get update

如果您不懂 Linux,这会更新安装程序工具 apt-get 的所有引用。当您在命令前加上 sudo 时,Linux 会以管理员身份运行它。

可以在下面的链接中找到安装 Apache 的指南

您还需要设置 proxyproxy_http 模块。这些模块是反向代理到 Kestrel 所必需的。

cd /etc/apache2/mods-enabled
sudo ln ../mods-available/proxy.load
sudo ln ../mods-available/proxy_http.load
sudo mv proxy_http.load z_proxy_http.load

Apache 会按字母顺序加载 mods-available 目录中找到的模块,并且您需要先加载 proxy 模块,然后再加载 proxy_http 模块,因此最后一个命令至关重要。

ASP.NET Core 站点

虽然您可以按照此处所述的方式安装任何 ASP.NET Core 站点,但我想更进一步,运行一个带有 CMS 的站点,部分原因是它涉及到我为 .NET Core 构建的一个 CMS。Lynicon CMS 可作为开源 Nuget 包获得,在安装了基本的包(在此处)后,您可以继续安装另一个包,Lynicon.Extra nuget 包,该包允许您在不使用数据库的情况下运行,如此处所述。

安装此模块后,CMS 将内容数据保存在内存中,并将其备份到文件中,这对于小型网站来说速度非常快,并且意味着您不必尝试在树莓派上运行数据库!

如果您想使用已经用 CMS 设置好的演示站点,您可以在 CMS 的 Github 仓库中找到一个此处

在树莓派上设置站点

为了支持 Apache 的反向代理场景,还需要添加一些额外的代码,这在这篇文章的“配置代理服务器”部分中有介绍,稍后我们会回到这里完成反向代理的设置。

现在我们需要在 Windows 的命令行中发布我们的站点。在 Windows 搜索框中输入 cmd,然后右键单击选择“以管理员身份运行”。

dotnet publish -r linux-arm -o <path to publish folder>

这会编译成可以在树莓派上运行的原生二进制文件(它们无法在 Windows 上运行)。

现在打开您的 Windows Subsystem for Linux (WSL) 发行版终端并执行以下操作

cd /mnt/c/<path to parent of publish folder>
tar -zcvf published.tar.gz <publish folder name>
scp published.tar.gz pi@192.168.1.1:/var/www/<site folder>

记住将 IP 地址更改为您的树莓派的地址。第一行,您可以通过路径 /mnt/c 从 Linux 访问 Windows 的 C 盘根目录。然后添加剩余的路径以进入发布文件夹的父文件夹(记住使用正斜杠作为 Linux 的分隔符)。

scp 命令会将压缩的站点文件复制到树莓派,系统会询问您树莓派的密码。

您可能会发现没有权限复制到那里,在这种情况下

ssh pi@<pi's ip address>
<enter the password for pi>
(now on pi)
cd /var/www
sudo chmod 777 <site folder>
exit

然后执行以下操作来解压并设置站点文件

ssh pi@<pi's ip address>
<enter the password for pi>
(now on pi)
cd /var/www/<site folder>
tar -xzvf published.tar.gz
mv -v <publish folder name>/* .
rm published.tar.gz
rmdir <publish folder name>
./<project name>

最后一个命令应该能在 Kestrel 下运行站点,并且应该会成功。由于窗口现在运行 Kestrel,命令提示符不会返回。按 CTRL-C 停止 Kestrel。

设置反向代理

现在请按照此处的说明通过 Apache 反向代理 Kestrel。您需要“配置 Apache 进行反向代理”和“监控应用程序”下的说明。

由于我们使用的是 Raspbian/Debian,因此以下区别适用

Apache 的配置设置目录

/etc/apache2/sites-available

测试配置

apachectl configtest

重启 Apache

sudo /etc/init.d/apache2 restart

创建服务定义文件,如所述。请注意 WorkingDirectory 将是

/var/www/<site folder>

ExecStart 的第二个参数将是

/var/www/<site folder>/<site executable file>

站点可执行文件的名称将是站点的名称,没有扩展名。

创建文件后,创建 apache 用户

sudo adduser apache

此时,您应该可以通过在 Windows 机器上的 Hosts 文件(C:\Windows\System32\drivers\etc\hosts)中设置一个条目来在本地看到站点,该条目是树莓派的 IP 地址,后跟一个制表符,再后跟您在上面 .conf 文件中设置的域名,位于标有 ServerName 的行上。

这会在本地覆盖 DNS,以便该域名将连接到树莓派的 IP 地址。如果您现在在浏览器中输入该域名,应该会显示您的站点。如果不起作用,Apache 会将错误记录到 /var/log/apache2/<ErrorLog 在 .conf 文件下的条目>。在您的站点根目录中,如果您使用的是 Lynicon CMS,应该会有一个 lynicon.log 文件,或者您在代码中设置的任何日志文件位置。

注意事项

如果您之前没有太多 Linux Web 工作经验,需要注意的一点是,在 Linux 中所有 URL 都区分大小写。这适用于静态提供的文件(如图像)和 MVC 路由。

另一个问题是,为了使文件路径能够跨平台工作,您不能使用字面上的反斜杠字符,必须使用 Path.CombinePath.DirectorySeparatorChar 来组合在 Windows 和 Linux 上都能工作的文件系统路径。

最后一个问题是,在这种设置中,当您的站点出现代码错误时,您可能会看到 404 错误。检查权限是否造成了问题。

让世界看到您的站点

现在剩下的是在您的路由器上设置端口转发,从端口 80 (http) 和端口 443 (https) 到您的树莓派。具体操作取决于您的路由器,但过程大致如下:

  • 在您的 Windows 机器上打开一个 cmd 窗口
  • 运行 'ipconfig /all'
  • 找到输出中标题为 Wireless LAN Adaptor WiFi 或类似名称的部分(假设您没有通过以太网连接到路由器)
  • 找到该部分标记为 Default Gateway 的 IP 地址
  • 在浏览器的 URL 栏中输入该 IP 地址
  • 您应该会看到您路由器的管理页面
  • 使用您拥有的凭据登录
  • 找到端口转发
  • 添加一个从树莓派的 IP 地址(或 MAC 地址)到路由器端口的端口转发
  • 您可以通过使用我们之前使用的 SSH 命令登录到树莓派并输入以下命令来找到它
    ifconfig

IP 地址和 MAC 地址列在“eth0”下。

更新您的站点

当您想要更新您的站点时,请按照上面的说明再次发布您的站点,将其压缩并传输到树莓派。您将需要执行

systemctl stop <name of service>.service

其中 service 是您在上面“设置反向代理”部分中创建的用于维护 Kestrel 运行的服务。这会停止 Kestrel,让您可以测试新站点,而不会因为它试图启动的 URL 已经被占用而报错。然后,您可以使用以下命令重新启动服务,让 Kestrel 运行新版本的站点:

systemctl start <name of service>.service

结果

这是 Lynicon CMS 的主站点,现在运行在树莓派上的 .NET Core 上:http://www.lynicon.com

© . All rights reserved.