树莓派上安装Nginx Web服务器的步骤
由于不小心破坏了网络服务器,所以作为备忘录,我将记录从零开始使用树莓派搭建无头Nginx网络服务器的步骤。无需脱下裤子,一切都没问题。
目录
事前准备的项目
1. 将操作系统烧录到CD卡上
2. 启动
3. 通过SSH连接
4. 用户设置
5. 固定IP地址
6. 将SSH更改为公钥认证
7. 设置Raspi防火墙
8. 打开路由器的端口
9. 从外部进行SSH连接
10. 将域名与myDNS相关联
11. 安装最新版本的web服务器nginx(nginx-1.22.0)
12. 发行SSL证书(Let’s Encrypt)并自动更新
提前准备的东西
-
- 本体 本記事ではraspberry pi 4 model B 8G(以下raspi)
-
- type C ケーブル
-
- ACアダプター 15W以上(5V,3A)
-
- microSDカード
-
- microSDカードリーダー
-
- MobaXterm(ソフト)
-
- ルーター管理者権限
-
- 外部ネットワーク
- ドメイン
将OS烧录到CD卡中(Raspberry Pi OS Debian 11 Bullseye)

-
- ホスト名
-
- SSHを有効化
パスワード認証を使う
公開鍵認証のみを許可する
piのためのauthrized_keys
ユーザー名とパスワードを設定する。
ユーザー名
パスワード
Wi-Fiを設定する
SSID
パスワード
Wfiを使う国
ロケールを設定する
タイムゾーン
キーボードレイアウト
当你觉得指示灯有问题时,请查看这里。
启动。

无法连接到laspberrypi.local。
在这里遇到的问题是,在Windows10的错误造成mDNS无法正常工作,有时候即使对laspberrypi.local进行ping操作也无法解析名称。在主要环境中,通过重新启动win可以暂时解决,但根本解决方案似乎是等待win的更新。如果问题无法解决,无法进行SSH连接,所以需要使用netscan.exe、路由器管理界面等方法来找到树莓派的IP地址。虽然有主机名会很方便,但只要知道IP地址,这次我们就不会遇到问题。
通过SSH进行连接
一旦安装完成后,可以通过SSH客户端连接到主机。连接设置将使用安装时的保存的记忆进行参考。
对于MobaXterm,可以在“会话设置”选项中选择SSH并输入相应设置项。
★ 在“书签设置”选项卡中,将会话名称备注为使用密码认证将会在之后更加便利。

