Вопрос или проблема
У меня есть следующий блок.
location /api {
proxy_pass http://localhost:8080;
}
location /oauth2 {
proxy_pass http://localhost:8080;
}
location /login {
proxy_pass http://localhost:8080;
}
Я хочу добавить новую строку после proxy_pass, но только в разделе /api:
location /api {
proxy_pass http://localhost:8080;
proxy_read_timeout 300;
proxy_connect_timeout 300;
proxy_send_timeout 300;
}
location /oauth2 {
proxy_pass http://localhost:8080;
}
location /login {
proxy_pass http://localhost:8080;
}
Мне тяжело правильно настроить регулярное выражение.
Полууспешные попытки:
sed -re '/[[:space:]]proxy_pass http:\/\/localhost:8080;/a\ proxy_read_timeout 300;' nginx.con
^^^ Это добавляет read_timeout к каждой строке, содержащей директиву proxy_pass, очевидно, поэтому я пытался добавить вариации \r или \n или \r\n или [[:space:]]+ в начале – безуспешно.
Пытался пойти другим путем с чем-то вроде:
sed '/location \/api {\n\s+proxy_pass.*/a proxy_read_timeout 300' nginx.conf
но там тоже не удалось
Может кто-нибудь подсказать полезный совет?
Вызов принят.
Попробуйте эту команду:
sed 'N;/location \/api.*proxy_pass http:\/\/localhost:8080;/a \ proxy_read_timeout 300;\n proxy_connect_timeout 300;\n proxy_send_timeout 300;\n' nginx.conf
Волшебные ключевые слова:
- ‘N’ в начале вашего запроса sed, который говорит sed сопоставлять несколько строк.
- ‘/a’, который говорит sed добавить новую строку после вашего соответствия.
И кроме того, добавление правильных пробелов для соответствия вашей индентации 🙂
ИЗМЕНЕНИЕ: Второе предложение.
sed 'N;/location \/api.*proxy.*$/a \ proxy_read_timeout 300;\n proxy_connect_timeout 300;\n proxy_send_timeout 300;\n' nginx
Ответ или решение
Для решения задачи добавления новых строк после директивы proxy_pass
исключительно в секции location /api
в файле nginx.conf
, необходимо использовать команду sed
с учетом особенностей работы с многострочными шаблонами. Следует обратить внимание на синтаксис и использование регулярных выражений, чтобы корректно задать нужные условия.
Решение с использованием sed
Предлагаю следующую команду sed
, которая позволяет корректно добавить необходимые строки с тайм-аутами:
sed '/location \/api/,/}/ {
/proxy_pass http:\/\/localhost:8080;/a \
proxy_read_timeout 300; \
proxy_connect_timeout 300; \
proxy_send_timeout 300;
}' nginx.conf
Объяснение команды
-
Определение диапазона:
/location \/api/,/}/
– этот фрагмент указываетsed
на работу с блоком, начинающимся сlocation /api
и заканчивающимся закрывающей фигурной скобкой}
. Это гарантирует, что все операции будут проходить только в пределах этого блока. -
Поиск строки:
/proxy_pass http:\/\/localhost:8080;/
– здесь мы ищем строку с директивойproxy_pass
, чтобы убедиться, что мы находимся именно в нужном месте. -
Добавление строк:
a \ ...
– это команда добавления. После найденной строкиproxy_pass
добавляются три новых строки с таймаутами. Каждый новый элемент следует указывать на новой строке, с обязательным добавлением символа\
для продолжения команды на следующую строку.
Запуск команды
Для выполнения команды сохраните изменения в новом файле, чтобы не потерять оригинал:
sed '/location \/api/,/}/ {
/proxy_pass http:\/\/localhost:8080;/a \
proxy_read_timeout 300; \
proxy_connect_timeout 300; \
proxy_send_timeout 300;
}' nginx.conf > nginx_updated.conf
Теперь в nginx_updated.conf
будут содержаться все оригинальные данные, включая новые директивы таймаута только в блоке location /api
.
Подводя итоги
Данный способ позволяет избежать внесения изменений в другие секции конфигурационного файла, сохраняя целостность и корректность конфигурации. Регулярные выражения в сочетании с возможностями sed
дают мощный инструментарий для манипуляции текстом и изменения конфигурационных файлов. Важно тщательно тестировать изменения, чтобы гарантировать правильную работу вашего веб-сервера после внесения изменений.