在无头树莓派上运行你的 Node.js 应用程序
NodeSource N|Solid 和 Node.js 二进制发行版
最近我桌上放着一台小型硬件设备( 树莓派 2 B 型 )。与其让它整天闲置,不如用 Nginx 运行一个简单的 Node.js 应用程序。
让树莓派启动并运行起来
无头安装不需要任何额外的硬件(例如屏幕或键盘),因此您只需要树莓派本身、一张 microSD(或 SD,取决于您的硬件)卡和互联网连接(有线或无线,同样取决于您的树莓派)。
Raspbian 是针对树莓派优化最好的操作系统,我需要简洁快速的安装环境时就会使用它。只需访问 官方网站 ,下载最新版本的 Raspbian Stretch Lite 即可。
2. 烧掉那张照片
将存储卡插入电脑,并将 Raspbian 镜像写入存储卡。
我按照 这些说明操作 ( Linux / Windows 也适用),因为我更喜欢使用终端,但 Etcher (功能强大的图形化替代方案)在所有平台上也可用。
3. 启用无头 SSH 连接
Raspbian 默认情况下未启用 SSH,因此您需要在首次启动该卡之前启用它。
安装完成后,转到并创建一个名为 (无扩展名) boot/的文件。 ssh
touch ssh
Enter fullscreen mode
Exit fullscreen mode
4. 启动树莓派
插入存储卡、电源线和网线。绿色 LED 指示灯停止闪烁后,您的树莓派就可以正常工作了!
5. 找到那台树莓派
你已经有了电源、网络和操作系统,但没有键盘,也没有屏幕。你该如何连接到树莓派?
要通过 SSH 连接到树莓派,您首先需要在您的网络中找到它。假设您已将树莓派连接到您的家庭网络,您可以从 ARP 表中查看局域网中的所有设备(MAC 地址和 IP 地址)。只需在终端中运行以下命令即可(适用于所有平台)。
arp -a
Enter fullscreen mode
Exit fullscreen mode
你的树莓派就在那里。
fritz.box (192.168.178.1) on en1 ifscope [ethernet]
raspberrypi.fritz.box (192.168.178.73) on en1 ifscope [ethernet]
Enter fullscreen mode
Exit fullscreen mode
就我而言, fritz.box路由器就在它后面,树莓派紧随其后。所以从现在开始,我将通过 192.168.178.73地址连接到它们。
更多关于 ARP 表以及如何在其中找到您的设备的信息。
6. 最后 通过 SSH 连接到那台树莓派。
默认凭据为
username: pi
password: raspberry
Enter fullscreen mode
Exit fullscreen mode
通过 SSH 连接到 Raspberry Pi。在 Mac 或 Linux 系统 上,您只需运行以下命令即可。
bash
ssh pi@192.168.178.73
Enter fullscreen mode
Exit fullscreen mode
而在 Windows 系统 上,有一些替代方案,例如 Putty或 Cmder 的 默认配置 。
启动并运行你的 Node.js 应用程序
你已经成功登录!接下来你需要启动你的Node.js应用程序,以下步骤将通过SSH在你的树莓派上运行。
1. 在 Raspbian 系统上安装 Node.js
在 Linux 机器上安装 Node.js 的 方法有很多,但我总是遵循 NodeSource 的说明,因为这是我做过的最安全的方法。
对于 Node.js v11.x,我运行了
sudo apt-get update
curl -sL https://deb.nodesource.com/setup_11.x | bash -
sudo apt-get install -y nodejs
Enter fullscreen mode
Exit fullscreen mode
总之, curl -sL https://deb.nodesource.com/setup_11.x | bash -如果您需要更多工具或插件,我会提供更多说明。
检查Node.js是否 npm已正确安装。
$ node -v
v11.10.0
$ npm -v
6.7.0
Enter fullscreen mode
Exit fullscreen mode
对于其他版本或故障排除,请参阅 NodeSource 的详细文档。Raspbian 是基于 Debian 的操作系统,因此请查找 Debian 的相关说明。
NodeSource Node.js 二进制发行版
如果你选择编写或粘贴代码,请快速安装 vim,这将使我们的生活更轻松,稍后我会指导你,不用担心。
sudo apt-get update
sudo apt-get install vim -y
Enter fullscreen mode
Exit fullscreen mode
2. 获取你的 Node.js 应用
编写、复制粘贴或 克隆 Node.js 应用程序。为了测试目的,我创建了 app.js一个文件。
cd ~
vim app.js
Enter fullscreen mode
Exit fullscreen mode
我粘贴了以下样板文本
const http = require ( ' http ' );
const PORT = 3000 ;
const server = http . createServer (( req , res ) => {
res . statusCode = 200 ;
res . setHeader ( ' Content-Type ' , ' text/plain ' );
res . end ( ' Hello dev.to! \n ' );
});
server . listen ( PORT , () => {
console . log ( `Server running on port ${ PORT } .` );
});
Enter fullscreen mode
Exit fullscreen mode
如果 vim觉得信息量太大,你可以尝试其他方法 nano。但为了确保万无一失,这里 再快速 补充一下:
使用 . 打开(或创建)文件 vim app.js。
现在, vim它处于 正常模式 ,正在等待您的命令。按下按钮 i进入 插入模式 ,这样您就可以编写代码了。
现在就输入或粘贴你的代码,就像你在编辑器中操作一样。
如果写完了,按下按钮 esc即可返回 正常模式 ,以便您可以执行 vim保存和退出命令。
通常, vim命令以 开头 :。轻轻按下 键 :,然后按 键 w输入命令 , 按 键 退出。您可以在终端底部看到您输入的命令。按回车键确认命令。 q
锵锵! app.js得救了。
如果你想用它玩更多疯狂的技巧 vim,请参考这篇入门指南,你会发现它 vim并没有 那么 难。
3. 最后 运行 Node.js 应用程序
跑步
$ node app
Server running at 127.0.0.1 on port 3000.
Enter fullscreen mode
Exit fullscreen mode
你的Node.js应用程序将在……上运行 localhost:3000/。
由于默认情况下所有端口均未打开,因此您只能在 Raspberry Pi 上测试该应用程序。打开 SSH 连接的新标签页并运行
curl localhost:3000
Enter fullscreen mode
Exit fullscreen mode
你应该得到
Hello dev.to!
Enter fullscreen mode
Exit fullscreen mode
4. 安装 PM2
当然,您希望应用程序以守护进程方式(在 后台 ) 运行,并且希望应用程序在系统重启时自动启动。PM2 可以满足所有这些需求。
停止您的 Node.js 应用程序( ctrl + C),然后继续安装。
我们将使用 npmPM2 进行全球安装 -g。
sudo npm install -g pm2
Enter fullscreen mode
Exit fullscreen mode
使用 PM2 启动应用程序
首先 app.js运行 PM2
bash
pm2 start app.js
Enter fullscreen mode
Exit fullscreen mode
你应该看看
[PM2] Starting /home/pi/app.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬─────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼─────┼───────────┼──────┼──────────┤
│ app │ 0 │ N/A │ fork │ 738 │ online │ 0 │ 0s │ 0% │ 21.8 MB │ pi │ disabled │
└──────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴─────┴───────────┴──────┴──────────┘
Enter fullscreen mode
Exit fullscreen mode
现在 app.js它已以守护进程方式运行。您可以像之前一样使用它进行测试 curl localhost:3000。
额外功能 :如果应用程序崩溃,PM2 将重新启动它。
PM2启动
该 pm2 startup命令将生成一个脚本,该脚本将在启动时启动 PM2 以及您配置要启动的应用程序。
pm2 startup systemd
Enter fullscreen mode
Exit fullscreen mode
将生成
[PM2] Init System found: systemd
[PM2] To setup the Startup Script, copy/paste the following command:
sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/pi
Enter fullscreen mode
Exit fullscreen mode
复制生成的命令并运行它。
sudo env PATH = $PATH :/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u pi --hp /home/p
Enter fullscreen mode
Exit fullscreen mode
这将创建一个系统单元,该单元将在系统启动时启动 PM2。系统启动时,PM2 将从尚未创建的转储文件中恢复。要创建该文件,请运行以下命令。
pm2 save
Enter fullscreen mode
Exit fullscreen mode
这将把 PM2 的当前状态( app.js运行状态)保存到一个转储文件中,该文件将在恢复 PM2 时使用。
搞定!您的应用程序目前正在运行,如果系统重启,它将在系统启动时自动启动。
PM2守护进程
您随时可以使用 或 查询您的 pm2 list申请 pm2 status状态 pm2 show。
$ pm2 list
┌──────────┬────┬─────────┬──────┬─────┬────────┬─────────┬────────┬──────┬───────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼─────────┼──────┼─────┼────────┼─────────┼────────┼──────┼───────────┼──────┼──────────┤
│ app │ 0 │ N/A │ fork │ 451 │ online │ 0 │ 96m │ 0.2% │ 31.8 MB │ pi │ disabled │
└──────────┴────┴─────────┴──────┴─────┴────────┴─────────┴────────┴──────┴───────────┴──────┴──────────┘
Enter fullscreen mode
Exit fullscreen mode
$ pm2 show app
┌───────────────────┬──────────────────────────────────┐
│ status │ online │
│ name │ app │
│ version │ N/A │
│ restarts │ 0 │
│ uptime │ 97m │
│ script path │ /home/pi/app.js │
│ script args │ N/A │
│ error log path │ /home/pi/.pm2/logs/app-error.log │
│ out log path │ /home/pi/.pm2/logs/app-out.log │
│ pid path │ /home/pi/.pm2/pids/app-0.pid │
│ interpreter │ node │
│ interpreter args │ N/A │
│ script id │ 0 │
│ exec cwd │ /home/pi │
│ exec mode │ fork_mode │
│ node.js version │ 11.10.0 │
│ node env │ N/A │
│ watch & reload │ ✘ │
│ unstable restarts │ 0 │
│ created at │ 2019-02-17T14:14:35.027Z │
└───────────────────┴──────────────────────────────────┘
Enter fullscreen mode
Exit fullscreen mode
PM2 中有很多强大的功能可供使用,请阅读下文了解更多关于日志和流程的信息。
使用反向代理
正如我之前提到的,您设备上的所有端口目前都未公开,因此您无法从外部访问您的树莓派。是否应该为您的 Node.js 应用程序使用反向代理有 很多原因 。出于可扩展性和安全性的考虑(而且设置和管理起来也非常简单),我将使用 Nginx 作为此应用程序的反向代理服务器。
0. 不要使用反向代理 :(
如果您计划使用反向代理,请不要执行此步骤,否则您会搞乱端口(例如同时打开 80 和 3000 端口)。
无需反向代理,一种简单的方法是 ufw允许某些端口接受入站流量。但请注意,这可能存在严重的安全漏洞。
通过运行以下命令进行安装:
sudo apt-get install ufw
Enter fullscreen mode
Exit fullscreen mode
快速 sudo ufw status verbose检查即可发现该功能 ufw当前处于非活动状态。启用该功能前,您应该允许所有 SSH 流量访问您的设备,以免连接中断。
$ sudo ufw allow ssh
Rules updated
Rules updated ( v6)
Enter fullscreen mode
Exit fullscreen mode
现在你可以启用它了。
sudo ufw enable
Enter fullscreen mode
Exit fullscreen mode
再快速检查 sudo ufw status verbose一下就会发现所有入站 SSH 流量都已允许。所有出站流量也都已允许,所以不用担心。现在只需允许 3000应用程序端口上的连接即可。
sudo ufw allow 3000
Enter fullscreen mode
Exit fullscreen mode
现在您可以从世界外部访问!您可以在浏览器中输入设备的地址,后面加上端口号。
1. 安装 NGINX
我使用 Nginx 作为反向代理服务器,将所有进出端口的流量重定向 80到我的应用程序(端口号为 800) 3000。安装 Nginx 并运行
sudo apt update
sudo apt install nginx
Enter fullscreen mode
Exit fullscreen mode
安装完成后,Nginx 将立即运行。默认打开的端口是 802.1 80,您可以通过访问树莓派的地址进行测试。
2. 配置反向代理服务器
关于反向代理有很多内容可以讨论,但我们现在只讲基础知识。
您需要编辑默认配置(即您在浏览器中看到的 HTML 页面),以进行正确的重定向。
sudo vim /etc/nginx/sites-available/default
Enter fullscreen mode
Exit fullscreen mode
如果您不熟悉 Nginx, /etc/nginx/sites-available/default这是一个冗长且令人困惑的文件。我会删除所有注释,以便您更好地阅读。
server {
listen 80 default_server ;
listen [::]:80 default_server ;
root /var/www/html ;
index index.html index.htm index.nginx-debian.html ;
server_name _ ;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri / = 404 ;
# proxy_pass http://localhost:8080;
# proxy_http_version 1.1;
# proxy_set_header Upgrade $http_upgrade;
# proxy_set_header Connection 'upgrade';
# proxy_set_header Host $host;
# proxy_cache_bypass $http_upgrade;
}
}
Enter fullscreen mode
Exit fullscreen mode
您需要进行基本配置,因此请保持默认设置。您将对 location / {代码块进行更改。
取消注释该代码块内的注释部分,将端口更改为 3000,删除第一行,该配置即为反向代理(或者直接复制以下代码)。
server {
listen 80 default_server ;
listen [::]:80 default_server ;
root /var/www/html ;
index index.html index.htm index.nginx-debian.html ;
server_name _ ;
location / {
proxy_pass http://localhost:3000 ;
proxy_http_version 1.1 ;
proxy_set_header Upgrade $http_upgrade ;
proxy_set_header Connection 'upgrade' ;
proxy_set_header Host $host ;
proxy_cache_bypass $http_upgrade ;
}
}
Enter fullscreen mode
Exit fullscreen mode
使用以下命令检查 Nginx 中的语法错误
sudo nginx -t
Enter fullscreen mode
Exit fullscreen mode
最后 重启 Nginx服务器。
sudo systemctl restart nginx
Enter fullscreen mode
Exit fullscreen mode
请通过浏览器访问您的树莓派地址进行测试。
完成!所有发送到您树莓派地址的请求都将重定向到您的Node.js应用程序。
请注意,这是 Nginx 的基本配置,您可以在这里了解更多其他功能。
终曲
现在大功告成了!你已经成功运行了一个(守护进程运行的)Node.js应用程序,它运行在无头树莓派上,并通过Nginx反向代理服务器处理请求。
希望这篇指南足够全面,但我也欢迎大家在下方留言讨论或提问。请分享您的经验或您在此过程中发现的其他替代方案。
文章来源:https://dev.to/bogdaaamn/run-your-nodejs-application-on-a-headless-raspberry-pi-4jnn