다음과 같은 nginx 구성 파일이 있습니다.
server {
listen 80;
server_name localhost;
location /api/test {
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 10M;
client_body_buffer_size 100M;
proxy_pass http://demo.com/;
}
location /api/demo {
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 10M;
client_body_buffer_size 100M;
proxy_pass http://demo2.com/;
}
}
쉘에서 첫 번째 Proxy_pass를 url1로 바꾸고 두 번째 Proxy_pass를 url2로 바꾸려면 어떻게 해야 합니까? 이것은 다음과 같은 쉘 스크립트입니다.
#!/usr/bin/env bash
set -u
set -e
set -x
echo "please input url1:"
read URL1
echo "$URL1"
echo "plase input url2:"
read URL2
echo "$URL2"
sed -E "12s/.*proxy\_pass.*/proxy\_pass:$URL1/" nginx.conf
sed -E "22s/.*proxy\_pass.*/proxy\_pass:$URL2/" nginx.conf
이제 문제가 생겼습니다. sed는 원본 파일을 수정하지 않고 터미널에 URL만 출력합니다. 원본 구성 파일을 수정하려면 어떻게 해야 합니까? 나는 다음과 같은 것을 원합니다( 입력 www.google.com;
합계 www.facebook.com;
).
server {
listen 80;
server_name localhost;
location /api/test {
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 10M;
client_body_buffer_size 100M;
proxy_pass www.google.com;
}
location /api/demo {
proxy_connect_timeout 3000;
proxy_send_timeout 3000;
proxy_read_timeout 3000;
send_timeout 3000;
client_max_body_size 10M;
client_body_buffer_size 100M;
proxy_pass www.facebook.com;
}
}
답변1
sed
원본 파일을 수정 하려면 -i
사용자가 콘텐츠를 수동으로 입력하도록 강요하지 마세요. 이는 스크립트를 사용하기 어렵게 만들 뿐입니다. 스크립트를 쉽게 다시 실행할 수 없고 자동화할 수 없으며 오류가 발생하기 쉽습니다. 대신 스크립트가 명령줄에서 URL을 읽도록 합니다.
#!/usr/bin/env bash
set -u
set -e
set -x
sed -i -e "12s/.*proxy_pass.*/proxy_pass:$1;/" \
-e "22s/.*proxy_pass.*/proxy_pass:$2;/" nginx.conf
proxy_pass:
하지만 백업을 만들어야 하며 데이터를 정렬된 상태로 유지하고 싶지만 파일이 없으면 proxy_pass
올바른 형식인 것 같으므로 다음과 같이 시도해 보십시오.
#!/usr/bin/env bash
set -u
set -e
set -x
timestamp=$(date +%s.%N)
sed -Ei."$timestamp".bak -e "12s/(.*proxy_pass ).*/\1$1;/" \
-e "22s/(proxy_pass ).*/\1$2;/" nginx.conf
그런 다음 IP를 인수로 사용하여 이 명령을 실행할 수 있습니다.
$ foo.sh 1.2.3.4 5.6.7.8
++ date +%s.%N
+ timestamp=1663148866.892161961
+ sed -Ei.1663148866.892161961.bak -e '12s/(.*proxy_pass ).*/\11.2.3.4/' -e '22s/(proxy_pass ).*/\15.6.7.8;/' nginx.conf
nginx.conf.1663148416.987587536.bak
그러면 원본 nginx.conf
파일 과 동일한 이름의 파일이 생성되어 nginx.conf
.