![HAProxy 手动运行时运行良好,但作为 Systemd 服务无法加载 SSL pem 文件](https://linux22.com/image/1465851/HAProxy%20%E6%89%8B%E5%8A%A8%E8%BF%90%E8%A1%8C%E6%97%B6%E8%BF%90%E8%A1%8C%E8%89%AF%E5%A5%BD%EF%BC%8C%E4%BD%86%E4%BD%9C%E4%B8%BA%20Systemd%20%E6%9C%8D%E5%8A%A1%E6%97%A0%E6%B3%95%E5%8A%A0%E8%BD%BD%20SSL%20pem%20%E6%96%87%E4%BB%B6.png)
我正在尝试在运行 HAProxy 的 Fedora 22 服务器上设置 SSL。以下是配置(/etc/haproxy/haproxy.cfg
):
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option httplog
option dontlognull
option http-server-close
option forwardfor
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
frontend main
bind *:80
bind *:443 ssl crt /etc/haproxy/certificate.pem
redirect scheme https if !{ ssl_fc }
default_backend app
backend app
balance roundrobin
server app1 127.0.0.1:8000 check
现在,当我运行时systemctl restart haproxy && journalctl -u haproxy.service -f
,出现此错误:
Sep 13 15:39:31 fedora-server systemd[1]: Started HAProxy Load Balancer.
Sep 13 15:39:31 fedora-server systemd[1]: Starting HAProxy Load Balancer...
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : parsing [/etc/haproxy/haproxy.cfg:30] : 'bind *:443' : unable to load SSL private key from PEM file '/etc/haproxy/certificate.pem'.
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Proxy 'main': no SSL certificate specified for bind '*:443' at [/etc/haproxy/haproxy.cfg:30] (use 'crt').
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: [ALERT] 255/153931 (15621) : Fatal errors found in configuration.
Sep 13 15:39:31 fedora-server haproxy-systemd-wrapper[15620]: haproxy-systemd-wrapper: exit, haproxy RC=256
这是服务配置:
# cat /usr/lib/systemd/system/haproxy.service
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
EnvironmentFile=/etc/sysconfig/haproxy
ExecStart=/usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
[Install]
WantedBy=multi-user.target
但是,我可以复制服务尝试运行的命令,并且它可以正常工作。
首先,当我手动运行它时,它是有效的(取自服务配置):
# whoami
root
# /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
这也有效(取自服务日志,显然haproxy-systemd-wrapper
运行这个:
# whoami
root
# /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
需要澄清的是:当我以 root 身份手动运行这些命令时,它们可以正常工作,并且我可以通过 SSL 访问我的网站。
因此,我假设当作为服务运行时,HAProxy 无法读取证书。
以下是我迄今为止尝试过的方法:
chown haproxy:haproxy /etc/haproxy/certificate.pem
- 将用户和组切换为 root
haproxy.cfg
- 将
User=root
和添加Group=root
到服务配置下[Service]
sudo -u haproxy /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
给出了不同的错误(关于端口),因此很可能该服务未使用用户 haproxy,否则会得到进一步
我可以以用户 haproxy 身份访问该文件sudo -u haproxy cat /etc/haproxy/certificate.pem
。
编辑:
以下是根据您的回答更新的服务配置:
[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
SELinuxContext=unconfined_u:object_r:var_t:s0
现在发生了什么:
Sep 13 17:51:21 ServiceName systemd[1]: Starting HAProxy Load Balancer...
Sep 13 17:51:21 ServiceName systemd[1]: haproxy.service: main process exited, code=exited, status=203/EXEC
Sep 13 17:51:21 ServiceName systemd[1]: Unit haproxy.service entered failed state.
Sep 13 17:51:21 ServiceName systemd[1]: haproxy.service failed.
我如何获得价值SELinuxContext
:
# ls -lZ /etc/haproxy/certificate.pem
-rw-r--r--. 1 root root unconfined_u:object_r:var_t:s0 9245 Sep 13 17:43 /etc/haproxy/certificate.pem
答案1
你使用的是 Fedora,它使用SELinux. Systemd 服务在干净的环境中运行 - 它们不是由 systemctl 直接生成 - 因此除其他外,它们在不同的 SELinux 上下文中启动(我认为默认是system_u:system_r:init_t:s0
?)。
确保设置了正确的 SELinux 上下文,包括证书文件(使用ls -lZ
和chcon
)和 haproxy 进程(可能SELinuxContext=
在 systemd 单元中使用)。
尝试运行id
以查看您(或服务)的当前上下文。