Как сделать заменить весь блок 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 появится в любой другой части файла, а иногда может, он сломает все.

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

1
задан 17 December 2017 в 10:58
1 ответ

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

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

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

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

1
ответ дан 3 December 2019 в 23:39

Теги

Похожие вопросы