次の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に変更し、2番目の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
。