如何构建 Raspberry Pi 服务器进行开发
已发表: 2022-03-11Raspberry Pi 是一台小型计算机,您只需 5 美元即可获得,您可以在其上运行许多不同类型的软件并构建许多不同的项目。
在本文中,我将指导您完成将其设置为家庭开发服务器并部署可以从网络外部访问的全栈 JavaScript 应用程序的过程。 这非常适合设置您自己的远程数字工作空间,或者只是控制您用于开发的硬件。
这个 Raspberry Pi 家庭服务器需要什么?
虽然这现在特别是 Raspberry Pi 3 教程,但它仍应适用于可追溯到第一代的模型——如果您有较旧的模型或 Raspberry Pi Zero,请在下面的评论中告诉我们您的经验。
除了 Raspberry Pi 板本身之外,您还需要:
- 一个微型 USB 充电器
- 以太网电缆
- microSD 卡(最低 8GB,最高 32GB 的卡似乎可以正常工作)
这些也将在初始设置期间派上用场:
- USB 键盘
- HDMI 电缆和显示器
树莓派操作系统:Raspbian
在 Raspberry Pi 上安装操作系统很简单。 首先,使用您的计算机,将启动映像安装到 microSD 卡上。 然后只需将卡插入 Raspberry Pi 并从那里启动。
Raspbian 是从 Debian 7.0 ( Wheezy ) 移植而来的 Linux 发行版,是针对设备架构优化的 Raspberry Pi 官方操作系统。 虽然还有其他选项可以在 Pi 上运行您最喜欢的操作系统,但我们将使用 Raspbian,因为它很简单。
本教程已更新为使用此版本(或更高版本)的 Raspbian:
Kernel version : #1 SMP Debian 4.9.110-3+deb9u4 (2018-08-21) Kernel release : 4.9.0-8-amd64
要安装 Raspbian,请前往官方下载页面并下载最新 Raspbian 版本的 zip 文件。
然后,将 microSD 卡插入计算机的 SD 卡插槽或适配器。 根据您计算机的操作系统,按照 Raspberry 网站上针对 Linux、Mac OS 或 Windows 提供的说明进行操作。
该过程完成后,从计算机中弹出 SD 卡并将其插入 Raspberry Pi。 使用以太网电缆将 Raspberry Pi 连接到路由器,然后插入 Micro USB 充电器,这将启动 Raspberry Pi 启动。
对于初始配置,有两个选项:
- 如果您有 USB 键盘和 HDMI 显示器,您可以将它们插入 Raspberry Pi 进行初始设置。
- 您的 Pi 应该会在插入这些设备后立即识别它们。
- Pi 第一次启动时,它会自动运行
raspi-config
。 首次启动后,您需要自己运行sudo raspi-config
以配置设备。
- 如果您没有它们,您可以在使用 SSH 时连接到您的 Raspberry Pi:
- 首先,您需要在本地网络中找到 Raspberry Pi 的 IP 地址。 这可以通过连接到路由器的管理页面或使用类似
nmap
的网络工具来完成。 - 获得设备的 IP 地址后,从终端使用 SSH 连接到它(如果您使用的是 Windows,则通过 Putty)。 默认用户是
pi
,默认密码是raspberry
。 因此,例如,如果 IP 地址是 192.168.1.16,则运行ssh [email protected]
并在出现提示时输入密码。 - 连接后,运行
sudo raspi-config
。
- 首先,您需要在本地网络中找到 Raspberry Pi 的 IP 地址。 这可以通过连接到路由器的管理页面或使用类似
raspi-config
将引导您完成最终设置。 您可以配置所有选项,但最重要的是前两个:扩展文件系统,确保所有 SD 卡存储都可用于操作系统,并更改默认 Pi 用户的密码,以便您的服务器将防止入侵者。
在您的 Raspberry Pi 上安装 Web 服务器 (Nginx)
接下来,您将安装 Web 服务器。 我更喜欢 Nginx,因为它占用的内存很小,而且它与 Node.js(稍后将设置)配合得很好。 其他 Web 服务器,例如 Apache 或 lighttpd,也可以正常工作,但我们将使用 Nginx 进行此演示。
在开始安装任何东西之前,您需要通过在 Pi 上运行以下命令来确保一切都是最新的:
sudo apt-get update sudo apt-get upgrade
然后你可以使用apt-get
安装 Nginx:
sudo apt-get install nginx
安装完成后,运行以下命令启动服务器:
sudo service nginx start
如果您不必在上一步中确定 Raspberry Pi 的本地 IP,则可以通过运行ifconfig
来找出答案。 以太网适配器的输出将位于eth0
下,其本地 IP 地址标记为inet addr
。
知道 IP 地址后,您可以将计算机的浏览器指向它,您应该会看到默认的“欢迎使用 Nginx”消息。
向网络开放:端口转发
如果您不打算从本地网络外部访问您的 Raspberry Pi,则可以跳过此步骤。 但是对于那些想要从其他位置访问他们的服务器的人来说,让我们确保这是可能的。
在典型的家庭网络中,连接到路由器的设备对外界是不可见的。 使用您网络的外部IP 地址,只能从外部访问您的路由器。 您的路由器负责确定允许哪些传入流量进入网络,以及应该将其发送到哪个设备。
当本地网络上的设备启动连接时(例如,当您在浏览器上打开网站时),路由器会将传入的响应流量识别为该连接的一部分,并允许它通过。 但是,如果路由器接收到不属于打开连接的传入流量(例如,当外部设备尝试启动与内部设备的连接时),它将阻止传入流量进入网络。 这是保护网络的重要安全功能!
那么如何从外部连接到您的 Pi 呢? 答案是端口转发。 路由器必须配置为允许特定端口上的传入连接通过,并将其发送到正确的设备。 默认情况下,HTTP 协议使用端口 80,而 SSH 使用端口 22,因此您需要在路由器上打开这两个端口才能访问您的 Web 应用程序,并允许安全连接来管理您的服务器。
配置路由器以打开和转发端口的步骤可能因您的互联网提供商和路由器品牌而异,但无论如何,您应该能够通过路由器管理页面的高级配置选项来完成它。 只需查找名称为“转发”、“端口转发”或“网络地址转换”的选项即可。
您需要为 HTTP 连接打开一个端口,并为 SSH 打开另一个端口。 基本思想包括将寻址到这两个外部端口的数据转发到您的 Raspberry Pi,Web 流量进入 Nginx 正在侦听的端口 80,SSH 流量进入端口 22,SSH 服务器接受来自外部计算机的连接。 以下是路由器配置页面中的示例:
192.168.1.16
,则端口转发配置。 所有发往端口 80 或 22 的传入流量都转发到此内部地址。 您只需在 Google 中输入“我的 IP 地址是什么”即可确定路由器的外部 IP 地址。 如果您随后移出路由器的网络,则可以通过使用ssh pi@{external IP address}
打开 SSH 连接来测试端口转发是否正常工作。 同样,可以通过在浏览器的地址栏中输入外部 IP 地址来测试 HTTP 端口转发。 请记住,端口转发允许来自外部的任何人在知道您路由器的外部 IP 的情况下访问这些端口上的设备。
如果您没有静态 IP,则可以设置动态 DNS。 这是一个非常简单和容易的步骤。 您可以从路由器设置动态 DNS,也可以为其配置 Raspberry Pi。 我不打算在这里介绍如何配置 DDNS,但如果需要,BitPi.co 有一个很好的教程。
安装框架:全栈 JavaScript
您可以在 Nginx 上运行大多数 Web 框架,但让我们看看如何使用 JavaScript 实现全栈。 为此,您需要安装 Node.js 和 MongoDB。
如今,Node.js 很容易安装到 Raspberry Pi 上:
sudo apt-get install nodejs
安装完成后,您可以通过运行node -v
检查它是否正常工作。
现在您只需键入以下内容即可安装 MongoDB:
sudo apt-get install mongodb
请注意,如果您需要关闭 Raspberry Pi,您需要先关闭服务以避免数据库损坏:
sudo service mongodb stop
部署您的应用程序
您可以在本地机器上进行开发,然后将您的更改推送到 BitBucket 上的 Git 存储库。 由于 Raspbian 预装了 Git,因此您可以将最新的应用程序代码拉到设备上并运行它。
脚手架项目
首先让我们设置一些应用程序代码并将其推送到 Git 存储库。 启动应用程序的方法有很多种,但我最喜欢的方法之一是 generator-angular-fullstack,它同时为服务器和客户端代码搭建脚手架。
在您的计算机上安装generator-angular-fullstack
:

npm install -g generator-angular-fullstack
为您的应用程序创建一个新目录:
mkdir my-app cd my-app
并脚手架应用程序:
yo angular-fullstack my-app
创建存储库并推送代码
现在在 BitBucket 中创建一个存储库,如此处所述。 然后设置本地目录:
git init git remote add origin [email protected]:USER/REPO.git
所以你可以提交并推送代码:
git add . git commit -m 'Initial commit' git push -u origin master
生成器带有 grunt-build-control 插件,它允许您将构建代码提交到存储库中的特定分支。 只需将 BitBucket 的配置添加到应用程序根目录中的Gruntfile.js
:
buildcontrol: { options: { dir: 'dist', commit: true, push: true, connectCommits: false, message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' }, bitbucket: { options: { remote: '[email protected]:USER/REPO.git', branch: 'build' } } }, // ...
现在运行:
grunt build
…创建分发文件夹,然后是:
grunt buildcontrol:bitbucket
…提交代码并将其推送到存储库中的构建分支。
生成 SSH 密钥
您现在已经托管了您的代码。 在将其部署到您的 Raspberry Pi 之前,您需要为 Raspberry Pi 生成一个 SSH 密钥并将其添加到您的 BitBucket 帐户。 我们将快速完成此步骤,但如果您有任何问题,请按照 BitBucket 指南进行操作。 因此,重新登录到您的 Raspberry Pi 终端,并生成公钥/私钥对:
ssh-keygen
然后,启动代理:
ssh-agent /bin/bash
并将密钥添加到代理:
ssh-add /home/pi/.ssh/id_rsa
现在你只需要输出公钥的内容:
cat /home/pi/.ssh/id_rsa.pub
…因此您可以将其复制并粘贴到 BitBucket 中。
在 BitBucket 中,单击您的个人资料图片并转到Manage account 。 在SECURITY下,找到SSH 密钥,然后单击按钮Add key 。
克隆存储库
应用程序代码的放置位置没有约定,但您可以创建/var/www
目录并将所有项目放在那里。
cd /var sudo mkdir www
当你想在 webroot 中放置文件时,为了避免使用sudo
,你可以将所有者更改为你的 Pi 用户,并将组更改为www-data
,这是 Nginx 使用的:
sudo chown -R pi:www-data www cd www
现在,您可以克隆存储库的构建分支并安装依赖项:
git clone [email protected]:USER/REPO.git --branch build --single-branch cd REPO npm install --production
完成后,您可以启动您的应用程序,将环境设置为生产环境:
export NODE_ENV=production; node server/app.js &
现在,将您的计算机浏览器指向设备 IP 地址以检查它是否有效。
配置 Nginx 反向代理
还有一个步骤可以让您的应用程序可以从外部访问。 尽管 Nginx 正在侦听端口 80,它将接收对您的 Pi 的 HTTP 请求,但 Node 应用程序本身正在侦听不同的端口(例如,端口 8080)。 因此,您需要将 Nginx 配置为充当反向代理,识别针对您的应用程序的请求,并将它们传递给 Node.js。
Nginx 将其服务的每个应用程序的配置文件保存在sites-available
文件夹中:
cd /etc/nginx/sites-available/
在这里,您可以复制default
配置文件并在方便时进行编辑:
sudo cp default my-app sudo nano my-app
最终的配置文件应如下所示,Nginx 充当 Node.js 服务器的代理:
server { listen 80; root /var/www/my-app/; # identifies the location of the application you are configuring server_name my-app.dev; # identifies the hostname used by this application's traffic location / { proxy_pass http://localhost:8080/; # configures the back-end destination for this traffic } }
为了启用此配置,您需要在sites-enabled
文件夹中创建一个符号链接,Nginx 在运行时查找活动配置:
sudo ln -s /etc/nginx/sites-available/my-app /etc/nginx/sites-enabled/my-app
并重新加载服务以激活这些更改:
sudo service nginx reload
此时,您的应用程序已准备好接收用于my-app.dev
域的 HTTP 流量(感谢您在上面配置的server_name my-app.dev
指令)。 您需要解决的最后一个问题是如何使您从外部发送的流量与此域名匹配。 尽管您可以购买一个域名并将其指向您的 IP,但hosts
文件会起到拯救作用,并使其变得不必要。
在您将访问该站点的工作站上,只需添加路由器的外部 IP 地址,并将其与主机名my-app.dev
。 然后,您为my-app.dev
生成的任何 HTTP 流量都将直接发送到您的路由器,并在Host
HTTP 标头中使用正确的主机名。
在 Windows 上,具有管理员权限,您可以使用记事本编辑位于c:\windows\system32\drivers\etc\hosts
中的文件。 在 Linux 和 Mac 上,您可以分别将终端与sudo nano /etc/hosts
和sudo nano /private/etc/hosts
一起使用。
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 255.255.255.255 broadcasthost ::1 localhost 212.124.126.242 my-app.dev # add your host name to the list
下一步是什么?
现在一切都设置好了,您可以将任意数量的应用程序部署到您的 Raspberry Pi,并永久安装或安装 pm2 以保持您的 Node.js 服务器处于活动状态。
请记住,如果出现问题,您可以擦除 SD 卡并从头开始!