lon*_*nix 7 linux ubuntu systemd xinetd socket-activation
我使用xinetd并且它适用于我的目的。但是我最近发现 systemd 内置了称为“套接字激活”的东西。
这两个看起来非常相似,但 systemd 是“官方的”,似乎是更好的选择。
但是在使用之前,它们真的一样吗?我应该注意哪些差异?
例如,我只想在第一次请求时启动一些 dockerised 服务——我的第一个想法是使用 xinetd。但是套接字激活是否更好/更快/更稳定/无论如何?
Ste*_*itt 10
单独xinetd考虑时,我不认为 systemd 套接字激活明显优于激活;后者也很稳定,并且已经存在了更长时间。套接字激活对于服务解耦来说真的很有趣:它允许服务并行启动,即使它们需要通信,它允许服务独立重启。
如果你有一个支持xinetd-style 激活的服务,它可以与 socket 激活一起使用:.socket描述with 的Accept=true行为方式与xinetd. 您还需要一个.service文件来描述服务。systemd 套接字激活的全部好处需要提供服务的守护进程的支持。请参阅有关该主题的博客文章。
我的建议往往是“如果它没有损坏,就不要修复它”,但是如果您想将xinetd基于 -based 的服务转换为 systemd,这当然是可行的。
您可以使用xinetd或systemd用于套接字激活,两者都可以使用。我个人觉得xinetd更容易使用,因为所有内容都在一个文件中,但也systemd因为它更灵活,特别是在侦听多个地址和套接字转发到 UNIX 套接字而不仅仅是 IP 套接字时使用。
这里作为一个例子,我用来将 TCP 连接转发到 MySQL 文件套接字:
/etc/systemd/system/mysql-proxy.service
[Unit]
Description=MySql Proxy Service
Requires=mysql-proxy.socket
[Service]
Environment=MYSQL_PROXY_TARGET=/var/run/mysql/mysql.sock
EnvironmentFile=-/etc/sysconfig/mysql-proxy
ExecStart=/usr/lib/systemd/systemd-socket-proxyd ${MYSQL_PROXY_TARGET}
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/mysql-proxy.socket
[Unit]
Description=MySql Proxy Socket
[Socket]
ListenStream=192.168.1.1:3306
ListenStream=192.168.2.1:3306
NoDelay=true
FreeBind=true
[Install]
WantedBy=sockets.target
Run Code Online (Sandbox Code Playgroud)
传统的转发需求Accept=true,有systemd意识的进程应该在一个进程中处理多个连接或根据需要分叉额外的进程。