代理保存

1 11月、世界は変化し、再び同じになることはありません。 検閲はロシアのインターネットに登場しました-禁止サイトの有名なリストです。 これは重要な政治的トピックである人もいれば、暗号化技術と匿名性の保護を研究する機会である人もいれば、実行中に実行しなければならない別の奇妙な法律である人もいます。 技術的な側面についてお話します。



このチュートリアルでは、任意のサイトの作業ミラーをすばやく簡単に作成する方法を学習します。これにより、IPを変更し、任意のドメイン名を割り当てることができます。 URL内のドメインを非表示にしようとしていますが、その後、サイトの完全なコピーを保存できます。 すべての演習はどの仮想サーバーでも実行できます-私は個人的にHetznerホスティングとDebian OSを使用しています。 そしてもちろん、史上最高のWebサーバーであるNGINXを使用します!



このパラグラフについては、好奇心reader盛な読者が既に何らかの専用サーバーを購入して構成しているか、テーブルの下の古いコンピューターでLinuxを起動し、「今すぐ保存」ページでNginxの最新バージョンを起動しました。





開始する前に、 ngxxをngx_http_substitutions_filter_moduleモジュールでコンパイルする必要があります。以前の名前はsubstitutions4nginxです。



例としてwww.6pm.comを使用して、さらに構成を示します。 これは、割引価格で商品を販売する人気のオンラインストアのサイトです。 ロシアからの顧客へのアクセスを提供するというカテゴリー的な不本意によって区別されます。 資本主義の検閲が噛まなかったのはなぜですか?



すでに実用的なNginxがあり、便利なことに取り組んでいます-これはLivestreetシステムのサイトを外国の買い物の利点についてひねります。 午後6時のミラーを上げるには、サーバーIPにアドレス指定する6pm.pokupki-usa.ruという名前のDNSレコードを登録します。 ご理解のとおり、サブドメインの名前の選択は完全に任意です。 この名前は、新しいリソースにアクセスするたびに[HOST]フィールドに設定されるため、Nginxで仮想ホスティングを開始できます。



nginx構成のルートセクションでは、アップストリーム(ドナーサイトの名前)を記述します。そのため、今後このサイトを呼び出します。 標準ガイドでは、サイトは通常バックエンドと呼ばれ、リバースプロキシはフロントエンドと呼ばれます。



