基于LNMP框架自建树莓派Web服务器

前段时间正在逛赞噢校园集市的时候,偶然发现一个帖子出二手Raspberry Pi 4B,价格也非常适中(指五折),欣喜之下收了这块九成新的板子。我在很早之前是有一块Raspberry Pi 3B的,但是由于当时专业知识不够,不知道能用树莓派干些什么,所以这块3B也一直放在柜子里吃灰(泪)。不过大一学习了Linux系统的相关知识之后,查阅资料发现有不少人用树莓派来搭建个人服务器,再加上4B性能方面相较于3B有了很大的提升,于是我尝试着在宿舍利用树莓派搭建一个私人小型服务器来供学习使用。

最开始我想利用树莓派搭建一个NAS私有云文件管理系统,不过想了想在宿舍其实用处不大,再加上树莓派的处理速度有限,很难有比较好的使用体验。后来我想到了目前比较火热的用于个人使用的ECS云服务器。树莓派完全能够胜任小型个人网站的部署,于是我着手利用树莓派搭建一个Web服务器。

1. 树莓派

截至目前(2023.11.17),树莓派已经发行到Raspberry Pi 5(应该还在预售?),各大电商厂家都能够买到,4B的均价在¥400左右,3B的均价在¥300左右,此外树莓派还有其他如Zero W等型号。本文采用的是Raspberry Pi 4B

树莓派是Raspberry Pi基金会用于教育使用的卡片式电脑,最初售价为$30左右,但是由于全球芯片危机,芯片半导体供应紧张限制了电子设备产业发展,在全球缺芯问题的影响下于2021年首次涨价,不过近几年树莓派的价格趋于平缓。

树莓派本身继承很多个人电脑的特点,将所有的元件集成到一块基于ARM的微型电脑主板上,具备所有PC的基本功能。目前开发者已经推出了适用于树莓派的Linux、Windows系统,只要你有一张烧录好的TF卡,就能随时开启属于你的个人电脑(不过是只有电路板的电脑罢了)!树莓派的功耗非常小,在满载的状态下测试一年电费才¥30左右,所以不用担心树莓派的功耗问题。

本文所搭建的服务器采用Ubuntu Server for Raspberry Pi系统,所以在阅读本文的时候,最好有一点Linux操作系统的知识哦。

在正式开始搭建服务器,请准备好以下几件东西:

  • Raspberry Pi
  • TF卡(内存够用就行)
  • 读卡器
  • 个人电脑

2. Ubuntu Server

2. 1 下载镜像文件

众所周知,Linux操作系统起源于Unix操作系统,有很多版本可以选择,而Ubuntu是目前受众面最广的版本。Ubuntu的开发者专门开发了适用于树莓派的Ubuntu Server for Raspberry Pi系统,现在请前往 Install Ubuntu on a Raspberry Pi 下载操作系统镜像文件

找到并选择图中红框内的下载

由于本文将在终端中进行而不会用到图形化界面,为了节约TF卡里少量的空间请选择Server版本而不要下载Desktop版本。下载结束之后,你应该会得到类似于ubuntu-22.04.3-preinstalled-server-arm64+raspi.img.xz文件名的镜像文件。

2. 2 烧录TF卡

如果你熟练掌握如何将一个操作系统烧录到一张TF卡上,请跳过这一步。

如果你不太清楚如何烧录且你的TF不是新的,请提前对TF卡上重要文件进行备份以免重要数据丢失。

下载DiskGenius(磁盘格式化工具),用读卡器将TF卡插入你的个人电脑,依次对TF卡进行【删除分区】->【新建分区】->【保存更改】->【格式化】。

下载Rufus(镜像烧录工具),【设备】选择TF卡(名字应该是NO_LABEL),【镜像文件】选择刚刚下载的那个镜像文件,其余默认,点击【确认】等待烧录完成。

2. 3 网络设置

2. 3. 1 有显示屏

