Лак DAEMON_OPTS Опции Ошибки - PullRequest
5 голосов
/ 06 мая 2011

При использовании встроенного C с Varnish я не смог получить / 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"

Этопопытка интерпретировать '-shared' как -s hared и '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 ]

10 голосов
/ 01 декабря 2011

Даже если Джейкоб, вероятно, никогда не прочтет это, посетители из будущего могут оценить то, что я собираюсь написать.

Мне кажется, я знаю, что не так, и похоже, что это проблема, специфичная для Debian, по крайней мере, проверенная в Ubuntu 11.04 и Debian Squeeze.

Я проследил выполнение от моего /etc/default/varnish, содержащего $DAEMON_OPTS, до сценария инициализации. В скрипте инициализации /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

Итак, я получил командную строку в STDOUT и скопировал ее в мою оболочку. И, сюрприз! Это сработало. WTF?

Повторяется снова, чтобы быть уверенным. Да, это работает. Ммм. Может быть, это еще один из тех случаев с bash / dash? Давайте попробуем ввести командную строку start-stop-daemon в 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'"
...

Я видел сообщения, в которых кто-то пытался обойти эту проблему, перемещая команду compile в отдельный скрипт оболочки. К сожалению, это не меняет того факта, что 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 $@

но это не работает, так что просто исправьте ваши сценарии инициализации, и все готово! Надеюсь, вы найдете эту информацию полезной.

0 голосов
/ 25 октября 2017

Вы можете попробовать использовать: - 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' "

0 голосов
/ 18 декабря 2015

Это не имеет прямого отношения к вопросу, но вы можете оказаться здесь, если вы работаете с Varnish Tutorial - Поместите Varnish на порт 80 .

Для последних установок Varnish в системах Debian конфигурацию для параметров запуска varnishd можно найти в /etc/systemd/system/multi-user.target.wants/varnish.service. Документированный способ изменения порта с помощью /etc/default/varnish все еще существует, но он больше не работает, если вы не измените свою систему на использование init сценариев вместо systemd.

После того, как вы изменили свои параметры в /etc/systemd/system/multi-user.target.wants/varnish.service, не забудьте запустить systemctl daemon-reload, в котором будут перечислены изменения для выполнения программы.

0 голосов
/ 16 октября 2011

Очевидно, ваш стартовый скрипт, интерпретирующий DAEMON_OPTS, не подготовлен для пробела (даже в одинарных кавычках).На моей установке Fedora (15) предлагаемое решение работает нормально;аргументы интерпретируются правильно, потому что параметр "$*" bash передается в /etc/init.d/varnish и в /etc/init.d/functions в daemon().

Получили ли вы сценарии запускаиз пакета или вы сделали собственные скрипты?

...