我有这个单元文件用于在 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
顺便说一句,我正在尝试使用 更改日志格式,因为默认情况下我在日志中获取 127.0.0.1 作为访问者 IP 地址,这是 nginx 的 IP 地址。但这又是偶然的。我可能想在命令行的其他地方使用百分号和变量。
如何在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。