Geolocation Sagaず、デヌタベヌス゚ンゞンおよびプログラミングなしでNGINXでゞオWebサヌビスを䜜成する方法

今日は、IPアドレスによる地理䜍眮情報に関するやや叀いトピックず、「プログラミング蚀語」を䜿甚しない高速Webサヌビスに関する新しいトピックを取り䞊げたす。 。 たた、このようなWebサヌビスを5分でデプロむできるように、コンテナヌの既補のむメヌゞを公開したす。

圓瀟は独自のSaaSプラットフォヌム ABCP.RU でオンラむンパヌツストアを䜜成しおいたす。たた、 4MyCar.ruスペアパヌツ怜玢サヌビスなど、いく぀かの関連プロゞェクトもありたす。
他の倚くのWebプロゞェクトず同様に、IPアドレスによる地理䜍眮情報の必芁性を理解するようになりたした。 たずえば、 4MyCar.ruで地域を決定するために䜿甚されるようになりたした最初にサむトにアクセスするず、地域は自動的にそのように蚭定されたす。



同様に、顧客に最も近い店舗支店の遞択は、ABCPプラットフォヌムの顧客のWebサむトで行われたす。



ゞオロケヌションの問題が最初に珟れたずき、私たちはこの問題の研究を始めたばかりでした。 実際のずころ、圓時、 MaxMindデヌタベヌス以倖には特別な代替手段はありたせんでした。 私たちは詊し、遊び、芋捚おたした。 実際の䜜業では、顧客のサむトを積み重ねようずする特に迷惑なボットを陀倖するために、MaxMind GeoLiteを数回䜿甚したした。

nginxで囜別にフィルタリングするだけで十分でした。基本的なチェックむンの堎合は、ドキュメントngx_http_geoip_moduleを参照しおください。 無料のデヌタベヌスでは、RUで十分な粟床が埗られず、ラテンアルファベットの郜垂名が含たれおいたため、他の目的にはあたり適しおいたせんでした。

しばらくしお、埓業員の1人が優れたサむトipgeobase.ruを芋぀けたした。これにより、ロシアずりクラむナの地理䜍眮情報デヌタベヌスを「ダりンロヌド」し、簡単なhttpリク゚ストでそのXML Webサヌビスを䜿甚できたす。 たずえば、察応する郜垂から「りリュピンスクでオむルフィルタヌを賌入する」ずいうフレヌズを含む4mycar.ru Webサむトに切り替えるず、Webサヌビスhttp://ipgeobase.ru:7020/geo?ip=217.149.183.4ぞのほが次のリク゚ストが発生したした。 結果には、ロシア語での郜垂ず地域の名前が含たれおおり、非垞に䟿利でした。 非垞に短い時間で、最も近い店舗の支店を識別するコヌドにWebサヌビスの䜜業が関䞎したした。 ただし、実皌働環境での起動埌、いく぀かの問題が明らかになりたした。
1通垞、Webサヌビスぞのリク゚ストには少し時間がかかりたしたモスクワのデヌタセンタヌからの通垞の状態では100分の1秒が、地域の開発オフィスからの遅延はすでに倧きかった玄0.5秒。
2時折「ピヌク時間」の芳察によるずこの時間は著しく長くなり、顧客ぞの察応にすでに䞍快な遅れが生じたした。
3たたたた同じクラむアントでゞオロケヌションを実行する必芁が䜕床かあったため、ゞオデヌタのキャッシングに぀いお疑問が生じたした。
4最適でないリク゚ストで、ipgeobase Webサヌビスに負荷をかけたしたが、これはサヌビス所有者にずっおは悪いこずでした。
5他の囜RUでもUAでもないでは、ゞオロケヌションは機胜したせんでした。

これらの問題を解決するために、私たちはすぐに「䌚議をたずめる」

2぀の䞻な゜リュヌションオプションがありたす。デヌタベヌスを取埗しおWebサヌビスを䜜成したす定期的にipgeobaseデヌタベヌスをダりンロヌドし、デヌタベヌスにむンポヌトし、たずえばmemcachedにキャッシングでhttp経由で送信したすたたはmemcachedたたはredisでゞオデヌタキャッシングを行いたすデヌタをリク゚ストしたす ipgeobaseおよびキャッシング。 オフハンドでは、䞡方のオプションに非垞に倚くの開発者の非垞に少ない工数が必芁であり、その結果、3番目のオプションが芋぀かりたした粟床がわずかに䜎䞋したすIPアドレスの最埌のオクテットを0に眮き換え、プロバむダヌが異なる郜垂に1/24サブネットを持っおいるず仮定したすあたりにも頻繁にそしお、長いキャッシュ時間ずipgeobaseぞのリク゚ストの短いタむムアりトで、nginxでキャッシュプロキシを実行したす。 このオプションは非垞に効果的であるこずが刀明し、時にはipgeobaseの負荷ずゞオロケヌション時間を削枛したした。 独自のWebサヌビスのオプションは無期限に延期されたした。

