Я бы определенно сделал это с помощью Nginx reverse proxy.
Вы можете установить nginx на той же машине, что и ваш сервер apache, и настроить его на перенаправление запросов на вторичный сервер на основе url.
В этом примере apache был (ранее) настроен на обслуживание example.com на порту 8080, в то время как edu.example.com обслуживается на x.x.x.100:80
server {
server_name example.com;
# app1 reverse proxy follow
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://127.0.0.1:8080;
}
server {
server_name edu.example.com;
# app2 reverse proxy settings follow
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://x.x.x.100:80;
}
Вам, вероятно, потребуется расширить пример с определениями для журналов доступа и ошибок.
Еще одно большое преимущество, которое дает такая настройка - это разгрузка SSL/TLS: вы можете заставить бэкенды apache обслуживать простой http, а nginx - https с поддержкой SSL/TLS, таким образом, у вас будут все сертификаты на одном сервере, что значительно упрощает и упрощает его обслуживание.
Не существует такой вещи, как grep --porcelain
, обработка специальных символов в именах файлов всегда была в UNIX второстепенной задачей. Вы можете попробовать что-то вроде этого, но ценой эффективности:
pattern='some pattern'
for file in ./*; do
grep -- "$pattern" "$file" | while read -r line; do
printf 'file: %s, line: %s\n' "$file" "$line"
done
done
Последние (-ish) версии GNU grep имеют параметр -Z
, который делает вывод однозначным, но в основном предназначен для использования вроде grep -lZ… | xargs -0
. Он по-прежнему работает, если вы перечисляете содержимое строки, нулевой байт заменяет двоеточие, а содержимое строки по-прежнему заканчивается новой строкой¹, но оболочки не умеют работать с нулевыми байтами, поэтому вам будет сложно разобрать этот вывод .
Одно простое решение (с небольшим снижением производительности) - запускать команду grep для каждого файла отдельно.
Другое решение - использовать такой язык, как Perl или Python. Perl неплохо эмулирует grep; grep REGEX
в основном представляет собой perl -ne '/ REGEXP / и print'
.
Но вам это может вообще не понадобиться, если результат на самом деле неоднозначен. Например, если совпадающие строки не содержат двоеточия, тогда имя файла - это все в строке до последнего двоеточия.Если все совпадающие строки начинаются с SUCCESS
или FAILURE
и эти слова не появляются в именах файлов, вы можете использовать это, чтобы найти разделение и т. Д.
¹ ] За исключением случаев, когда используется -z
для фильтрации записей с завершающим нулем, а не с записями с завершением новой строки, тогда NULL является как ограничителем имени файла, так и указателем конца результата; без -o
вывод по-прежнему однозначный, с чередующимися записями вывода, являющимися именами файлов, и совпадающими записями в выводе.
Как безопасно использовать вывод grep в сценарии?
... Вывод может быть в любом виде структуры данных, пока я могу выполнять над ним код.
Shell-скрипты не имеют структур данных. Есть массивы, но это все, и не так-то просто безопасно перевести вывод в массив. (Имена файлов могут содержать новые строки.)
Лучший способ выполнить код над файлами в сценарии оболочки - это просто выполнить код над файлами - не пытаясь сохранить имена файлов для последующего использования.
Чтобы сделать это, используйте find
:
find somedir -type f -exec grep -q somepattern {} \; -exec somecommand {} \;
Однако, прочитав ваш вопрос более внимательно, похоже, что вы не хотите выполнять код над вашими файлами, вы просто хотите выполнить некоторую обработку текста в определенных строках. В этом случае опция GNU Grep -z
, вероятно, то, что вам нужно. Это, а также знание Sed или Awk, поможет решить ваш вопрос.
Возможно, имеет смысл изменить соглашение об именовании файлов.