如何構建 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 卡並從頭開始!