Eu tenho um cenário incomum em que desejo que um serviço Apache seja executado como um usuário sem privilégios; isso está escutando em uma porta não raiz (8000+). Estou funcionando, mas tenho alguns problemas com o serviço systemd personalizado que criei para gerenciá-lo.
Aqui está a unidade de serviço:
[Unit]
Description=Apache Modperl service for {user}
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User={user}
Group={user}
Environment=LANG=C
PIDFile={Apache pid file, accessible by user}
ExecStart=/usr/sbin/httpd -f {config file}
ExecReload=kill -USR1 $MAINPID
# Send SIGWINCH for graceful stop
KillSignal=SIGWINCH
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Iniciar/parar o serviço funciona bem, mas ao recarregar, qualquer problema na configuração faz com que todo o processo morra. Eu não quero que ele morra, mas em vez disso, mantenha o processo antigo em execução com a configuração anterior (assim como o serviço httpd padrão quando você recarrega uma configuração que não funciona).
Para referência, isso está no Oracle Linux 8 e aqui está a unidade de serviço httpd padrão (root) que usei como modelo:
[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
[Install]
WantedBy=multi-user.target
Não sei se deveria usar type notify
em vez de forking
, mas quando tento usar notify
, a inicialização do serviço falha com esta mensagem no journalctl:
Failed with result 'protocol'.
Não recebo nenhum problema de permissão ou outras mensagens mais detalhadas ao tentar usar o tipo notify
.
Retirado de: Noções básicas sobre unidades e arquivos de unidade do Systemd :
contra
Adivinhando a falha aqui, mas eu examinaria o que está contido em
httpd-init.service
Você não podenotify
o sistema cujo serviço concluiu a inicialização, pois o serviço Apache original de propriedaderoot
já foi concluído. Acredito que a cópia do usuário também deve escutar em um número de porta diferente de 80. Você interrompe esse serviço antes de iniciar o serviço controlado pelo usuário? Você também pode verificar a sintaxe do seu arquivo de configuração em relação ao original.