很早之前写过一篇文章 - 树莓派折腾小记,那时候因为想省下云服务器的钱,买了一个树莓派,用它来当作家庭服务器来使用,折腾到后面虽然算是跑通了,但是因为使用过程中有几个问题没找到好的解决方案,就搁置吃灰了。

在它吃灰的这几年不得不又去买云服务器,去嫖各大厂商的新用户福利,300 块钱能瞟个三年,我也是一路从阿里云瞟到了腾讯云,转眼间六年就过去了,又到了三年一迁移服务器的时间,心中又萌发了搭建家庭服务器的想法。

时隔六年,当年 1G 内存的树莓派肯定不能担此重任了,本来想着要不买个最新的四代树莓派,一搜价格发现这性价比也太低了,都卖到四五百了,想当年我可是二百不到的价格买的呀。干脆一步到位,加几百块价买个 N100 迷你小主机得了,而且还是 X86 的架构,软件生态和兼容性都好过树莓派不少,说干就干,买了魔方 N100 最新款,拿到的那一刻是真的爱了,小巧精致,12G 内存、512G 固态、4 核 CPU,作为一台服务器性能绝对是杠杆的。

树莓派(上)、小主机(左下)、迷你键盘(右下)

上面说了那么多,下面步入正题,我是怎么把这台 N100 小主机变成一个家庭服务器的呢?

一、制作系统启动盘

N100 小主机自带的是正版的 Win11 系统,我们首先需要将它安装成 Ubuntu Server 22.04 系统,下面我们来制作系统镜像启动盘,准备材料如下:

  • 一个 U 盘(注意:烧录系统时,里面的内容会被清空)
  • Ubuntu Server 22.04 系统镜像(前往官网下载 X86 版本)
  • 系统烧录软件 - rufus

将 U 盘插入电脑中,打开系统烧录软件 rufus,选择 U 盘及烧录的系统,点击开始,等待完成一个 Ubuntu 系统的启动盘就做好了。

rufus 烧录系统

二、安装 Ubuntu 系统

将小主机插入电源、连接显示器、键盘、鼠标,然后开机后不断按 F12 进入 BOIS 界面选择 U 盘启动即可进入安装界面。安装的过程比较简单,基本上都是直接下一步,这里就不过多的介绍了,如果有不懂的可以参考这篇文章 - Ubuntu22.04 安装。我在安装的过程中遇到了几个需要注意的,下面也说一下:

  • Network Connections 网络配置这块,可以配置有线和无线连接,有手动和自动模式,如果小白的话直接选择 DHCP 自动模式就好了,后面熟悉了之后再配置静态 IP(PS:后面也会介绍的)。
  • Configure Ubuntu archive mirror 软件源配置这块建议直接填上,省去后面再修复/etc/apt/sources.list文件了,软件源地址填阿里源(https://mirrors.aliyun.com/ubuntu)即可。
  • Guided storage configuration 磁盘配置这块建议手动挂载,因为我发现选择自动挂载磁盘空间可能没有完全利用。

三、系统配置

安装好 Ubuntu 系统之后,我们就算是走完了万里长征的第一步了,接下来我们就需要装饰我们的系统了,就像买来一台新电脑之后,得改一些系统的默认配置让它更顺手些。

1)初始化 root 用户

使用下面命令初始化 root 用户的密码。

sudo passwd root

2)修改 ssh 配置

默认的 ssh 远程连接配置有些不安全的地方,我们要自定义一下。如果你在安装时没有选择开启 ssh 服务,需要手动安装一下openssh-server并启动该服务。

# 进入 ssh 配置文件夹
cd /etc/ssh/sshd_config.d/

# 新建自定义配置文件
vim custom.conf

# 增加如下配置,可自行增减
PasswordAuthentication no
PubkeyAuthentication yes
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 30

说明:主要是要禁用密码登录方式,开启密钥登录方式,这样子安全又方便。

3)更换国内源

如果在安装系统的过程中没有配置的话,这里需要改一下/etc/apt/sources.list文件,将软件源仓库地址改为国内源,因为国外源速度会比较慢还有可能为被墙,阿里源示例如下:

deb https://mirrors.aliyun.com/ubuntu jammy main restricted
deb https://mirrors.aliyun.com/ubuntu jammy-updates main restricted
deb https://mirrors.aliyun.com/ubuntu jammy universe
deb https://mirrors.aliyun.com/ubuntu jammy-updates universe
deb https://mirrors.aliyun.com/ubuntu jammy multiverse
deb https://mirrors.aliyun.com/ubuntu jammy-updates multiverse
deb https://mirrors.aliyun.com/ubuntu jammy-backports main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu jammy-security main restricted
deb https://mirrors.aliyun.com/ubuntu jammy-security universe
deb https://mirrors.aliyun.com/ubuntu jammy-security multiverse

4)更新系统及软件

接下来我们就可以使用下面命令更新系统及软件,初始系统还是建议都更新到最新版本,毕竟后面项目、服务跑起来之后再更新的话,如果涉及系统重启或配置冲突的话就麻烦了。