しばらくしお、再びnginxでゞオロケヌションが必芁になりたしたそう、これらのボットですが、珟圚はRUからかなり倚くなっおいたす。したがっお、MaxMindデヌタベヌスに埓っお囜別にフィルタリングするだけでは十分ではありたせん。

緊急に必芁だったため、別のゞオモゞュヌル ngx_http_geo_module を䜿甚し、ipgeobaseデヌタベヌスから地域番号を倉数に導きたした。 これは「穎を塞ぐ」のに十分でした。
すぐにipgeobase2nginx.phpスクリプトに遭遇したした。このスクリプトはnginxのベヌスを䜜成し、その結果、郜垂に぀いおの人間が読み取れる情報を倉数で受け取りたした。 このデヌタは、MaxMindデヌタず同様に、すでにログに出力されおいるか、バック゚ンドのヘッダヌに枡されおいる可胜性があり、原則ずしお誰にずっおも䟿利でした。

この間ずっず、私たちは定期的にさらなる開発に぀いお考えたした。 独自のWebサヌビスを䜜成するための蚈画は、TODOリストにほこりを集め、「しかし、今倜ここでpython / erlang / haskell /などを勉匷しお、「Hello world」の次の蚘事を曞きたいですか」ずいう圢で時々珟れたしたが、それらは先に進みたせんでした。
突然、冗談の圢で楜しみのためだけに、nginxの経隓に基づいお、ipgeobaseに䌌たWebサヌビスを䜜成するずいうアむデアが生たれたしたが、デヌタベヌス゚ンゞンずスクリプト蚀語は䜿甚しおいたせん。
この結果が埗られたこずの簡単な分析
1パブリックドメむンでは、テキストにcsvおよびipgeobaseにGeoLiteデヌタベヌスがありたす。
2 ngx_http_geo_moduleモゞュヌルは、倉数の倀をIPアドレスで蚭定できたす。たた、非垞に高速ですバむナリゞオレンゞベヌスを䜿甚しお高速化したす。
3RUおよびUAに぀いおは、ipgeobaseを信頌したすが、可胜であれば、MaxMindデヌタも衚瀺する必芁がありたす。
4nginxはssi ngx_http_ssi_module を完党に実装したす。これは、テキスト/ htmlだけでなく、他のファむルタむプに察しおも同様です。
5nginxはリク゚ストヘッダヌからIPアドレスを取埗し、これがクラむアントのIPアドレス ngx_http_realip_module であるず想定できたす。これは、geoモゞュヌルに枡すこずを意味したす。
csvファむルずipgeobaseファむルからnginxに必芁な蚭定を䜜成するいく぀かの「ニヌハむ」スクリプトを远加するこずは残っおいたす。

取埗したものは次のずおりです。
https://yadi.sk/d/QsNN87nMesXo8-構成ずスクリプト。

動䜜䞭のWebサヌビスを衚瀺するために、 http//muxgeo-demo.4mycar.ru 6280 / muxgeo /で利甚可胜なVDSに䞀時的に展開したした。

このようなサヌビスを自分ですばやく起動するには、完成したLXCむメヌゞ https://yadi.sk/d/1WrvV2RyesYFM ログむンパスワヌド-ubuntuubuntuをダりンロヌドできたす。

スクリプトの動䜜の簡単な説明を以䞋に瀺したす。LXCでは、スクリプトを/ opt / scriptsに配眮したす。

サブディレクトリの/ opt / scripts /に、MaxMindずipgeobaseから受け取ったファむルを入れお、少し凊理する必芁がありたす次のようなものです。
iconv -f latin1 GeoLiteCity-Location.csv | iconv -t ascii // translit> GeoLiteCity-Location-translit.csv

動䜜するには、MaxMindから远加のファむルず領域の名前が必芁です。
dev.maxmind.com/static/csv/codes/maxmind/region.csv

これで、スクリプト自䜓
GeoLite2nginx.pl-ファむルを生成したす/ nginx_geoip_ *
ipgeobase2nginx.pl-out / nginx_ipgeobase_ *ファむルを生成したす

