由于一些原因,Docker 国内的镜像源全军覆没。国内服务器使用官方源安装 Docker,已经不可行,需要使用国内源安装。目前中科大源阿里云源还能安装 Docker,但不能拉取镜像。拉取 Docker 镜像可以白嫖Cloudflare Workers 搭建 Docker Hub镜像加速服务

一、更新系统

1、和更新源同步

1
sudo apt update

2、显示出哪些软件可以更新

1
sudo apt list --upgradable

3、进行更新

1
sudo apt upgrade -y

4、也可以直接用复合命令更新

1
sudo apt update && sudo apt upgrade -y

二、安装 Docker

按照 官方文档 步骤安装 docker

2.1、卸载旧版本

1、卸载 Docker EngineCLIcontainerdDocker Compose

1
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras

2、删除所有映像、容器和卷

1
sudo rm -rf /var/lib/docker
1
sudo rm -rf /var/lib/containerd

3、运行以下命令以卸载所有冲突的软件包

1
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done

2.2、使用 apt 存储库安装

在新主机上首次安装 Docker 引擎之前,需要设置 Docker 存储库。之后,可以安装和更新存储库中的 Docker

1、更新软件包索引并安装软件包以允许使用基于 HTTPS 的存储库

1
sudo apt-get update
1
sudo apt-get install ca-certificates curl gnupg -y

2、创建 /etc/apt/keyrings 目录并设置其权限为 755

1
sudo install -m 0755 -d /etc/apt/keyrings

3、添加存储库的 GPG 密钥(建议使用中科大源)

  • 中科大源
1
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • 阿里云源
1
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  • 官方源
1
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

4、修改 /etc/apt/keyrings/docker.gpg 文件的权限,以便所有用户都可以读取该文件

1
sudo chmod a+r /etc/apt/keyrings/docker.gpg

5、使用以下命令向 source.list 中添加 Docker 存储库(建议使用中科大源)

  • 中科大源
1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 阿里云源
1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  • 官方源
1
2
3
4
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

6、更新包索引

1
sudo apt-get update

2.3、安装 Docker 引擎

安装 Docker EnginecontainerdDocker Compose,要安装最新版本,请运行

1
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

腾讯云使用阿里云的镜像安装 Docker,速度很慢,建议使用中科大源。

2.4、查看 Docker 状态

  • 查看 Docker 服务的状态
1
systemctl status docker

Docker 安装完成默认是 active 状态,开机自启是 enabled 状态。

2.5、拉取镜像

此时虽然安装好了 Docker,但是去拉取镜像的话,拉取不下来,因为目前国内所有的镜像源全军覆没,可以查看这篇博文:白嫖Cloudflare Workers 搭建 Docker Hub镜像加速服务 中的方法自建。

三、安装 nginx

按照 官方文档 步骤安装 nginx

3.1、安装必备组件

1
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring -y

3.2、导入官方 nginx 签名密钥,以便 apt 可以验证软件包真实性

获取密钥

1
2
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

3.3、验证下载的文件是否包含正确的密钥

1
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

3.4、输出应包含完整指纹,如下所示

1
2
3
4
5
6
7
8
9
10
11
pub   rsa4096 2024-05-29 [SC]
8540A6F18833A80E9C1653A42FD21310B49F6B46
uid nginx signing key <signing-key-2@nginx.com>

pub rsa2048 2011-08-19 [SC] [expires: 2027-05-24]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>

pub rsa4096 2024-05-29 [SC]
9E9BE90EACBCDE69FE9B204CBCDCD8A38D88A2B3
uid nginx signing key <signing-key-3@nginx.com>

如果指纹不同,请删除该文件。

3.5、将 nginx 的稳定源加入系统

1
2
3
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

3.6、设置 nginx 官方源的优先级高于 Debian 系统的官方仓库

1
2
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx

3.7、更新源,并安装 nginx

1
sudo apt update
1
sudo apt install nginx -y

3.8、查看状态,启动 nginx

安装好的 nginx 默认是 dead 状态,需要启动,并设置开机启动。

  • 查看 nginx 服务的状态
1
systemctl status nginx
  • 启动 nginx 服务
1
sudo systemctl start nginx
  • 设置 nginx 开机启动