apt-get update && apt-get upgrade

5)设置系统默认时区

将系统的时区设置了东八区上海,不然系统时间date可能是错的。

timedatectl set-timezone Asia/Shanghai

6)网络配置

上面提到过安装系统的时候是可以配置网络相关信息的,它的配置会保存在/etc/netplan/文件夹下面,通常分为有线网络和无线网络两种配置:

  • 有线网络配置示例
network:
  ethernets:
    enp2s0: # 网卡名称,可以通过 ifconfig 获取
      dhcp4: false # 禁用 IP 自动分配
      addresses: [192.168.0.120/24] # 配置静态 IP
      routes: # 网关配置
        - to: default
          via: 192.168.0.1
      nameservers:
        addresses: [114.114.114.114, 223.5.5.5] # DNS 配置
  version: 2
  • 无线网络配置示例
network:
  version: 2
  wifis:
    wlp1s0:
      access-points:
        xxxx: # wifi 名称
          password: 123334 # wifi 密码
      dhcp4: true

说明:无线网络配置示例中是动态 IP 自动分配的方式,如果要配置静态 IP 可以参考上面的有线网络配置示例稍微改一下即可。配置完成后使用命令netplan apply生效配置,然后使用命令ifconfig就可以看到配置生效了。

四、安装软件

系统初始配置调整之后,接下来就是安装常用的工具软件和服务了。

1)通用类

apt-get install speedtest-cli net-tools lrzsz unzip btop neofetch python3-pip

说明:

  • speedtest-cli 一款简单的测速小工具,折腾好之后当然是测试一下服务是否能跑满带宽啦
  • net-tools 网络小工具,如:ifconfig 命令
  • lrzsz 上传或下载文件
  • unzip 解压缩文件
  • btop 一款简单强大的 top 命令增强版,界面很漂亮
  • neofetch 一款漂亮的系统信息打印小工具,可自定义信息输出
  • python3-pip pythone 安装工具

btop 运行示例

neofetch 运行示例

拓展:还有一些搞笑的小命令能让你眼前一亮,可以看看这篇文章 - 40 个超有趣的 Linux 命令行彩蛋和游戏

2)zsh

这个工具用过 Mac 电脑的人肯定很熟悉,配合上 oh-my-zsh 之后简直好用到爆,能将命令行玩出花来,没听说过的强烈推荐了解一下。下面说一下安装和简单的配置:

# 安装 zsh
apt-get install zsh

# 将 zsh 设置为默认 Shell,并重启 shell 窗口
chsh -s /bin/zsh

# 安装 oh-my-zsh
sh -c "$(wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh -O -)"

# 配置主题
vim ~/.zshrc
ZSH_THEME="maran"

# 下载好用的插件
git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git $ZSH_CUSTOM/plugins/zsh-syntax-highlighting

# 启用插件
vim ~/.zshrc
plugins=(git docker z zsh-autosuggestions zsh-syntax-highlighting)

说明:oh-my-zsh 有很多好用的插件和漂亮的主题,可以玩出花来哦~

3)PM2

一款强大的常驻进程管理工具,可以先看看我之前写的这篇文章 - PM2 那些事,这里简单介绍下:

安装该工具首先需要安装 node 环境

# 安装 npm
apt-get install npm

# 配置代理源
npm config set registry https://registry.npmmirror.com

# 查看代理源
npm config get registry

# 升级为最新版本
npm install -g n
n stable
node -v

安装 PM2 并开机自启配置

# 安装 pm2
npm install -g pm2

# 开机自启
pm2 startup

# 保存进程列表
pm2 save

说明:通过配置 PM2 开机自启动和保存进程列表之后,如果服务器通电重启后,PM2 服务会自己启动,并将保存的进程列表逐个重启,这样子就解决了服务器重启后的服务自启的问题。

4)Docker

作为一台服务器,怎能不安装 Docker 呢,简单记录一下安装步骤吧,有不明白的地方可以参考一下 Docker 官网 说明。

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg

# Add the repository to Apt sources:
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

# To install the latest version
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 更换国内源
vim /etc/docker/daemon.json
{
    "registry-mirrors": [
        "https://docker.mirrors.sjtug.sjtu.edu.cn"
    ]
}

# 重启服务
systemctl restart docker
docker info

# 开机自启
systemctl enable docker

5)常用服务

到这一步就该安装项目所依赖的服务了,包括:nginxmysqlredisphp 等,简单记录一下:

nginx 服务

# 安装 nginx
apt-get install nginx

说明:安装比较简单一条命令就搞定了,不过具体的站点配置要还要结合自身项目作一些调整,包括:SSL 证书、静态资源缓存、Gzip 压缩、HTTP2.0、自定义 access.log 日志、反向代理、身份认证等,这里就不展开说了。

mysql 服务

# 安装
apt-get install mysql-server

# 修改 root 用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'xxx';

# 初始化安全策略
mysql_secure_installation

说明:mysql 服务安装之后也需要改一下它的默认配置,包括:慢日志、binlog、主从配置等,这里也不展开说了。