http { ... upstream 6pm { server www.6pm.com; }
      
      







次に、 サーバーセクションを作成する必要があります。次のようになります。



  server { listen 80; server_name 6pm.pokupki-usa.ru; limit_conn gulag 64; access_log /var/log/nginx/6pm.access.log; error_log /var/log/nginx/6pm.error.log; location / { root /var/www/6pm; try_files $uri @static; } location @static { include '6pm.conf'; proxy_cookie_domain 6pm.com 6pm.pokupki-usa.ru; proxy_set_header Accept-Encoding ""; proxy_set_header Host www.6pm.com; proxy_pass http://6pm; proxy_redirect http://www.6pm.com http://6pm.pokupki-usa.ru; proxy_redirect https://secure-www.6pm.com https://6pm.pokupki-usa.ru; } }
      
      







標準のlistenおよびserverディレクティブは、サーバーセクションがトリガーされるアクセス時に仮想ホストの名前を決定します。 ログファイルは個別に作成するのが最適です。



ルートロケールを宣言し、そのストレージへのパスを指定します-root / var / www / 6pm; 次に、 try_filesを使用します 。 これは非常に重要なnginxディレクティブであり、アップロードされたファイルのローカルストレージを整理できます。 ディレクティブは、最初に$ uriという名前のファイルがあるかどうかを確認し、見つからない場合は、指定されたロケール@ staticに移動します

$ uri-HTTPリクエストからのパスを含むnginx変数


プレフィックス「@」は、名前付きの場所を指定します。 このような場所は通常のリクエスト処理では使用されませんが、リクエストをリダイレクトすることのみを目的としています。 そのような場所はネストできず、ネストされた場所を含むこともできません。




この場合、デザインはrobots.txtファイルを置き換えるためだけに使用され、サイトのコンテンツのインデックス作成を禁止します。 ただし、nginxのミラーリングとキャッシュはこの方法で行われます。



include '6 pm.conf'-置換モジュールのロジック。



proxy_cookie_domainは、nginxバージョン1.1.15に登場した新しい関数です。このディレクティブがなければ、そうする必要がありまし 。 頭を悩ませる必要はもうありません。1行を処方するだけで、クッキーが機能し始めます。



proxy_set_header Accept-Encoding ""; -ドナーサイトが圧縮形式ではないコンテンツを提供する非常に重要なチーム。そうしないと、置換モジュールは置換を実行できません。



proxy_set_header Hostは、ドナーへのサイトへのリクエストで正しいHOSTフィールドを設定するもう1つの重要なコマンドです。 これがないと、プロキシサーバーの名前が置き換えられ、リクエストが誤ってしまいます。

proxy_pass-名前付きロケールでは直接アドレス指定が機能しないため、アップストリームディレクティブにドナーサイトのアドレスを登録しました。

proxy_redirect-多くのサイトは必要に応じてリダイレクトを使用します。各リダイレクトはここでキャッチおよびインターセプトする必要があります。そうしないと、リクエストとクライアントが居心地の良いドメインを超えてしまいます。



6 pm.confの内容を見てみましょう。 変換ロジックを別のファイルに入れたのは偶然ではありませんでした。 数千の置換ルールと数百キロバイトのフィルターを、パフォーマンスを損なうことなく配置できます。 この場合、プロキシ処理のみを完了したいので、ファイルには5行しか含まれていません。



Googleアナリティクスコードの変更:

 subs_filter 'UA-8814898-13' 'UA-28370154-3' gi; subs_filter "'.6pm.com']," "'6pm.pokupki-usa.ru']," gi;
      
      





これが最も無害ないたずらであることを保証します。 訪問に関する統計情報が提供され、これらの訪問は寄付者のサイトに表示されなくなります。



すべての直接リンクを新しいものに変更します。

 subs_filter "www.6pm.com" "6pm.pokupki-usa.ru" gi; subs_filter "6pm.com" "6pm.pokupki-usa.ru" gi;
      
      







原則として、通常のサイトでは、すべての写真がCDNネットワーク上にあり、リクエストのソースを確認する必要がないため、メインドメインからのリンクのみを交換すれば十分です。 私たちの場合、午後6時にロシアからの訪問者を拒否するドメインにいくつかの画像が表示され、投稿されました。 幸いなことに、置換モジュールは正規表現をサポートしており、リンクグループの一般的なルールを簡単に記述できます。 私たちの場合、正規表現なしで、ドメイン内の2文字を変更しました。 次のようになりました。



 subs_filter "http://a..zassets.com" "http://l3.zassets.com" gi;
      
      







交換モジュールの唯一の、しかし非常に深刻な制限は、1行だけで機能することです。 この制限は、ページが部分的に読み込まれた段階(チャンク転送エンコード)でモジュールが動作し、フルテキスト正規表現を実行する方法がないため、アーキテクチャ的にレイアウトされています。



すべて、 結果を見ることができ、すべてが機能し、注文の支払いも問題なく行われます。



そこで、サイトを新しいIPアドレスと新しいドメインに投げました。 簡単な作業でした。 サイトを新しいドメインではなく、既存のサブディレクトリにリンクすることは可能ですか? これは実行できますが、困難があります。 まず、htmlリンクが何であるかを覚えておいてください。

  1. www.example.com/some/path 」という形式の絶対リンク
  2. 「/ some / path」のようなサイトのルートに関連するリンク
  3. 「some / path」のような相対リンク




項目1では、すべてが単純です-すべてのリンクをサブディレクトリを持つ新しいパスに置き換えます

節3では、それは同じくらい簡単です-base href属性が使用されなかった場合、私たちは何にも触れず、すべてが単独で動作します。 この属性が使用されている場合(最近のサイトでは非常にまれですが)、この属性を置き換えるだけで十分であり、すべて機能します。



実際の困難は、クレーム2から生じています。 フォームのリンクの束を変更する必要があるという事実のために/ ...から/サブドメイン/ .... 真正面から行うと、サイトはほとんどの場合完全に機能しなくなります。そのような置換はスラッシュを使用して多くの構造を壊し、ほとんどすべてのJavaScriptスクリプトを台無しにするからです。



理論的には、かなり一般的な普遍的な正規表現を書くことができます。これは、置換のために排他的に必要なパターンを選択することができます。実際には、必要なリンクを部分的に翻訳するいくつかの簡単な正規表現を書く方がずっと簡単です。



患者に戻りましょう:



  location /6pm { root /var/www/6pm; try_files $uri @6pm-static; access_log /var/log/nginx/6pm.access.log; } location @6pm-static { include '6pm2.conf'; proxy_cookie_domain 6pm.com pokupki-usa.ru; proxy_cookie_path / /6pm/; rewrite ^/6pm/(.*) /$1 break; proxy_set_header Accept-Encoding ""; proxy_set_header Host www.6pm.com; proxy_pass http://6pm; proxy_redirect http://www.6pm.com http://pokupki-usa.ru/6pm; proxy_redirect http://www.6pm.com/login http://pokupki-usa.ru/6pm; proxy_redirect https://secure-www.6pm.com https://pokupki-usa.ru/6pm;
      
      







サーバー構成にいくつかの変更が加えられました。



まず、すべてのロジックがseverディレクティブからlocationに直接転送されます 。 プロキシされたサイトを表示する/ 6pmディレクトリを作成することにしたと推測するのは簡単です。



proxy_cookie_path / /午後6時/-Cookieをサイトのルートからサブディレクトリに転送します。 これは必須ではありませんが、プロキシされたサイトが多数ある場合、それらのCookieは相互に交差して消去される可能性があります。



書き直し^ / 6pm /(.*)/ $ 1 break; -このマジックは、クライアントリクエストから追加したサブディレクトリを削除します。その結果、proxy_passディレクティブは正しい値をドナーサーバーに送信します。



リダイレクトをキャッチするのが少し難しくなりました。 ここで、すべてのルートリンクを/ 6pmにリダイレクトする必要があります。



変換のロジックを見てみましょう。



 subs_filter_types text/css text/javascript; # Fix direct links subs_filter "http://6pm.com" "http://pokupki-usa.ru/6pm" gi; subs_filter "http://www.6pm.com" "http://pokupki-usa.ru/6pm" gi; # Fix absolute links subs_filter 'src="/' 'src="/6pm/' gi; subs_filter 'href="/' 'href="/6pm/' gi; subs_filter 'action="/' 'href="/6pm/' gi; # Fix some js subs_filter "\"/le.cgi" "\"/6pm/le.cgi" gi; subs_filter "\"/track.cgi" "\"/6pm/track.cgi" gi; subs_filter "\"/onload.cgi" "\"/6pm/onload.cgi" gi; subs_filter "\"/karakoram" "\"/6pm/karakoram" gi; subs_filter "/tealeaf/tealeaf.cgi" "/6pm/tealeaf/tealeaf.cgi" gi; # Css and js path subs_filter "script\('/" "script('/6pm/" gi; subs_filter "url\(/" "url(/6pm/" gi; subs_filter 'UA-8814898-13' 'UA-28370154-3' gi; subs_filter "'.6pm.com']," "'pokupki-usa.ru/6pm']," gi; subs_filter "http://a..zassets.com" "http://l3.zassets.com" gi;
      
      







最初に、cssおよびjavascriptファイルフィルタリングを有効にしました(html解析はデフォルトで有効になっています)

次に、ルートに関連するさまざまなタイプのリンクを慎重に見つけて置き換えます。 一部のスクリプトにそのようなパスが含まれる中程度の複雑さのサイトに出会いました。



その結果、次のようになりました: http : //pokupki-usa.ru/6pm/



残念ながら、サブディレクトリの場合、フィルタを最後まで書くことができませんでした。 ショッピングカートのスクリプトに対する動的なリクエストの変換には至りませんでしたが、これが解決できることは間違いありません。 Javascriptの知識が必要なデバッグを実行するのに十分ではないというだけです。ショッピングカートを開始する方法についてのアドバイスをうれしく思います。これは上記の例では機能しません。



いずれにせよ、これはおそらくサブディレクトリへのプロキシの方法を説明する最初のガイドです。



All Articles