本文概述
- 你需要此Raspberry Pi家用服务器什么?
- Raspberry Pi操作系统:Raspbian
- 在Raspberry Pi上安装Web服务器(Nginx)
- 打开网络:端口转发
- 安装框架:全栈JavaScript
- 部署你的应用
- 配置Nginx反向代理
- 下一步是什么?
Raspberry Pi是一台小型计算机, 价格低至5美元, 你可以在其上运行许多不同类型的软件并构建许多不同的项目。
在本文中, 我将指导你完成将其设置为家庭开发服务器并部署可从网络外部访问的全栈JavaScript应用程序的过程。这非常适合设置你自己的远程数字工作区, 或者仅用于控制你用于开发的硬件。
你需要此Raspberry Pi家用服务器什么?
尽管现在特别是Raspberry Pi 3教程, 但它仍应适用于第一代的模型-如果你有旧模型或Raspberry Pi Zero, 请在下面的评论中告诉我们你的经验。
除了Raspberry Pi开发板本身, 你还需要:
- 微型USB充电器
- 以太网电缆
- 一张microSD卡(最低8GB, 最高32GB的卡似乎可以正常工作)
这些在初始设置期间也将派上用场:
- USB键盘
- HDMI电缆和监视器
Raspberry Pi操作系统: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地址后, 请从终端(或Windows)通过SSH使用SSH连接到设备。默认用户为pi, 默认密码为raspberry。因此, 例如, 如果IP地址为192.168.1.16, 请运行ssh [受电子邮件保护], 并在出现提示时输入密码。
- 连接后, 请运行sudo raspi-config。
raspi-config将引导你完成最终设置。你可以配置所有选项, 但最重要的是前两个:扩展文件系统, 确保所有SD卡存储都可用于OS, 并更改默认Pi用户的密码, 以便服务器将保护免受入侵者的侵害。
在Raspberry Pi上安装Web服务器(Nginx)
接下来, 你将安装网络服务器。我更喜欢Nginx, 因为它占用的内存少, 并且可以与Node.js配合使用(稍后将进行设置)。其他网络服务器(例如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地址后, 你可以将计算机的浏览器指向该IP地址, 你应该会在其中看到默认的” Welcome to Nginx”消息。
打开网络:端口转发
如果你不打算从本地网络外部访问Raspberry Pi, 则可以跳过此步骤。但是对于那些希望从其他位置访问其服务器的用户, 请确保可以进行访问。
在典型的家庭网络中, 连接到路由器的设备对于外部世界是不可见的。使用网络的外部IP地址只能从外部访问你的路由器。你的路由器负责确定允许哪些传入流量进入网络, 以及应将其发送到哪个设备。
当本地网络上的设备发起连接时(例如, 当你在浏览器中打开网站时), 路由器会将传入的响应流量识别为该连接的一部分, 并允许其通过。但是, 如果路由器接收到的访问流量不是开放连接的一部分(例如, 当外部设备尝试启动与内部设备的连接时), 它将阻止传入的流量进入网络。这是保护网络的重要安全功能!
那么如何从外部连接到Pi?答案是端口转发。必须将路由器配置为允许特定端口上的传入连接通过, 并将其发送到正确的设备。默认情况下, HTTP协议使用端口80, 而SSH使用端口22, 因此这是你需要在路由器上打开的两个端口, 以便访问Web应用程序并允许安全连接来管理服务器。
根据你的互联网提供商和路由器品牌的不同, 配置路由器以打开和转发端口的步骤可能会有所不同, 但是无论如何, 你应该能够通过路由器管理页面的高级配置选项来完成此操作。只需寻找一个名称类似”转发”, “端口转发”或”网络地址转换”的选项。
你需要为HTTP连接打开一个端口, 为SSH打开另一个端口。基本思想包括将寻址到这两个外部端口的数据转发到你的Raspberry Pi, Web流量去往Nginx正在监听的端口80, SSH流量去往端口22, SSH服务器接受来自外部计算机的连接。这是一个在路由器的配置页面中显示效果的示例:
如果你的Raspberry Pi的内部IP地址是192.168.1.16, 则进行端口转发配置。绑定到端口80或22的所有传入流量都转发到此内部地址。
你只需在Google中键入”我的IP地址是什么”即可确定路由器的外部IP地址。如果你随后移出路由器的网络, 则可以通过使用ssh [受电子邮件保护] {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
安装完成后, 你可以通过运行节点-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
…提交代码并将其推送到存储库中的build分支。
生成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中, 单击你的个人资料图片, 然后转到”管理帐户”。在”安全性”下, 找到SSH密钥, 然后单击”添加密钥”按钮。
克隆存储库
没有将应用程序代码放置在何处的约定, 但是你可以创建/ var / www目录并将所有项目放在此处。
cd /var
sudo mkdir www
为了避免在将文件放置在webroot中时使用sudo, 可以将所有者更改为Pi用户, 并将组更改为Nginx使用的www-data:
sudo chown -R pi:www-data www
cd www
现在, 你可以克隆存储库的build分支并安装依赖项:
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地址以检查其是否有效。
希望你拥有一个自己可以调用的开发服务器?你可以使用#RaspberryPi。
鸣叫
配置Nginx反向代理
还剩下一个步骤, 可以从外部访问你的应用程序。尽管Nginx正在侦听端口80(它将接收你的Pi的HTTP请求), 但Node应用程序本身正在侦听其他端口(例如, 端口8080)。因此, 你需要将Nginx配置为充当反向代理, 识别针对你的应用程序的请求, 并将其传递给Node。
Nginx将其服务的每个应用程序的配置文件保存在sites-available文件夹中:
cd /etc/nginx/sites-available/
在这里, 你可以复制默认配置文件并在方便时进行编辑:
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
}
}
为了启用此配置, 你需要在启用站点的文件夹中创建符号链接, 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卡, 然后从头开始重新启动!