redis 服务

# 安装
apt-get install redis-server

# 设置密码
vim /etc/redis/redis.conf
requirepass xxxx

说明:redis 服务安装之后除了设置密码之外,还可以配置调整 redis 持久化策略这些,结合项目情况自行调整。

php 服务

# ubuntu22 默认安装是 8.1 版本的 php
apt-get install php8.1-fpm php8.1-mysql php8.1-curl php8.1-mbstring php8.1-xml php8.1-zip php8.1-gd php8.1-opcache php8.1-common php8.1-cli php8.1-bcmath php8.1-redis

# 安装低版本 7.4,为了兼容老项目
add-apt-repository ppa:ondrej/php
apt-get update
apt-get install php7.4-fpm php7.4-mysql php7.4-curl php7.4-mbstring php7.4-xml php7.4-zip php7.4-gd php7.4-opcache php7.4-common php7.4-cli php7.4-bcmath php7.4-redis

# 切换版本
update-alternatives --config php

# 移除三方源
add-apt-repository -r ppa:ondrej/php

说明:因为有一些老项目还是用的旧的 PHP 版本,所以这里安装两个版本的 PHP 服务,在使用时通过 nginx 服务指向不同的 php-fpm 进程。

五、内网穿透

终于到了最关键的一步,软件、服务、项目都搞好了,我们就要解决公网 IP 的问题了,这也是家庭服务器难题之一。由于家庭网络都是没有公网 IP 的,因此无法在外面访问到家里的内网服务,这不就废了吗?别慌,办法总比困难多,目前有以下几种解决方案:

  • 申请公网 IP
  • 使用 IPV6
  • 内网穿透

前两种方式有个缺点必须加端口号,因为像 80443 这样子的端口家庭网络是封禁掉的,建站的话就不合适了,因此我这里推荐第三种方式 - 内网穿透,我也调研了下市场上的提供内网穿透服务的三方服务商,比如下:

  • ittun - 完全免费,非商业不稳定,自定义域名只支持 HTTP
  • natfrp - 免费 2 个,功能完善,稳定线路多,一个月 10 元
  • openfrp - 免费无限制,可建站线路偏少,一个月 10 元
  • locyanfrp - 免费无限制,但线路必须带端口,不适合建站
  • sunny - 免费 2 个,功能完善,稍贵,一条线路 10 元

对比之下我选择了 natfrp,使用的是 frp 的穿透方式,可自定义配置,一个月 10 块钱,10 条隧道,3M 左右的带宽,个人建站来说足够用了。

natfrp 内网穿透流量监控

在使用的过程中遇到了一个问题,这里也记录一下,在使用了内网穿透之后,发现 nginx 的请求日志中的 IP 都变成了 127.0.0.1 的内网 IP,这样子肯定是不行的,如何获取用户的真实 IP 呢?解决办法还是有的,只需要两步就可以了:

  1. 在 frpc.ini 配置中加入 proxy_protocol_version,示例如下:
[tank_blog]
# id = 11279815
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = blog.dandy.fun
force_https = 301
proxy_protocol_version = v2
  1. 更改 nginx 配置,加入 proxy_protocolset_real_ip_fromreal_ip_header配置项,示例如下:
server {
  listen 443 ssl http2 proxy_protocol;
  listen [::]:443 ssl http2 proxy_protocol;
  set_real_ip_from 127.0.0.1;
  real_ip_header proxy_protocol;

  .....
}

六、聊聊别的

到了这一步,一台实用的家庭服务器就完成了,可以将它放在安静的角落为你“当牛做马”了,不过时间长了可能还会遇到一些特殊的场景,我想聊聊的我解决方案。

1)通电自启

作为家庭服务器,意外断电是不可避免的(小区停电了),这种情况下,服务肯定就嗝屁了,这我们无能为力,搞个备用电源就太奢侈了,但当来电之后电脑自动开机还是有必要的,现在好多电脑已经支持了,只需要在 Boot 里设置一下即可,开机后再配合 PM2 服务自启就搞定了。

通电自启动设置

2)物理重启

服务器如果死机了,SSH 远程连接进不去,而且人又不在家里没办法断电重启怎么办?我们知道如果买的云服务器,只需要进入商家管理后台就可以实现物理硬重启了,那么家庭服务器如何实现硬重启呢?我想到一个奇技淫巧 - 智能插座,将电脑电源插在智能插座上,通过远程控制插座的通断来实现物理重启,再结合上面的通电自启服务,就可以到达和云服务器一样的效果了。

智能插座

3)服务监控

像断网、断电、服务中断、系统异常这些情况也是很常见,我们要想第一时间知道那么肯定就离不开系统监控服务了,而且监控服务又不可以部署在本机,因为本机挂了之后,监控服务的消息肯定是发不出去的,那些开源的监控项目肯定是不能用了,我这里用了一款简单好用还免费的 - uptimerobot

Uptimerobot 服务监控

未完待续,有时间了我们再聊一聊,一台家庭服务器能折腾点什么呢?

写于 2023-11-26 20:43 杭州