1
sudo systemctl enable nginx
  • 确认 nginx 服务的启动状态
1
systemctl status nginx
  • 相关命令
1
2
3
4
sudo nginx -V                       <-- 查看 nginx 的编译参数
cat /etc/nginx/nginx.conf <-- 查看 nginx 的配置文件
cat /etc/nginx/conf.d/default.conf <-- 还是 nginx 的配置文件
ip a <-- 查看本机 IP 地址

四、安装 PHP

官方手册

4.1、 查看版本

1
apt-cache search php-fpm
1
apt-cache show php-fpm

通过以上指令,我们可以确认 Debian 12php-fpm 的版本是 8.2,所以我们直接安装系统自带的版本(8.2版本)就好。

4.2、安装 PHP 8.2

1
sudo apt install php8.2

4.3、安装 PHP 8.2 扩展

  • PHP 8.2 扩展是为向 PHP 编程语言提供本机不可用的额外功能而创建的库。请参阅下面的示例,该示例演示了 cli,zip,mysql,bz2,curl,mbstring,intl,commonPHP 模块的安装
1
sudo apt install php8.2-{cli,zip,mysql,bz2,curl,mbstring,intl,common}
  • 可以使用以下命令语法安装任何其他模块
1
sudo apt install php8.2-<extension-name>

4.4、安装 php8.2-fpm

  • 使用 NginxPHP 代码通常由单独的进程执行,例如 PHP-FPM(FastCGI 进程管理器)。 PHP-FPM 是一个守护进程,用于侦听传入的 PHP 请求并在单独的进程中运行它们。 Nginx 充当反向代理,将传入请求转发到 PHP-FPM 来执行
1
sudo apt install php8.2-fpm
  • 安装 NginxFPM 扩展后,您需要配置 Nginx 以使用 FastCGI 协议将传入请求转发到 PHP-FPM。编辑 Nginx 配置文件并在 http 块中添加以下块,以配置 NginxPHP 请求转发到 PHP-FPM