geoipずipgeobaseでIP範囲をオヌバヌレむする必芁がありたす。 これを行うには、最初の2぀のスクリプトを実行するず、IPアドレスの敎数衚珟out / nginx_geoip_num.txtおよびout / nginx_ipgeobase_num.txtでファむルが䜜成されたした。 /nginx_localip_num.txtにファむルを手動で䜜成し、そこに予玄範囲ロヌカルネットワヌクなどのリストを配眮したした。 さらに、結果リストからマルチキャストアドレスの範囲を陀倖したす。

方法
make-dup-ranges.plスクリプトはリストを調べお、偶数IP新しい範囲の開始ごずに前の前の範囲の終わりをリストに远加し、奇数ごずに次のものを远加したす。 次に、リストを䞊べ替え、重耇を削陀したす。

make-ranges.plスクリプトは、nginxの範囲を持぀そのような構成を䜜成したす。

nginxの蚭定ができたしたので、それらを接続する必芁がありたす。

私たちのスキヌムは、フロント゚ンドずバック゚ンドで構成されたすフロント゚ンドはヘッダヌ倉換ずキャッシングを䌎うバック゚ンド芁求を送信したす。 これはすべお、LXCコンテナのubuntu 14.04で行いたす。公匏サむトからnginxを取埗したす。

ここにコンテンツを掲茉したす。
/ etc / nginx / muxgeo /デヌタ/

必芁な倉数を蚭定する「バむンディング」を䜜成したしょう。
/etc/nginx/muxgeo/muxgeo.conf
/etc/nginx/muxgeo/muxgeo-geoip.conf
/etc/nginx/muxgeo/muxgeo-ipgeobase.conf

たた、バック゚ンドのプリミティブロゞック
/etc/nginx/muxgeo/muxgeo_site.conf

フロント゚ンドずバック゚ンドの構成は次のずおりです。
/etc/nginx/conf.d/muxgeo-frontend.confポヌト6280で埅機
/etc/nginx/conf.d/muxgeo-backend.confポヌト6299

たた、index.htmlなどのファむルも必芁です。このファむルでは、nginxのSSIを䜿甚しお必芁な圢匏でデヌタを出力したす。 ディレクトリに配眮したす
/ opt / muxgeo / muxgeo-backend / muxgeo

だからぞの芁求
http://muxgeo-demo.4mycar.ru:6280/muxgeo/?ip=217.149.183.4
これは、217.149.183.4をIPアドレスに眮き換えおバック゚ンドでブロヌドキャストされ、バック゚ンドはHTMLテキストの適切な堎所に情報を挿入したす。

しかし、htmlペヌゞは私たちが望んでいたものではなく、ipgeobaseのようにxmlが必芁です。 テンプレヌトに察応するフィヌルドの出力を入力するだけです。muxgeo.xmlファむルの䟋を参照しおください

リンクで
http://muxgeo-demo.4mycar.ru:6280/muxgeo/muxgeo.xml?ip=217.149.183.4
ipgeobaseのxml出力ずutf-8でも「同じ、しかしより良い」結果が埗られたす

JSONが必芁-問題ありたせん。 同様に、テンプレヌトは次のように実行されたす。
http://muxgeo-demo.4mycar.ru:6280/muxgeo/muxgeo.json?ip=217.149.183.4

゚キゟチックにしたい-iniファむルずしお出力したしょう
http://muxgeo-demo.4mycar.ru:6280/muxgeo/muxgeo.ini?ip=217.149.183.4

䜜業をテストするために、たずえば、䞊蚘の結果 ipgeobase2nginx.php の結果ず同様の圢匏で、すべおの囜の䜏所にゞオデヌタベヌスを䜜成できたす。 テンプレヌトmuxgeo_fullstr.txtず䜿甚可胜なすべおの範囲のデヌタを読み取る単玔なスクリプトを含むテキストファむルを䜜成したす。

小さな発蚀。 䟋では、フロント゚ンドずバック゚ンドは同じnginxで動䜜したす。 重い負荷の堎合、geodataでのバック゚ンドの䜜業はproxy_cacheでの最小のnginxよりも倚くのメモリを消費するため、それらを異なるnginxに分割するこずは理にかなっおいたす。

このプロゞェクトのさらなる発展は䜕ですか たずえば、他のデヌタ゜ヌスを远加しお、構成を少し耇雑にし、「信頌できる゜ヌスから取埗した掗緎::」を配眮できるゞオベヌスを接続するこずもできたす。

Source: https://habr.com/ru/post/J251463/


All Articles