pi@raspberrypi:~ $ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
4. 用户配置
①. 为root用户设置密码
sudo passwd root
②. 添加常用用户(以下添加”用户名”)
sudo adduser username
3. 確認 pi 用户的权限
pi@raspberrypi:~ $ groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev pi spi gpio
给新添加的用户复制权限。
sudo usermod -G pi,adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,netdev,input,spi,gpio username
确认复制的权限
pi@raspberrypi:~ $ groups username
username : username adm dialout cdrom sudo audio video plugdev games users input netdev pi spi gpio
从pi用户复制文件夹
sudo cp -r /home/pi/* /home/username
⑧树莓派重新启动
sudo reboot
在这种情况下,由于SSH连接中断,在重新连接之前,您需要在MobaXterm的SSH设置中将用户从pi更改为username,然后重新连接。
取消自動登錄。
sudo raspi-config

删除9号Pi用户
sudo userdel -r pi
我需要确认是否已经删除了。
username@raspberrypi:~ $ id -a pi
id: ‘pi’: no such user
请参阅下面的文章以获取1至10的详细信息。
“购买后首先落实!树莓派的安全措施 – 操作步骤” – Qiita
5. 固定IP地址
将id分配给Wi-Fi的设置。
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
如果在安装时进行了WiFi连接设置,则在下面的设置中已经记录了priority和id_str,请在{}内追加它们。priority是优先级,如果没有其他网络,可以设置为1。id_str可以在标签中使用以固定IP地址。请在双引号中自由设置。
update_config=1
network={
ssid="Wifi5G"
psk=2aee2d9814471e7ba806f59f509393d329f2e66096214acd0b23cb7b0195b5
priority=1
id_str="Home"
}
顺便提一句,如果以类似的格式在这个文件中描述,也可以添加其他wifi。如果有多个网络设置,将按照较低优先级的顺序进行优先连接。
设置固定IP
sudo nano /etc/dhcpcd.conf
这个文件中记录了连接网络的IP设置。虽然有很多注释写了一些内容,但是我会在”# Example static IP configuration:”注释的下方附加以下设置。
# static IP configuration:
interface wlan0
iface Home inet static
static ip_address=XXX.XXX.XXX.YYY/24
static routers=XXX.XXX.XXX.Z
static domain_name_servers=XXX.XXX.XXX.Z
将上述内容进行中文本地化翻译, 只需要一个选项:
如果在Wi-Fi设置时,iface Home inet static部分是id_str的内容。
如果有其他网络,则可以在其下面添加iface example ~以及之后的内容来单独设置Wi-Fi。
作为操作测试,可以使用curl命令来确认是否能够访问互联网。
username@raspberrypi:~ $ curl https://example.com
<!doctype html>
<html>
<head>
~~~~~~
</body>
</html>
请参阅以下页面,了解有关IP固定的详细信息。
在树莓派上进行多个网络设置 – Qiita
将SSH更改为公钥认证。
在Win中生成公钥和私钥。
在cmd中输入命令并执行
ssh-keygen -t rsa -b 4096 -C "email@example.com"
被问及文件生成位置和访问密码,请进行设置。
将id_rsa.pub从win传输到Raspi。
在Raspi上,创建一个名为/home/username/的.ssh文件夹。
请注意,避免使用sudo权限创建此文件夹,以免出现问题。
mkdir ~/.ssh
通过MobaXterm的导航窗口等,将生成的id_rsa.pub传输到/home/username/.ssh目录下。
将id_rsa.pub文件的内容添加到authorized_keys中。
cd ~/.ssh/
cat id_rsa.pub >> authorized_keys
修改权限 (Modify permissions)
chmod 600 authorized_keys
chmod 700 ~/.ssh
删除转发的公钥。
rm -vi ~/.ssh/id_rsa.pub
用公钥进行SSH连接的确认。

编辑ssh认证设置,如密码认证等。
在验证公钥连接完成之前,请不要断开当前的SSH会话。在最坏的情况下,可能需要重新安装。
sudo nano /etc/ssh/sshd_config
由于下列项目被注释掉,需要进行修正或添加。
/etc/ssh/sshd_config
PermitRootLogin no
PasswordAuthentication no
PermitEmptyPasswords no
重新启动SSH服务
sudo /etc/init.d/ssh restart
请确认只能使用公开密钥访问

如果一切顺利,我可以从本地的WinPC使用公钥进行SSH连接到Raspi。其他会话设置可以删除。
请查阅下文以获取详细信息。
购买后首先进行实施!将Raspberry Pi的安全措施改为SSH公钥验证- Qiita
7. 设置树莓派的防火墙ufw
① 要更新apt
sudo apt update && sudo apt upgrade
安装 UFW
sudo apt install ufw
拒绝所有的端口。
sudo ufw default deny
开放SSH端口22,HTTP端口80和HTTPS端口443。
sudo ufw allow 22
sudo ufw allow 80
sudo ufw allow 443
只保留IPv4
sudo nano /etc/default/ufw
# /etc/default/ufw
IPV6=no
启动ufw
sudo ufw enable
确认ufw的状态
username@raspberrypi:~ $ sudo ufw status
Status: active
To Action From
-- ------ ----
22 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
如果想要添加其他端口,可以在第四步中指定另一个端口。
更多详细信息请参考下面内容。
8. 为了使用SSH而打开路由器的端口

一旦进行端口开放设置后,可以通过以下网站确认端口是否已经对外开放。
9. 外部进行SSH连接。
通过查看和设置具有WAN侧IP地址的端口,在外部网络(例如“共享连接”)上连接以将6.SSH更改为公钥验证的“6.使用公钥确认SSH连接”的方式。
10. 域名关联(myDNS)
自动向myDNS.jp通知IP
最好的情况是,我会使用wget命令进行确认,但为了简化步骤,我会直接将测试写入crontab。
crontab -e
*/3 * * * * wget -q -O /dev/null http://masterID:Password@ipv4.mydns.jp/login.html
每3分钟发送一次IP通知,请将masterID和Password替换为通过电子邮件发送的myDNS.jp登录信息。
no crontab for napspans - using an empty one
crontab: installing new crontab
确认IP地址更新
从MyDNS的LogInfo中确认IP地址是否已更新。

