
次のようなブロックがあります。
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
^^^ これにより、proxy_pass ディレクティブを含むすべての行に read_timeout が追加されるのは明らかです。そこで、先頭に \r や \n や \r\n や [[:space:]]+ のバリエーションを追加してみましたが、うまくいきませんでした。
次のような逆の方法を試してみました:
sed '/location \/api {\n\s+proxy_pass.*/a proxy_read_timeout 300' nginx.conf
しかし、そこでも失敗している
誰か役に立つヒントを教えてもらえませんか?
答え1
勝負を受けて立つ。
次のコマンドを試してください:
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
魔法のキーワードは次のとおりです。
- sed リクエストの先頭に 'N' を付けると、sed は複数の行を一致させるようになります。
- '/a' は、一致した文字列の後に新しい行を追加するように sed に指示します。
さらに、インデントに合わせて適切なスペースを追加します :)
編集: 2 番目の提案。
sed 'N;/location \/api.*proxy.*$/a \ proxy_read_timeout 300;\n proxy_connect_timeout 300;\n proxy_send_timeout 300;\n' nginx