1
sudo vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
server {
listen 80;
server_name mysite.example.com;
root /var/www/mysite;
index index.php index.html;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
#NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini,cgi.fix_pathinfo = 0; 用于禁用 Nginx 自动修正 CGI 脚本的 PATH_INFO 环境变量的行为。
include fastcgi_params;
fastcgi_intercept_errors on;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
#The following parameter can be also included in fastcgi_params file
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
  • 更改后验证 Nginx 配置
1
sudo nginx -t
  • 重载 Nginx 配置
1
sudo nginx -s reload

4.5、配置 php8.2-fpm

  • 确认 nginx 启动的用户,为 nginx
1
cat /etc/nginx/nginx.conf
1
id nginx
  • 编辑 usergrouplisten.ownerlisten.group 属性,改为与 nginx 启动相同的用户——即 nginx
1
sudo vi /etc/php/8.2/fpm/pool.d/www.conf
  • 将 cgi.fix_pathinfo 设置为 0 是一个安全最佳实践,特别是在与 Nginx 配合使用时。它可以有效地防止潜在的攻击,并提升性能。
1
sudo sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/8.2/fpm/php.ini
  • 重启 php8.2-fpm 服务
1
sudo systemctl restart php8.2-fpm
  • 确认 socket 用户已变更
1
ls -al /run/php/php8.2-fpm.sock
  • 设置 php-fpm 服务开机启动
1
sudo systemctl enable php8.2-fpm
  • 配置完成,验证输出应如下所示
1
2
3
4
5
6
7
8
9
10
11
root@iZj6cbu3y55faj33gzi8ybZ:~# grep '^user' /etc/nginx/nginx.conf
user nginx;
root@iZj6cbu3y55faj33gzi8ybZ:~# cat /etc/php/8.2/fpm/pool.d/www.conf | grep '^[^;]' | grep 'user\|group\|owner'
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
root@iZj6cbu3y55faj33gzi8ybZ:~# grep 'cgi.fix_pathinfo=' /etc/php/8.2/fpm/php.ini
cgi.fix_pathinfo=0
root@iZj6cbu3y55faj33gzi8ybZ:~# ls -alF /run/php/php8.2-fpm.sock
srw-rw---- 1 nginx nginx 0 Sep 21 01:09 /run/php/php8.2-fpm.sock=
  • 建立新站点的根目录
1
sudo mkdir -p /usr/share/nginx/html/test-www
  • 变更站点目录的所有者为 nginx 用户
1
sudo chown -R nginx:nginx /usr/share/nginx/html/test-www/
  • 确认根目录用户已变更
1
ls -al /usr/share/nginx/html/test-www/

五、安装 Certbot

5.1、安装 snapd

您需要安装 snapd 并确保按照任何说明启用经典 snap 支持

按照 snapcraft 网站上的这些说明安装 snapd

  • snap 可以直接从命令行安装
1
sudo apt update
1
sudo apt install snapd -y
  • 注销并重新登录,或重新启动系统,以确保 snap 的路径正确更新
1
reboot
  • 重新连接服务器之后,使用 Snap 包管理器安装 core
1
sudo snap install core

输出以下信息代表安装成功

1
core 16-2.45.2 from Canonical✓ installed

5.2、删除 certbot-auto 和任何 Certbot OS 软件包

1
sudo apt-get remove certbot

5.3、安装 Certbot

1
sudo snap install --classic certbot

5.4、准备 Certbot 命令

在机器的命令行上执行以下指令设置软链接,确保 certbot 命令可以运行

1
sudo ln -s /snap/bin/certbot /usr/bin/certbot

5.5、确认插件包含级别

在计算机上的命令行上运行此命令,以确认已安装的插件将具有与 Certbot snap 相同的包含。classic

1
sudo snap set certbot trust-plugin-with-root=ok

5.6、安装正确的 DNS 插件

如果您的 DNS 提供商是 Cloudflare,您需运行以下命令

1
sudo snap install certbot-dns-cloudflare

5.7、设置 DNS 凭据

使用此插件需要一个包含 Cloudflare API 凭证的配置文件,该文件可从您的 Cloudflare 仪表板获取

以前,Cloudflare全局 API 密钥 用于身份验证,但是此密钥可以访问您帐户中所有域的整个 Cloudflare API,这意味着如果泄露,它可能会造成很大的损害

Cloudflare 较新的 API 令牌可以限制为特定的域和操作,因此现在是推荐的身份验证选项

Certbot 所需的令牌仅需要您需要证书的区域的权限 Zone:DNS:Edit

  • root 用户文件夹下建一个 ~/.secrets/certbot/cloudflare.ini 文件
1
mkdir -p ~/.secrets/certbot
1
touch ~/.secrets/certbot/cloudflare.ini
1
vim ~/.secrets/certbot/cloudflare.ini
  • 使用受限 API 令牌的示例凭证文件(推荐)
1
2
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = hu3tMEMQmz6Ao8r-PmqVcxHtHmGjjneXjXQYga0O
  • 设置令牌文件权限
1
chmod 600 ~/.secrets/certbot/cloudflare.ini

600 权限意味着只有文件的所有者才具有对它的完全读写访问权限。一旦文件权限设置为 600,其他任何人都无法访问该文件。不设置的话,获证书的时候 Certbot 会红色错误提示。

5.8、运行 DNS 提供商说明的示例部分中的命令获取证书

1
certbot certonly --dns-cloudflare --dns-cloudflare-credentials ~/.secrets/certbot/cloudflare.ini -d test.ysbzcn.com --email 'email@ysbzcn.com'

参数详解:
certbot certonly 若要仅获取证书而不将其安装在任何位置,可以使用(“仅证书”)命令。
–dns-cloudflare-credentials Cloudflare credentials INI 文件。(必填)
-d 指定域名
–register-unsafely-without-email 不加这行命令会报错,加了就不会再有强制输入邮箱的提示,官方不推荐这样做。

5.9、测试自动续费

系统上的 Certbot 软件包附带一个 cron 作业或 systemd 计时器,它们将在证书过期之前自动续订证书。除非您更改配置,否则您无需再次运行 Certbot。您可以通过运行以下命令来测试证书的自动续订

1
sudo certbot renew --dry-run

5.10、确认 Certbot 工作正常

要确认您的网站设置正确,请在浏览器中访问并在 URL 栏中查找安全盾牌标志。