清漆DAEMON_OPTS选项错误

时间:2011-05-06 03:56:10

标签: daemon options varnish

当使用带有清漆的内联C时,我无法获得/ etc / varnish / default
在开始时很开心。

我已经测试了带有清漆的内联C两件事:GeoIP检测和Anti-Site-Scraping功能。

DAEMON_OPTS总是抱怨,即使我跟随其他人似乎在做什么 表明工作正常。

我的问题是这个命令行启动有效:

varnishd -f /etc/varnish/varnish-default.conf -s file,/var/lib/varnish/varnish_storage.bin,512M -T 127.0.0.1:2000 -a 0.0.0.0:8080 -p 'cc_command=exec cc -fpic -shared -Wl,-x -L/usr/include/libmemcached/memcached.h -lmemcached -o %o %s'

但尝试从默认启动脚本启动时出错:

/ etc / default / varnish中有这个:

DAEMON_OPTS="-a :8080 \
             -T localhost:2000 \
             -f /etc/varnish/varnish-default.conf \
             -s file,/var/lib/varnish/varnish_storage.bin,512M \
             -p 'cc_command=exec cc -fpic -shared -Wl,-x -L/usr/include/libmemcached/memcached.h -lmemcached -o %o %s'"

错误是:

# /etc/init.d/varnish start
Starting HTTP accelerator: varnishd failed!
storage_file: filename: /var/lib/varnish/vbox.local/varnish_storage.bin size 512 MB.
Error:
Unknown parameter "'cc_command".

如果我尝试将最后一行更改为:

-p cc_command='exec cc -fpic -shared -Wl,-x -L/usr/include/libmemcached/memcached.h -lmemcached -o %o %s'"

现在出现了错误:

# /etc/init.d/varnish start
Starting HTTP accelerator: varnishd failed!
storage_file: filename: /var/lib/varnish/vbox.local/varnish_storage.bin size 512 MB.
Error: Unknown storage method "hared"

它正试图解释“共享”。 as -s hared and' hared'不是存储类型。

对于GeoIP和Anti-Site-Scrape,我都使用了确切的推荐守护进程选项
加上尝试了各种各样的变化,比如添加\'和''但没有快乐。

除了DAEMON_OPTS部分之外,以下是我所遵循的指令的链接。该工作正常。
http://drcarter.info/2010/04/how-fighting-against-scraping-using-varnish-vcl-inline-c-memcached/

我正在使用Debian和说明中所述的确切DAEMON_OPTS。

任何人都可以帮忙指出这里出了什么问题吗?

非常感谢!

4 个答案:

答案 0 :(得分:10)

即使雅各布可能永远不会读到这一点,未来的访客也会欣赏我要写的内容。

我相信我知道什么是错的,它看起来像Debian特定的问题,至少在Ubuntu 11.04和Debian Squeeze上得到验证。

我将包含/etc/default/varnish的{​​{1}}的执行跟踪到init脚本。 在init脚本$DAEMON_OPTS中,/etc/init.d/varnish函数是:

start_varnishd() {
    log_daemon_msg "Starting $DESC" "$NAME"
    output=$(/bin/tempfile -s.varnish)
    if start-stop-daemon \
        --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
        -P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1; then
        log_end_msg 0
    else
        log_end_msg 1
        cat $output
        exit 1
    fi
    rm $output
}

所以我修改它以打印完整的start_varnishd()命令行,如:

 start_varnishd() {
    log_daemon_msg "Starting $DESC" "$NAME"
    output=$(/bin/tempfile -s.varnish)
+   echo "start-stop-daemon --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- -P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1"
    if start-stop-daemon \
        --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
        -P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1; then
        log_end_msg 0

所以我在STDOUT上回显了命令行,并将其复制粘贴到我的shell中。而且,惊喜!有效。的 WTF吗

再次重复以确定。是的,它有效。 MMH。它可能是那些bash / dash角落案件中的另一个吗? 让我们尝试将start-stop-daemon命令行提供给start-stop-daemon,看看它是如何反应的:

start_varnishd() {
    log_daemon_msg "Starting $DESC" "$NAME"
    output=$(/bin/tempfile -s.varnish)
    if bash -c "start-stop-daemon \
        --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
        -P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1"; then
        log_end_msg 0
    else
        log_end_msg 1
        cat $output
        exit 1
    fi
    rm $output
}

是的,它运作得很好,至少在我的情况下。 这是我bash的相关部分:

...
## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request.  Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :6081 \
             -T localhost:6082 \
             -f /etc/varnish/geoip-example.vcl \
             -S /etc/varnish/secret \
             -s malloc,100M \
             -p 'cc_command=exec cc -fpic -shared -Wl,-x -L/usr/include/GeoIP.h -lGeoIP -o %o %s'"
...

我见过有人试图通过将编译命令移动到单独的shell脚本来解决此问题的帖子。不幸的是,这并未改变/etc/default/varnishstart-stop-daemon var传递给$DAEMON_OPTS的事实,这将导致错位选项。

将有以下几点:

-p 'cc_command=exec /etc/varnish/compile.sh %o %s'"

然后dash脚本为:

#!/bin/sh
cc -fpic -shared -Wl,-x -L/usr/include/GeoIP.h -lGeoIP -o $@

但它不起作用,所以只需修改你的init脚本,你就可以了! 希望您能发现此信息有用。

答案 1 :(得分:0)

显然,解释DAEMON_OPTS的启动脚本没有为空格做准备(即使在单引号内)。在我的Fedora(15)安装中,建议的解决方案工作正常;参数得到正确解释,因为"$*" bash参数在/etc/init.d/varnish和daemon()中的/etc/init.d/functions中传递。

您是从包中获取启动脚本还是自定义脚本?

答案 2 :(得分:0)

这与问题没有直接关系,但如果您正在使用Varnish Tutorial - Put Varnish on port 80,则可能会发现自己在这里。

对于Debian系统上最近安装的Varnish,可以在/etc/systemd/system/multi-user.target.wants/varnish.service中找到varnishd启动选项的配置。记录的通过/etc/default/varnish更改端口的方法仍然存在,但除非您将系统更改为使用init脚本而不是systemd,否则不再有效。

/etc/systemd/system/multi-user.target.wants/varnish.service更改了您的选项后,请不要忘记运行systemctl daemon-reload,它会对执行程序的更改进行编目。

答案 3 :(得分:0)

您可以尝试使用: - DAEMON_OPTS =" -a:8080 \                                  -T localhost:2000 \                                  -f /etc/varnish/varnish-default.conf \                                 -s文件,/ var / lib / varnish / varnish_storage.bin,512M \                                 -p cc_command =' exec cc -fpic -shared -Wl,-x -L / usr / include / libmemcached / memcached.h -lmemcached -o%o%s'"