Назад | Перейти на главную страницу

Как заменить весь блок NGINX на sed?

Я начинаю изучать сценарий bash, и мне нужно написать сценарий для установки fastcgi_cache на NGINX. Мне нужно заменить местоположение по умолчанию для PHP на местоположение с fastcgi_cache настройки.

Чтобы было ясно, мне нужно заменить это:

location ~ \.php$ {
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

С этим:

location ~ .php$ {
    fastcgi_pass   unix:/var/run/php5-fpm.sock ;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;

    access_log     /var/log/nginx/$SITE_URL.cache.log cache;
    fastcgi_cache_key "$mobile$scheme$request_method$host$request_uri";
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    fastcgi_cache WORDPRESS;
    add_header X-Cache-Status $upstream_cache_status ;
}

Я считаю, что это можно сделать с sed, но я не могу найти способ сделать это. Мне удалось заставить его работать с помощью своего рода обходного пути, например:

if [ -f "/etc/nginx/sites-enabled/$SITE_URL" ]
    then
        sed -i.bak '/fastcgi_params;/c\
        include        fastcgi_params;\
        \
        access_log     /var/log/nginx/'$SITE_URL'.cache.log cache;\
        fastcgi_cache_key "$mobile$scheme$request_method$host$request_uri";\
        fastcgi_cache_bypass $skip_cache;\
        fastcgi_no_cache $skip_cache;\
        fastcgi_cache WORDPRESS;\
        add_header X-Cache-Status $upstream_cache_status;' /etc/nginx/sites-enabled/$SITE_URL
    else
        echo ""
        echo "This domain do not exist on this server."
        echo ""
        exit 1
fi

Но если fastcgi_params шаблон появляется в любой другой части файла, и иногда он может сломать все.

Я предполагаю, что поиск всего блока, который установлен по умолчанию и не должен меняться между доменами, является лучшим решением. Просто не могу понять, как это сделать.

Это должно сработать для вас.

sed -i '/location.*php/{:a;N;/fastcgi_pass/{N;N;d};/  }/b;ba}' <filename>
cat >> <filename> << EOF
location ~ .php$ {
    fastcgi_pass   unix:/var/run/php5-fpm.sock ;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
    access_log     /var/log/nginx/$SITE_URL.cache.log cache;
    fastcgi_cache_key "$mobile$scheme$request_method$host$request_uri";
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    fastcgi_cache WORDPRESS;
    add_header X-Cache-Status $upstream_cache_status ;
}
EOF

Как упоминалось в вышеупомянутых сообщениях ... Это не лучшее решение по сравнению, скажем, с диспетчером конфигурации, таким как Кукольный, Ansible или Поваренная соль.

Результаты выполнения этих операций на сломанном nginx.conf, было бы непредсказуемо.