树莓派上安装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)

image.png
    • ホスト名

 

    • SSHを有効化

パスワード認証を使う
公開鍵認証のみを許可する

piのためのauthrized_keys

ユーザー名とパスワードを設定する。

ユーザー名
パスワード

Wi-Fiを設定する

SSID
パスワード
Wfiを使う国

ロケールを設定する

タイムゾーン
キーボードレイアウト

当你觉得指示灯有问题时,请查看这里。

 

启动。

image.png

无法连接到laspberrypi.local。

在这里遇到的问题是,在Windows10的错误造成mDNS无法正常工作,有时候即使对laspberrypi.local进行ping操作也无法解析名称。在主要环境中,通过重新启动win可以暂时解决,但根本解决方案似乎是等待win的更新。如果问题无法解决,无法进行SSH连接,所以需要使用netscan.exe、路由器管理界面等方法来找到树莓派的IP地址。虽然有主机名会很方便,但只要知道IP地址,这次我们就不会遇到问题。

 

通过SSH进行连接

一旦安装完成后,可以通过SSH客户端连接到主机。连接设置将使用安装时的保存的记忆进行参考。
对于MobaXterm,可以在“会话设置”选项中选择SSH并输入相应设置项。
★ 在“书签设置”选项卡中,将会话名称备注为使用密码认证将会在之后更加便利。

image.png
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
image.png

删除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连接的确认。

image.png

编辑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

请确认只能使用公开密钥访问

image.png

如果一切顺利,我可以从本地的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而打开路由器的端口

image.png

一旦进行端口开放设置后,可以通过以下网站确认端口是否已经对外开放。

 

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地址是否已更新。

image.png

确认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

进行网络连接测试

image.png

参考文献(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选项,并在第二天检查网站的证书。

请参考这篇文章。

 

总结如下。

這篇文章僅作為備忘錄,提醒請注意內容可能僅適用於特定情況。謝謝辛苦工作。

亚马逊购买链接

undefined
undefined
undefined
undefined
广告
将在 10 秒后关闭
bannerAds