systemd template unit 是一種樣板服務 (service template),可以用同一份 unit 檔去啟動多個獨立的 service instance。當我們需要用同一個 service daemon 啟動多個 service instance 時,就可以透過這個方式,讓 service 對應到不同的設定檔,同時並存於一台機器中。
httpd
在 /usr/lib/systemd/system 目錄,除了 httpd.service,還有 httpd@.service。
@代表這個 unit 是一個「模板」。%i代表實例名稱 (instance name),會在啟動的時候被替換。
systemd template 支援一些 specifier,常見的有:
%i→ instance name (例如site1/site2)%I→ instance name,保持大小寫%n→ 完整的 unit name (httpd@site1.service)%p→ prefix name (httpd)
httpd@service 的內容是這樣
httpd@.service
# This is a template for httpd instances.
# See httpd@.service(8) for more information.
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd@.service(8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
service 會讀取 /etc/httpd/conf/%i.conf 設定檔,並將 pid 放在 /run/httpd/instance-%i
所以要產生兩個 httpd unit service 設定檔
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/site1.conf
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/site2.conf
修改 site1.conf 以下這些設定。site2.conf 就改另一個 Listen 8001,site1 改為 site2,去掉其他 Directory 的部分
Listen 8000
PidFile /run/httpd-site1.pid
DocumentRoot "/var/www/site1"
<Directory "/var/www/site1">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
ErrorLog "/var/log/httpd/site1_error.log"
CustomLog "/var/log/httpd/site1_access.log" combined
啟動
systemctl start httpd@site1
systemctl start httpd@site2
systemctl enable httpd@site1
systemctl enable httpd@site2
haproxy
如果是 haproxy,因為套件裡面沒有 unit service,我們需要自己製作一個
首先產生 /usr/lib/systemd/system/haproxy@.service 檔案
[Unit]
Description=HAProxy Load Balancer %i instance
After=network-online.target
Wants=network-online.target
[Service]
Environment="CONFIG=/etc/haproxy/%i.cfg" "PIDFILE=/run/haproxy-%i.pid" "CFGDIR=/etc/haproxy/conf.d.%i"
EnvironmentFile=/etc/sysconfig/haproxy.%i
ExecStartPre=/usr/sbin/haproxy -f $CONFIG -f $CFGDIR -c -q $OPTIONS
ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -f $CFGDIR -p $PIDFILE $OPTIONS
ExecReload=/usr/sbin/haproxy -f $CONFIG -f $CFGDIR -c -q $OPTIONS
ExecReload=/bin/kill -USR2 $MAINPID
SuccessExitStatus=143
KillMode=mixed
Type=notify
[Install]
WantedBy=multi-user.target
製作設定檔
cp /etc/sysconfig/haproxy /etc/sysconfig/haproxy.site1
cp /etc/sysconfig/haproxy /etc/sysconfig/haproxy.site2
製作 /etc/haproxy/sit1.cfg
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy-site1.pid
stats socket /var/run/haproxy.admin.sock mode 660 level admin
maxconn 50000
maxconnrate 100000
maxsessrate 100000
user haproxy
group haproxy
daemon
nbproc 1
ca-base /etc/pki/site1
crt-base /etc/pki/site1
tune.ssl.default-dh-param 2048
# turn on stats unix socket
stats socket /var/lib/haproxy/stats-site1
ssl-default-bind-options no-sslv3
ssl-default-bind-options no-sslv3 no-tlsv11 no-tlsv10
defaults
log global
mode http
option httplog clf
option forwardfor
option dontlognull
option httpchk
option http-keep-alive
retries 3
maxconn 50000
rate-limit sessions 20000
option http-server-close
timeout connect 1h
timeout client 1h
timeout server 1h
#timeout connect 5000
#timeout client 50000
#timeout server 50000
timeout tunnel 1h
frontend http_redirect
bind *:80
mode http
acl kill_it method TRACE
http-request deny if kill_it
redirect scheme https code 301 if !{ ssl_fc }
default_backend web_server
frontend https_switch
bind *:443 ssl crt server.pem ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384
mode http
option forwardfor
reqadd X-Forwarded-Proto:\ https
default_backend web_server
backend web_server
mode http
fullconn 50000
balance leastconn
option forwardfor
#cookie SERVERID insert indirect nocache
#cookie SESSIONID prefix indirect nocache
cookie SESSIONID prefix nocache
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
#option httpchk GET /
option httpchk *
server W01 localhost:8000 weight 10 check cookie W01 inter 5s rise 2 fall 3
製作另一個設定檔 /etc/haproxy/site2.cfg,注意要修改 bind port
然後注意,申請兩個 ssl 憑證,放到 /etc/pki/site1 跟 /etc/pki/site2
啟動
systemctl start haproxy@site1
systemctl start haproxy@site2
systemctl enable haproxy@site1
systemctl enable haproxy@site2