使用 systemd 套接字激活按需启动 Apache

使用 systemd 套接字激活按需启动 Apache

我在 Debian 11 上有一个很少使用的本地网站,所以我想我可能想在访问该网站时使用 systemd 套接字激活来启动 Apache,然后在几分钟不活动后关闭。

在 Debian 上安装 apache 后,我使用 停止并禁用服务systemctl disable --now apache2.service,然后/etc/systemd/system/apache2.socket使用以下内容创建,使用 重新加载 systemd systemctl daemon-reload,并使用 启动套接字systemctl start systemd.socket

[Unit]
Description=Apache Server Socket

[Socket]
ListenStream=80

[Install]
WantedBy=sockets.target

我可以确认 systemd 确实在监听,并且访问网站时 apache 已启动,但它会立即停止并出现错误

apachectl[2794]: (98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
apachectl[2794]: (98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80

根据回答它应该有效。

答案1

您可以将 systemd 套接字激活与 Apache 2.4 结合使用。Fedora 软件包默认提供此配置;您只需将systemctl enable httpd.socket其替换为即可systemctl enable httpd.service

此示例来自 Fedora 37,其中包含 Apache 2.4.55。

套接字文件如下所示:

[Unit]
Description=Apache httpd Server Socket
Documentation=man:httpd.socket(8)

[Socket]
ListenStream=80
NoDelay=true
DeferAcceptSec=30

[Install]
WantedBy=sockets.target

并且服务单元只是标准httpd.service

[Unit]
Description=The Apache HTTP Server
Wants=httpd-init.service
After=network.target remote-fs.target nss-lookup.target httpd-init.service
Documentation=man:httpd.service(8)

[Service]
Type=notify
Environment=LANG=C

ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
OOMPolicy=continue

[Install]
WantedBy=multi-user.target

有了这个,当我激活套接字(systemctl start httpd.socket)时,没有任何httpd进程正在运行:

# ps -fe |grep httpd
root        1303     944  0 15:11 pts/0    00:00:00 grep --color=auto httpd
#

但是 systemd 正在监听端口 80:

# ss -tlnp | grep :80
LISTEN 0      4096               *:80              *:*    users:(("systemd",pid=1,fd=52))

如果我连接到套接字:

# curl localhost

我可以看到 Apache 现在正在处理连接:

[root@localhost system]# ps -fe | grep httpd
root        1309       1  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      1310    1309  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      1311    1309  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      1312    1309  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
apache      1313    1309  0 15:12 ?        00:00:00 /usr/sbin/httpd -DFOREGROUND
root        1494     944  0 15:13 pts/0    00:00:00 grep --color=auto httpd

相关内容