以下是我最近(2024-01-16)使用 althttpd、Let's Encrypt 和 systemd 在廉价的 Linode VPS 上建立网站的笔记。
如果您对本文档有任何建议或错误报告,请在论坛上发布消息。
1.0 设置 Linode 帐户并启动 VPS
在 Linode 创建一个帐户并启动一个新的 VPS。您可以每月最低 5 美元的价格获得它们。在本示例中,我使用了一个每月 12 美元的 Linode,这可能有点过分。我可能会在某个时候降级到每月 5 美元的计划。
我选择了 Ubuntu 23.10 作为操作系统,因为这是当时最新的可用 Ubuntu 版本。使用您更熟悉的其他任何 Linux 发行版。
2.0 注册您的域名
我构建的系统使用的是我已拥有域名的子域名,因此我不必购买新的域名。如果不是这种情况,请立即购买域名。有关如何执行此操作的详细信息超出了本文档的范围,但网络上有许多优秀的教程。
将您的域名指向 Linode 域名服务器。根据您的操作,进行所需的任何 DNS 条目。Linode 为此提供了一个出色且易于使用的界面。
3.0 初始系统配置
以 root 用户身份登录您的 VPS。我需要按如下所示升级和安装新软件
apt update apt upgrade apt install letsencrypt
4.0 创建 Web 服务器用户和主目录
应该已经存在一个名为“www-data”的用户。(检查 /etc/passwd 文件。)这是我用于 Web 服务的用户。
我还手动编辑了 /etc/passwd 文件,将用户 www-data 的默认 shell 从 /usr/bin/nologin 更改为 /bin/bash。此更改允许我运行“su www-data
”命令以成为 www-data 用户,同时修改属于该用户的文件。但此步骤完全可选。
为该用户在 /home/www 创建一个主目录。创建一个子目录 /home/www/default.website。将子目录的所有者更改为 www-data。命令序列如下
mkdir -p /home/www/default.website chown www-data /home/www/default.website
创建一个名为 /home/www/default.website/index.html 的文件,该文件可由 www-data 用户读取,并放置一些 HTML 内容作为占位符。也许类似于此
<h1>Hello, World</h1> <p>If you can see this, that means the web server is running.</p>
添加您想要的任何其他内容。但是,请注意,设置了执行权限位的文件将作为 CGI 运行。因此,请确保 *.website 文件夹或任何子文件夹中的任何文件都不可执行,除非您确实打算将它们作为 CGI 运行。
5.0 构建 althttpd 的二进制文件
我在我的桌面 Linux 计算机上构建了一个静态链接的 althttpd 二进制文件(使用这些说明),并使用 scp 将静态二进制文件传输到 VPS。将静态二进制文件安装在 /usr/bin/althttpd
6.0 HTTP 服务的 Systemd 设置
您需要先启动简单的 HTTP(未加密)服务,因为这是从 Let's Encrypt 获取证书的先决条件。在 /etc/systemd/system/http.socket 创建一个文件,内容如下
[Unit] Description=HTTP socket [Socket] Accept=yes ListenStream=80 NoDelay=true [Install] WantedBy=sockets.target
然后创建另一个名为 /etc/systemd/system/[email protected] 的文件,内容如下
[Unit] Description=HTTP socket server After=network-online.target [Service] WorkingDirectory=/home/www ExecStart=/usr/bin/althttpd -root /home/www -user www-data StandardInput=socket [Install] WantedBy=multi-user.target
文件名中的“@”不是错字。似乎出于某种原因,systemd 需要它。我不知道细节。
最后,使用以下命令序列启动新服务
systemctl daemon-reload systemctl enable http.socket systemctl start http.socket
此时,您应该能够将 Web 浏览器指向 VPS 的 80 端口,并看到您在步骤 4.0 结束时安装的占位符 HTML。您还可以使用以下命令检查服务的运行状态或将其关闭
systemctl status http.socket systemctl stop http.socket
7.0 获取 Let's Encrypt 证书
您需要证书才能使用 HTTPS。使用类似于以下命令的命令获取一个
letsencrypt certonly --webroot -w /home/www/default.website -d your-domain.org
当然,将您的实际域名替换为“your-domain.org
”。如果您希望您的 Web 服务器服务多个域名,可以使用多个“-d”选项。有关详细信息,请参阅 letsencrypt 文档。
我相信此命令会进行设置,以便该域名会自动续订。您不应该再需要运行此命令。如果我后来发现自己错了,我会回来更正本段。
您的证书将位于名为以下内容的文件中
/etc/letsencrypt/live/your-domain.org/fullchain.pem /etc/letsencrypt/live/your-domain.org/privkey.pem
您应该确保“privkey.pem”文件保持安全。这是您的私钥。这是 Web 服务器用于向陌生人验证服务器身份的内容。
8.0 激活 HTTPS
现在您拥有了证书,您可以进行其他 systemd 配置条目以服务到达 443 端口的 TLS HTTPS 请求。首先创建一个名为 /etc/systemd/system/https.socket 的文件,内容如下
[Unit] Description=HTTPS socket [Socket] Accept=yes ListenStream=443 NoDelay=true [Install] WantedBy=sockets.target
然后创建另一个名为 /etc/systemd/system/[email protected] 的文件,内容如下
[Unit] Description=HTTPS socket server After=network-online.target [Service] WorkingDirectory=/home/www ExecStart=/usr/bin/althttpd -root /home/www -user www-data -cert /etc/letsencrypt/live/your-domain.org/fullchain.pem -pkey /etc/letsencrypt/live/your-domain.org/privkey.pem StandardInput=socket [Install] WantedBy=multi-user.target
这两个文件与步骤 6.0 中为 HTTP 服务创建的文件非常相似。主要区别在于
- 文件名是“
https
”而不是“http
”。 - TCP 端口是 443 而不是 80
- althttpd 命令具有额外的 -cert 和 -pkey 参数来识别您的证书。
创建完这两个文件后,运行
systemctl daemon-reload systemctl enable https.socket systemctl start https.socket
完成后,您应该能够使用 TLS 加密连接浏览您的网站。
9.0 记录 Web 流量
如果您想记录您的 Web 流量(建议),创建一个名为 /home/www/log 的新目录,并将所有者更改为 www-data。然后编辑步骤 6.0 和 8.0 中创建的 *.service 文件,将“--log /log/http.log
”添加到“ExecStart=...
”行。
请注意,文件名是“/log/http.log”,而不是“/home/www/log/http.log”。这是因为 althttpd 会在执行任何其他操作之前对 /home/www 目录进行 chroot 操作。这是一项安全功能,可以防止 CGI 脚本或其他内容中的错误损害您的系统。由于进行了 chroot,从 althttpd 的角度来看,“/home/www/log/http.log”文件实际上将被称为“/log/http.log”。
进行这些更改后,运行
systemctl restart http.socket systemctl restart https.socket
10.0 其他配置更改
现在您可以调整其他配置更改。添加“--ipshun /ipshun
”之类的选项建议用于帮助压制恶意蜘蛛。您可能还想在“/home/www”下添加新的“*.website”文件夹,用于特定域名。有关指导和建议,请参阅其他 althttpd 文档。本教程应该足以帮助您入门。