lua-nginxモジュールを使用してNginxでCookieをプロキシします





Nginxを使用してオンザフライでコンテンツ変換する方法についてはすでに書いています。 説明された方法に基づいて記事が公開されて以来、実際のeコマースプロジェクトが開始され、開発されています。 翻訳と変換に加えて、Googleの初心者向けガイドの規約のSEO書き換えも実装されています。



ただし、ロシアのプログラマーの製品が外国のコンテンツを完全に獲得するまで、 Cookieのプロキシ-小さいながらも非常に重要なことはありませんでした。



問題の本質は何ですか



問題は、通常のアプリケーションサーバーが、たとえば、商品と一緒にクライアントセッションまたはバスケットを保存するために、常にCookieを設定することです。 このサーバー(またはその管理者)が特定のレベルのセキュリティを維持することに関心がある場合、cookie bodyにドメインとパスを設定しますたとえば、 domain = backend.org; path = / path1リバースプロキシモードで起動したNginxは、ドキュメントの本文内のすべてのリンクをbackend.orgからfrontend.orgに著しく変更しますが、Cookieに対してはこれを行いません! これは、クライアントのブラウザがこれらのCookieを拒否することを意味します。



この質問は長い間、nginx管理者の心を心配していました;ニュースレターでは、それは年に1-2回現れます。 ほとんどの質問者は、明らかにバックエンドのロジックをひねることで問題を解決しましたが、私ではありません! 元のサイトの次の更新後、PHP + Curlを使用して松葉杖を引っ張ることができなくなったことが明らかになり、Nginxを使用して解決策を見つける必要があります。



トピックをメーリングリストに戻し、同時にngx_http_perl_moduleのオプションと変数$ upperstream_http_set_cookieを並べ替えて、自分でモジュールを作成するという幻想的な希望で並べ替えのワイルドを調べました。 しかし、ある時点でミハイル・マズルスキーから貴重なアドバイスを与えられる手紙を受け取るまで、すべては失敗しました。 このアドバイスのおかげで、Cookieプロキシの問題を簡単に解決しただけでなく、プロジェクトのバージョン2.0を作成できる新しいツールも手に入れました。



解決策



このツールの名前はlua-nginx-moduleです 。これは、 oba宝 網のルーツを持つ別の中国のナゲットによって書かれています。 名前から、Nginxに組み込まれたLuaスクリプト言語について話していることは理解しやすいですが、これは単なるインタープリターではありません! これらの人たちは、毎秒何万もの操作のパフォーマンスを備えた完全にノンブロッキングの実装を作成しました。これは、Nginx内のすべてのイベントへのフックを備えています。 以前はCでモジュールを書くことでしか実装できなかったことが、Luaの数行でできるようになりました。 に興味がありますか?





設置



開始するには、 ご自身が知っている Nginxの最新バージョンをダウンロードしてください 。 突然、誰が忘れましたか?



次に、 プロジェクトページからlua-nginx-moduleの最新バージョンをダウンロードします



ライブラリが必要です:



apt-get install libpcre3 libpcre3-dev libperl-dev lua5.1 liblua5.1-dev







Nginxをビルドする方法は、新しいリリースのリリースの速度を見て、すでに暗記されているはずです。 クックブックから設定を提供します。



./configure --with-cc-opt="-I /usr/include" --with-ld-opt="-L /usr/lib" --with-http_sub_module --with-http_ssl_module --prefix=/home/nginx/data --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/ --add-module=../substitutions4nginx/ --add-module=../chaoslawful-lua-nginx-module-*









構成



make installの後、nginxを再起動することを忘れないでください。 そして何が起こったのでしょうか? しかし、それはそのような素晴らしいことでした: http : //wiki.nginx.org/HttpLuaModuleは、作成者によると、平均的なデスクトップPCで毎秒25,000のリクエストを想定しています。 ドキュメントを注意深く調べた後、すべてのイベントと内部NginxハンドラーがLuaランタイムで利用できることが明らかになります。 特にこのタスクでは、 header_filter_by_luaディレクティブを使用します。 構成ファイルを開き、目的の場所を選択して、簡単なコードを追加します。



 header_filter_by_lua ' local headers = ngx.header["Set-Cookie"] if headers then if type(headers) == "string" then headers = {headers} end for i, header in ipairs(headers) do local cookie = ngx.re.match(header, "JSESSIONID=([^;]+);", "io") if cookie then headers[i] = "JSESSIONID=" .. cookie[1] .. "; domain=.frontend.com; path=/newpath;" end end ngx.header["Set-Cookie"] = headers end ';
      
      







これがハンドラーの最も単純なバージョンです-私が人生で見た最初のluaコードです。 ユニバーサルSet-Cookieヘッダーパーサーを作成することができますし、作成する必要があります。国はすでにコメントでヒーローを待っています!



次は?



問題が解決したら、そのような単純な方法でさえ、すぐに新しい目標を設定する必要があります。 新しいツールの使用についてどのようなアイデアがありましたか?



  1. ヒットカウンター Webサーバー内のカウンター自体は、必要な変数に直接アクセスするため、多くのプログラムコードを節約できます。 RedisなどのNoSQLシステムをNginxに直接接続すると、大量のSQLコードが削除されます。 それは完全に目立たず、非常に速いカウンターになります!
  2. アンチDDoS。 最近のほとんどのゲームのAIが記述されている言語を使用すると、Webサーバーへの不要な要求のインテリジェントなフィルターを簡単に作成できます。
  3. 自動SEO書き換えジェネレーター。 手動でルールを設定してメタタグを追加する代わりに、たとえばlivestreetのモジュールのように、メタタグをその場で生成するスクリプトを作成します
  4. そして、もちろん、html 2.0ブロックを認識し、コンテンツを選択的にフィルタリングするための要素を備えたtranslation-2.0。




そして、あなたは何を思いついたのですか、愛するhabrayuzer?



PS退屈な投稿、写真は一切ありません。 発表として、Nginxの助けを借りてSEOがどのようにGoogle検索での地位を変えたかの写真を追加します。 これに関する記事が必要ですか?










All Articles