如果你有一块显示屏,那么连接到树莓派之后,将TF卡插入树莓派中,屏幕上应该会显示让你输入密码,默认初始密码为ubuntu,输入完之后会让你更改密码。进入之后,在终端中输入:

1
2
sudo -i
vim /etc/netplan/50-cloud-init.yaml

进入配置文件后,点击键盘上的i键,再将配置文件修改成以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
eth0:
dhcp4: true
optional: true
version: 2
wifis:
wlan0:
access-points:
"your_wifi_name":
password: your_wifi_password
dhcp4: true
optional: true

注意!请严格检查缩进,有的是2格缩进,有的是4格缩进,请以自己文件里面的缩进为准。其中your_wifi_nameyour_wifi_password分别用你对应的Wifi替换。修改完成之后,点击Esc键,再输入:wq即可退出编辑。

回到终端后输入以下命令:

1
2
3
4
5
systemctl enable wpa_supplicant
systemctl start wpa_supplicant
netplan generate
systemctl daemon-reload
netplan apply

2. 3. 2 无显示屏

如果你不幸没有一块显示屏,那么保持你的TF卡插在你的个人电脑上,不要把TF卡插到树莓派上。上一步完成之后,可能会出现找不到磁盘的情况,应该是因为烧录的文件系统与Windows的文件系统不匹配,Windows无法识别。如果你的磁盘发生了丢失,但是电脑显示插入了这个设备,那么接下来的操作请在DiskGenius进行(DiskGenius中能识别烧录的文件系统)。

在TF卡中的system-boot下找到network-config,选择用【记事本】打开,按照【2. 3. 1 有显示屏】的步骤进行修改即可。保存退出后,就可以把TF卡插到树莓派里面了。

2. 4 SSH连接

在浏览器登录到路由器的内网管理系统中(TP-Link的应该是192.168.1.1,其他厂家请查看路由器后的地址),在管理页面找到一个用户名为【ubuntu】的用户,记录IP地址。SSH连接工具很多,比如Putty,Xshell等等。本文为了演示方便使用Windows终端自带的SSH连接。

打开Windows终端,输入以下命令:

1
ssh -v ubuntu@Your_raspi_IP

其中Your_raspi_IP填写刚刚查到的IP地址。连接过程中会让你输入密码,默认密码为ubuntu,如果修改过了就填写修改过的密码。连接成功后,你将会看到下面的画面:

如果出现这个画面表示连接成功

2. 5 更换系统软件源

如果看到这一步都没有问题的话,恭喜你已经有了一台基本可以操作的服务器了,只要是处于同一互联网下可以随时进行操作。更换系统软件源是为了让系统的软件更新速度加快(因为默认软件源在国外,所以时不时会连不上),本文以清华镜像源为例。

进入清华镜像源,选择Ubuntu系统(根据你烧录的版本进行选择),其他默认就好,下面代码框中的内容就是待会儿需要添加的内容。

然后到SSH终端中,输入以下命令:

1
2
sudo -i
vim /etc/apt/sources.list

把刚刚清华镜像源代码框里面的内容复制到里面去(如果你对Vim的操作还不是太熟悉的话,建议去学习一些简单的操作):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse

deb http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
# deb-src http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ jammy-proposed main restricted universe multiverse

更换完之后保存退出。在终端中输入:

1
sudo apt update && apt -y upgrade

使你的软件源配置更新并为你的系统获取最新的软件包。

2. 6 设置静态局域网IP*

由于Ubuntu Server默认打开DHCP,所以可能会出现每次重启之后局域网IP地址会发生改变的情况,导致SSH连接不上服务器等问题。因此在服务器运维中设置一个静态局域网IP是非常有必要的。

在终端中输入如下命令:

1
sudo vim /etc/netplan/50-cloud-init.yaml

可能netplan文件夹下的文件名不同,请以自己文件夹下的那个文件名为准。

