在树莓派上设置 ASP.NET Core CMS 运行站点
如何在 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 的方法
安装 Apache
然后我安装了 Apache。理论上,您可以使用 ASP.NET Core 内置的 Kestrel 服务器,但如果您想在树莓派上运行多个站点,并且希望其中一些站点只是静态的,那么设置一个带有 Apache 的反向代理是更好的选择。
在安装任何东西之前,运行
sudo apt-get update
如果您不懂 Linux,这会更新安装程序工具 apt-get
的所有引用。当您在命令前加上 sudo
时,Linux 会以管理员身份运行它。
可以在下面的链接中找到安装 Apache 的指南
您还需要设置 proxy
和 proxy_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.Combine
或 Path.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。