确认SSH连接
更改通过SSH连接的主机为在myDNS上注册的域名,并从外部网络访问以验证是否可以连接。
参考文献。
11. 安装最新版本的nginx web服务器 (nginx-1.22.0)
安装依赖包。
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring
获取和导入nginx签名密钥。
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
请确认钥匙是否正确。
gpg --dry-run --quiet --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
出力内容
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
酒馆的指纹是573BFD6B3D8FBC641079A6ABF5BD827BD9BF62。
添加apt仓库以安装稳定版本的nginx。
username@raspberrypi:~ $ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian bullseye nginx
nginx官方软件源的优先级
username@raspberrypi:~ $ echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" | sudo tee /etc/apt/preferences.d/99nginx
Package: *
Pin: origin nginx.org
Pin: release o=nginx
Pin-Priority: 900
安装nginx
sudo apt update
sudo apt install nginx
确认nginx版本
username@raspberrypi:~ $ nginx -version
nginx version: nginx/1.22.0
只需要一个选项:更新nginx配置文件。
sudo nano /etc/nginx/conf.d/default.conf
将默认设置的server_name进行修改。
# /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name example.com;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
覆盖并重启服务
sudo service nginx restart
进行网络连接测试

参考文献(nginx官方文档)
12. SSL证书的发布(Let’s Encrypt)和自动更新
安装CertBot(Let’s Encrypt的客户端)。
sudo apt install certbot python3-certbot-nginx
获得证书
sudo certbot --nginx -d example.com -d www.example.com
执行后,会有几个问题需要回答以创建账户。
在这个邮箱上,将会收到通知证书即将过期。同时,第三个问题是关于许可广告邮件的同意,请注意。
napspans@raspberrypi:~ $ sudo certbot --nginx -d napspans.space -d www.napspans.space
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): example@email.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: n
Account registered.
当账户被创建后,发行步骤将继续进行,并成功完成。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://napspans.space
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/napspans.space/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/napspans.space/privkey.pem
Your certificate will expire on 2022-09-18. To obtain a new or
tweaked version of this certificate in the future, simply run
certbot again with the "certonly" option. To non-interactively
renew *all* of your certificates, run "certbot renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
通过更新nginx配置文件,certbot会追加更新后的config文件。
确认能否通过浏览器访问https。
更新证书
sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/napspans.space.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
The following certificates are not due for renewal yet:
/etc/letsencrypt/live/napspans.space/fullchain.pem expires on 2022-09-18 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
在执行的结果中将显示”skipped”,这是由于证书的有效期剩余不到30天,为了减轻负载而不对其进行更新,属于正常操作。
如果您非常希望成功,请使用以下选项执行:
–force-renew
您可以忽略证书的剩余有效期,强制更新之前发放的所有证书。然而,每天强制更新所有证书并不适当,可能会触及Let’s Encrypt认证机构的速率限制。
–测试模式,不实际执行更新操作
自动更新设置
sudo crontab -e
使用root权限向crontab中添加以下执行命令。
由于更新需要使用sudo来执行,所以这里是很重要的。
在Linux中,”sudo crontab -e”和”crontab -e”有什么区别。
0 0 1 * * sudo certbot renew && systemctl restart nginx
只有在60天后才能确定这个crontab是否真的会被更新。
如果想立即知道是否进行了更新审核,请在crontab文件中添加–force-renew选项,并在第二天检查网站的证书。
请参考这篇文章。
总结如下。
這篇文章僅作為備忘錄,提醒請注意內容可能僅適用於特定情況。謝謝辛苦工作。
亚马逊购买链接



