systemd에서 서비스를 실행하기 위한 단위 파일이 있습니다.
[Unit]
Description=Varnish HTTP accelerator log daemon
After=varnish.service
[Service]
User=root
Environment="LOG_FORMAT='\"%{X-Forwarded-For}i\" %u %t \"%r\" %s %b \"%{Referer}i\ %{User-agent}i\"'"
ExecStart=/usr/bin/varnishncsa -a -w /var/log/www/www.my_website_varnish.log -q "ReqHeader ~ '^Host: www.my_website.fr'" -F $LOG_FORMAT
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
보시다시피 변수에 로그 형식을 정의하고 이를 명령줄의 프로그램에 전달합니다. 이것은 작동하지 않습니다.
서비스를 시작하면 서비스를 호출하는 실제 명령줄은 다음과 같습니다.
CGroup: /system.slice/varnishncsa.service
└─60950 /usr/bin/varnishncsa -a -w /var/log/www/www.my_website_varnish.log -q ReqHeader ~ '^Host: www.my_website' -F "%{X-Forwarded-For}i" "root" /run "" /bin/sh ffd205c41b1e4c1088dac...
보시다시피 systemd는 명령줄을 통해 내 프로그램에 전달하기 전에 , 및 기타 %u
자체를 확장했습니다 %t
. %r
이것은 잘못된 것이며 사람들이 원하는 것이 아닙니다.
그만한 가치가 있으므로 아래 지침을 따르고 있습니다.https://wiki.deimos.fr/Nginx_%2B_Varnish_:_Cache_even_in_HTTPS_by_offloading_SSL바니시 세팅용. 그러나 문제는 Varnish 구성의 문제가 아니라 애초에 올바른 명령줄 인수를 사용하여 데몬을 실행하는 것이었습니다.
-F
그런데, 기본적으로 nginx의 IP 주소인 로그의 방문자 IP 주소로 127.0.0.1이 표시되기 때문에 변경 로그 형식을 사용하려고 합니다. 그러나 이것은 또 우연이었다. 명령줄의 다른 곳에서 백분율 기호와 변수를 사용하고 싶을 수도 있습니다.
ExecStart
프로그램 명령줄에서 항목을 지정하는 방법예방하다systemd는 백분율 기호가 있는 항목에 대해 자체 매개변수 확장을 수행합니까?
답변1
대답은 실제로 매우 간단합니다. 백분율 기호를 두 배로 늘려 매개변수화를 "이스케이프"합니다.
Environment="LOG_FORMAT='\"%{X-Forwarded-For}i\" %%u %%t \"%%r\" %%s %%b \"%{Referer}i\ %{User-agent}i\"'"
systemd의 매개변수 확장은 가 됩니다 %%
. %
이는 내 프로그램이 원하는 대로 작동하고 작동한다는 %%u
의미 입니다.%u
이 시간은지정자매뉴얼 페이지의 일부 systemd.unit
.
- 시스템 장치. 시스템 매뉴얼 페이지. freekdesktop.org.