Althttpd

使用 Althttpd、Linode 和 Systemd 建立网站
登录

使用 Althttpd、Linode 和 Systemd 建立网站

以下是我最近(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 服务创建的文件非常相似。主要区别在于

创建完这两个文件后,运行

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 文档。本教程应该足以帮助您入门。