
最近、興味深い問題が発生しました:技術的な作業中に、外部からのWebサイトへのアクセスの閉鎖を実装することです。 これはかなり一般的なタスクであり、その解決策は多くの人に興味があるように思えました。
1つの可能な解決策は次のとおりです。
与えられた
- サーバー:ubuntu 10.04 lts
- フロントエンドとしてのNginx
挑戦する
私たち自身 (または必要に応じて他のもの)を除いて 、すべての外部IPアドレスからWebサイトへの密接なアクセス。 この場合、次の条件が非常に望ましいです。
- 「クローズ」の時間は最小限でなければなりません(理想的には1秒未満)
- 作業中にNginxの設定を変更するたびに、できません
- 作業中にNginxを再起動することもできません(再起動も再読み込みもできません)
このような過酷な条件は、主にソリューションの使いやすさと優雅さを考慮して決定されます。 もちろん必須ではありません。
解決策
1.実際には、「クロージング」
トリガーファイルをスイッチとして使用することが決定されました(
/etc/nginx/maintenance.file
)。 Nginxが表示されたら、503のエラーコードを返し、対応するページを表示する必要があります。 これを行うには、既存の構成をどこかに保存します 。
cp /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/default.save
そして、次の変更を行います(太字部分):
server {
listen 80;
server_name example.com;
...
location / {
i f (-f /etc/nginx/maintenance.file) {
return 503;
}
#
...
...
}
...
...
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /etc/nginx/error; #
}
}
これで、Webサーバーがファイル
/etc/nginx/maintenance.file
検出すると、すぐに
/etc/nginx/maintenance.file
が発行され、エラーページが表示されます。 したがって、トリガーファイルをそれぞれ作成/削除することで、「閉じる/開く」ことができます。
この場合、503番目は無差別に表示され、元の条件と矛盾します。 これを回避する方法-次に。
2.誰に見せるか
さまざまな操作中にWebサイトのコンテンツを視覚的に制御できるようにするために、「技術的な作業が進行中」ページが表示されないことが非常に望ましいです。 これを行うには、 ngx_http_geo_moduleモジュールを使用します。 ドキュメントには次のように書かれています:「...値はクライアントのIPアドレスに依存する変数を作成します。」 まさに必要なもの。
503rdは次の場合にのみ表示されます: 同時に 、IPは外部であり、トリガーファイルが存在します。 頭に浮かぶ最も簡単な解決策は、二重条件または2つのネストされたIFです。 残念ながら、最初のNginxも2番目のNginxも理解していません。 したがって、「耳でフェイント」する必要があります。 構成をもう少し変更します。
geo $maintenance
{
default yes; # -
# IP, 503
127.0.0.1/32 no;
123.45.67.0/24 no;
...
}
server {
listen 80;
server_name example.com;
...
location / {
if (-f /etc/nginx/maintenance.file) {
set $tmp clo;
}
if ($maintenance = yes) {
set $action "${tmp}se";
}
if ($action = close) {
return 503;
}
#
...
...
}
...
...
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /etc/nginx/error; #
}
}
location /
セクションでは、外部IPとトリガーファイルの存在という2つの条件に置き換えられる3つの条件が連続して示されます。 これを行う最も簡単な方法は、例を使用することです。
任意の外部IPを持つクライアントにページを要求させます。 さらに:
/etc/nginx/maintenance.file
ファイルは既に存在します。
- トリガーファイルが作成されるため、
$tmp = "clo"
- 例外のリストにないIP:
$maintenance = "yes"
-
$maintenance = "yes"
、次のようになります。$action = $tmp + "se" = "close"
-
$action = "close"
、その後return 503
をreturn 503
ます
すべての「エイリアン」は503ページを参照してください。ただし、ネットワークの条件の1つが満たされていないため、$ action変数は不完全なままです(
$action = "lo"
)。 その結果、私たちにとって何も変わらず、サイトにアクセスできます。
変更した構成を有効にするために、Webサーバーを再起動します
sudo /etc/init.d/nginx restart
ngx_http_geo_moduleモジュールには、多くの追加の「グッズ」があります。 たとえば、別のファイルからアドレスと値を含むリストを読み込むことができます。 これにより、Nginxの設定を変更せずに例外リストをすばやく変更できます。 詳細については、 ドキュメントを参照してください。
これでセットアップは完了です。
使用法:
- 近接アクセス:
touch /etc/nginx/maintenance.file
- 共有:
rm /etc/nginx/maintenance.file
上記の方法が誰かに役立ち、時間を節約できることを本当に願っています。