Como substituir um bloco NGINX inteiro por sed?

1

Estou começando a aprender o script bash e preciso escrever um script para instalar o fastcgi_cache no NGINX. Eu preciso substituir o local padrão para o PHP com aquele com as configurações fastcgi_cache .

Para ser claro, preciso substituir isso:

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

Com isso:

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 ;
}

Acredito que isso pode ser feito com sed , mas não consigo encontrar uma maneira de fazer isso. Consegui fazê-lo funcionar com uma espécie de solução, assim:

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

Mas se o padrão fastcgi_params aparecer em qualquer outra parte do arquivo e, às vezes, pode quebrar tudo.

Acredito que procurar o bloco inteiro, que é o padrão e não deve mudar entre domínios, é uma solução melhor. Só não consigo descobrir como fazer isso.

    
por James Morningstar 21.10.2016 / 18:14

1 resposta

0

Isso deve funcionar para você.

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

Como mencionado nos posts acima. Esta não é uma solução de melhores práticas comparada a, digamos, um gerenciador de configuração, como Puppet, Ansible ou Salt.

Os resultados da execução dessas operações em um nginx.conf quebrado seriam imprevisíveis.

    
por 17.12.2017 / 14:17