When using Varnish Cache in an Alpine Linux 3.11 container, I suddenly found out that the reload functionality does not work.
$ /etc/init.d/varnishd reload * Reloading varnish ... * varnishd cannot load configuration
The system log had the following entries:
Jul 14 06:55:08 varnish local0.info varnishd[22976]: CLI telnet 127.0.0.1 52642 127.0.0.1 6082 Rd vcl.load reload_2020-07-14T06:55:08 /etc/varnish/default.vcl Jul 14 06:55:08 varnish local0.info varnishd[22976]: CLI telnet 127.0.0.1 52642 127.0.0.1 6082 Wr 106 Illegal character in VCL name (':') Jul 14 06:55:08 varnish daemon.err /etc/init.d/varnishd[23713]: varnishd cannot load configuration
Illegal character in VCL name error was confusing to me: I know I didn’t use any colons in file names nor procedure names. To find out what is wrong< I looked at the init script.
reload()
function was
reload() { checkconfig || return 1 ebegin "Reloading varnish" $VARNISHADM vcl.list >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then eerror "${SVCNAME} cannot list configuration" return 1 fi new_config="reload_$(date +%FT%H:%M:%S)" $VARNISHADM vcl.load $new_config $CONFIGFILE >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then eerror "${SVCNAME} cannot load configuration" return 1 fi $VARNISHADM vcl.use $new_config >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then eerror "${SVCNAME} cannot switch configuration" return 1 fi eend 0 }
To see what exactly happens, I added set -x
to the function and ran /etc/init.d/varnishd reload
. The output was:
+ checkconfig + /usr/sbin/varnishd -C -f /etc/varnish/default.vcl + ret=0 + '[' 0 -ne 0 ] + return 0 + ebegin 'Reloading varnish' * Reloading varnish ... + /usr/bin/varnishadm vcl.list + ret=0 + '[' 0 -ne 0 ] + date '+%FT%H:%M:%S' + new_config=reload_2020-07-14T07:00:41 + /usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl + ret=1 + '[' 1 -ne 0 ] + eerror 'varnishd cannot load configuration' * varnishd cannot load configuration + return 1 + exit 1
And if you look at this line:
/usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl
You will see the colons. I reran that command manually, and got the error:
$ /usr/bin/varnishadm vcl.load reload_2020-07-14T07:00:41 /etc/varnish/default.vcl Illegal character in VCL name (':') Command failed with error code 106
OK, so the suspected issue is that the parameter to varnish.load contains colons. Let us try the same command but without colons:
$ /usr/bin/varnishadm vcl.load reload_2020-07-14T070041 /etc/varnish/default.vcl VCL compiled.
Issue confirmed. Now let us fix the code. What we need to change is the call to date +%FT%H:%M:%S
. We can replace it with date +%s
. The %s
format specifier means “seconds since 1970-01-01 00:00:00 UTC”.
Here is the patch:
--- /etc/init.d/varnishd.orig +++ /etc/init.d/varnishd @@ -58,7 +58,7 @@ return 1 fi - new_config="reload_$(date +%FT%H:%M:%S)" + new_config="reload_$(date +%s)" $VARNISHADM vcl.load $new_config $CONFIGFILE >/dev/null 2>&1 ret=$? if [ $ret -ne 0 ]; then