当使用带有清漆的内联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。
任何人都可以帮忙指出这里出了什么问题吗?
非常感谢!
答案 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/varnish
将start-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'"