2011-05-06 56 views
5

將內聯C與varnish結合使用時我無法在啓動時獲得/ etc/varnish/default
很高興。Varnish DAEMON_OPTS選項錯誤

我已經測試了內聯C與清漆的兩件事:GeoIP檢測和反現場刮擦功能。

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 /默認/清漆這是:

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" 

它試圖解釋「-shared」作爲-s hared和「hared」不是存儲類型。

對於GeoIP和Anti-Site-Scrape,我使用了精確推薦的守護進程選項
plus已嘗試各種各樣的變化,如添加\'和''但沒有喜悅。

這裏是一條鏈接,我遵循的工作很好,除了DAEMON_OPTS部分。
http://drcarter.info/2010/04/how-fighting-against-scraping-using-varnish-vcl-inline-c-memcached/

我使用Debian和作爲在說明中規定的確切DAEMON_OPTS。

任何人都可以幫助一個指針什麼是錯的?

非常感謝!

回答

0

顯然,解釋DAEMON_OPTS的啓動腳本沒有準備好空格(即使在單引號內)。在我的Fedora(15)安裝中,建議的解決方案工作正常;參數被正確解釋,因爲"$*" bash參數在/etc/init.d/varnish中傳遞,在/etc/init.d/functions中在daemon()中傳遞。

您是從包中獲得啓動腳本還是製作自定義腳本?

9

即使雅各可能永遠不會讀這個,未來的訪客可能會明白我要寫什麼。

我相信我知道什麼是錯的,它看起來像一個特定於Debian的問題,至少在Ubuntu 11.04和Debian Squeeze上驗證過。

我將包含$DAEMON_OPTS/etc/default/varnish的執行追溯到init腳本。 在init腳本/etc/init.d/varnish,該start_varnishd()功能是:

 
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-stop-daemon命令行,如:

 
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 

所以我有一個命令行迴盪在標準輸出上,並將其複製粘貼到我的外殼中。而且,驚喜!有效。 WTF?

重複一次以確保。是的,它的工作原理。 MMH。它可能是另一個bash /短跑角落案件? 讓我們嘗試啓動停止守護進程的命令行餵養bash,看看它是如何反應:

 
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 
} 

是,它工作得很好,至少對於我的情況。 這裏是我的/etc/default/varnish相關部分:

 
... 
## 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腳本來解決此問題。不幸的是,這並沒有改變start-stop-daemon將通過$DAEMON_OPTS var通過dash這一事實,並且這將導致錯誤的選項。

將沿着線的東西:

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

然後是compile.sh腳本:

 
#!/bin/sh 
cc -fpic -shared -Wl,-x -L/usr/include/GeoIP.h -lGeoIP -o [email protected] 

,但它不工作,所以只是修補init腳本,和你」很好去! 希望你能找到這個有用的信息。

+0

可能有一個特殊的語法或解決方法,以使這項工作也在破折號。不幸的是,我對短跑不太瞭解。 – cosimo 2011-11-30 21:45:30

+0

也許看看這個吧? HTTP://計算器。com/questions/1661193/start-stop-daemon-quoted-arguments-mispludedted – nicomen 2011-11-30 21:54:54

+1

我不得不說我不明白在故事結尾處提出的解決方案是什麼......: - | – cosimo 2011-11-30 22:14:55

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,它將編目執行程序的更改。

0

您可以嘗試使用: - DAEMON_OPTS =「 - 一:8080 \ -T本地主機:2000 \ -f /etc/varnish/varnish-default.conf \ -s文件/ var/lib中/清漆/ varnish_storage.bin,512M \ -p cc_command = 'EXEC立方厘米-fpic -shared -Wl,-x -L/USR /包括/ libmemcached/memcached.h -lmemcached -o%0%s' 的」