将配置文件中的内容修改为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# This file is generated from information provided by the datasource.  Changes
# to it will not persist across an instance reboot. To disable cloud-init's
# network configuration capabilities, write a file
# /etc/cloud/cloud.cfg.d/99-disable-network-config.cfg with the following:
# network: {config: disabled}
network:
ethernets:
eth0:
dhcp4: true
optional: true
version: 2
wifis:
wlan0:
access-points:
"Your_wifi_name":
password: Your_wifi_password
dhcp4: false
addresses:
- 192.168.1.111/24 # Your_Static_IP/Mask
routes:
- to: default
via: 192.168.1.1 # Your_gateway
nameservers:
addresses:
- 223.5.5.5 #DNS
- 8.8.8.8
optional: true

保存退出之后,在再次终端中输入:

1
2
3
4
5
systemctl enable wpa_supplicant
systemctl start wpa_supplicant
netplan generate
systemctl daemon-reload
netplan apply

重启之后静态局域网IP地址就应该生效了。(不过好像会自动断连,应该是修改成功了)

3. LNMP

至此,一个基本的Ubuntu Server系统就搭建好了。在这个系统基础上,我们来搭建Web服务器

3. 1 什么是LNMP?

LNMP,其实是Linux+Nginx+MySQL+PHP框架的简称,是当下最流行的Web服务器框架之一。

  • L指的是Linux操作系统,服务器所处的环境是处在Linux操作系统下。

  • N指的是Nginx,是一个高性能的HTTP和反向代理web服务器,具有性能稳定、功能丰富、运维简单、处理静态文件速度快且消耗系统资源极少的特点,在服务器中用于发布静态页面和使用Fast-CGI调用PHP-FPM解析动态页面。

  • M指的是MySQL,是目前最流行的关系型数据库管理系统之一。

  • P指的是PHP,是在服务器端执行的超文本预处理器脚本语言,PHP-FPM将来自Nginx的动态PHP请求解析成HTML文件返回给Nginx。

在LNMP流行之前,还有个LAMP框架,其中A指的是Apache,在对于PHP动态资源的处理上略有不同。但相比Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。

整个服务器的作用原理其实很简单:

  • 用户在浏览器中请求HTTP请求。
  • Nginx接收到请求。若为静态请求则直接解析返回;若为动态请求,则调用Fast-CGI接口,发送给PHP-FPM模块解析。
  • 若动态请求需要调用数据库,PHP-FPM则将调用数据库请求发送给MySQL数据库,读取需要的数据。
  • 将解析结果通过Fast-CGI返回Nginx,Nginx再将解析结果发送到用户浏览器。
  • 用户浏览器通过返回来的内容进行解析渲染呈现出来。

3. 2 安装LNMP框架

3. 2. 1 安装Nginx

打开SSH终端,先安装相关的依赖文件。在终端中输入:

1
sudo apt install -y gcc zlib1g-dev libpcre3 libpcre3-dev openssl libssl-dev

然后输入以下命令安装Nginx:

1
sudo apt install -y nginx

安装完成之后,在终端中输入:

1
sudo service nginx start

此时Nginx服务已经启动,在其他设备的浏览器地址栏中输入树莓派的IP地址。你将会看到以下页面:

如果出现这个画面表示开启成功

此时Nginx开启并正常运行。你可以在终端中输入如下命令来检查Nginx的运行状态:

1
sudo service nginx status

3. 2. 2 安装MySQL

打开SSH终端,输入以下命令:

1
sudo apt install -y mysql-server

3. 2. 3 安装PHP

打开SSH终端,在终端中输入:

1
sudo apt-get install -y php8.1-cli php8.1-dev php8.1-fpm php8.1-cgi php8.1-mysql php8.1-gd php8.1-curl php8.1-memcache

版本号可以选择你想要的版本号。

3. 2. 4 配置Nginx连接PHP

Nginx默认没有与PHP建立连接,为了Nginx能够调用PHP-FPM需要在配置文件中手动打开。在终端中输入:

1
sudo vim /etc/nginx/sites-enabled/default

然后将配置文件找到如下部分进行修改:

添加内容或解开相关的注释,PHP版本选择你下载的版本

保存退出,在终端中输入以下命令检查配置文件是否正确并重启Nginx使配置文件生效:

1
2
nginx -t
sudo service nginx restart

此时做一个PHP探针检验下配置文件是否生效,在终端中输入:

1
2
touch /var/www/html/phpinfo.php
echo "<?php phpinfo(); ?>" >> /var/www/html/phpinfo.php

然后在浏览器地址栏中输入Your_raspi_IP/phpinfo.php,你将会看到以下画面:

至此,LNMP框架基本搭建完成。

4. 内网穿透(SSL证书安装)

恭喜,你现在有了一个可以在局域网内访问的服务器!不过如果你想把你的服务器放在公网中访问该怎么办呢?

第一种方法是到网络运营商处申请公网IP(听别人说要死缠烂打工人师傅才会给你= =),然后通过公网IP进行访问。

第二种方式是内网穿透,即NAT穿透,实质是利用路由器上的NAT系统,将私有(保留)地址转化为合法IP地址的转换技术。通过代理服务器建立内网机器(Client)发起向外网服务器(Server)的连接。目前比较好用的内网穿透服务有Cpolar,Ngrok等等,可以自行搜索相关的教程进行配置。

这里简单说下关于SSL证书安装的方法。如果你想让你的自定义域名建立HTTPS的安全链接,建议在CDN服务商(如Cloudflare)处更改SSL加密模式,配置SSL源服务器证书。

我在网络上找了很多SSL证书安装教程,与Ubuntu Server for Raspberry Pi系统的安装略有出入,下面我介绍本系统的安装方法。

4. 1 生成SSL证书

以Cloudflare为例,在你的域名站点处左侧找到【SSL/TLS】,在【概述】中将加密模式改为完全

找到【源服务器】,在【源证书】处点击【创建证书】:

在主机名选择你自己服务器的域名:

新建文本文档将里面的源证书和私钥保存下来备用:

4. 2 安装SSL证书

打开SSH终端,在终端中输入:

1
sudo vim /etc/nginx/cert/ssl.pem

然后在配置文件中添加刚刚生成的源证书(Ctrl C + Ctrl V),保存退出

同理添加私钥:

1
sudo vim /etc/nginx/cert/ssl.key

4. 3 配置Nginx

打开SSH终端,在终端中输入:

1
sudo vim /etc/nginx/sites-enabled/default

解除图示位置的注释,开启443端口:

在配置文件中找到添加或修改如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root /var/www/blog;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html index.php;

ssl_certificate /etc/nginx/cert/ssl.pem;
ssl_certificate_key /etc/nginx/cert/ssl.key;
server_name Your_site_domain;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}

Your_site_domain修改成你的域名。保存退出后在终端中输入以下命令:

1
2
nginx -t
sudo service nginx restart

再次访问你的域名,就能看到证书配置成功了!

5. 总结

到这里Web服务器的框架搭建就基本完成了。如果你一路顺风顺水地看到这里的话,博主还是蛮佩服的(毕竟我花了将近一周的时间查阅资料才基本搞懂这里面的原理ww),同时也希望给在此时正在搭建Web服务器并遇到困难的朋友提供一点点帮助,希望看到我的博客能解决你和我同时产生的问题。

搭建的服务器能干嘛呢?这就要看你自由发挥了。有的人用服务器部署个人博客(如WordPress,Hexo等等),有的人搭建游戏服务器(三国杀,Minecraft等等),有的人用做邮件代理服务器,有的人用做NAS文件管理系统,还有的人创建独立运行环境跑实验项目……总之服务器的功能还有很多啦。不过树莓派功率还是比较小,不适合跑大型项目,仅供学习交流。

感谢你的阅读!


基于LNMP框架自建树莓派Web服务器
https://watercuckoo.top/基于LNMP框架自建树莓派Web服务器/
作者
WaTerBirD
发布于
2023年11月17日
许可协议