我在 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