OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉΠœΡ‹ вновь ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ Π΄ΠΎΠΊΠ»Π°Π΄Π° с ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ HighLoad++ 2016, которая ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΠ»Π° Π² подмосковном Π‘ΠΊΠΎΠ»ΠΊΠΎΠ²ΠΎ 7β€”8 ноября ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π³ΠΎΠ΄Π°. Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ ΠŸΡ€ΠΎΡ‚Π°ΡΠΎΠ² рассказываСт, ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ NGINX с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ OpenResty ΠΈ Lua.

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚, мСня Π·ΠΎΠ²ΡƒΡ‚ Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ ΠŸΡ€ΠΎΡ‚Π°ΡΠΎΠ², я Ρ€Π°Π±ΠΎΡ‚Π°ΡŽ Π² Parallels. РасскаТу Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ ΠΎ сСбС. Π’Ρ€ΠΈ Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΈ своСй ΠΆΠΈΠ·Π½ΠΈ я занимаюсь Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΈΡˆΡƒ ΠΊΠΎΠ΄. Π‘Ρ‚Π°Π» программистом Π΄ΠΎ ΠΌΠΎΠ·Π³Π° костСй Π² прямом смыслС: я ΠΈΠ½ΠΎΠ³Π΄Π° Π²ΠΎ снС Π²ΠΈΠΆΡƒ ΠΊΠΎΠ΄. Π§Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΡŒ ΠΆΠΈΠ·Π½ΠΈΒ β€” ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Π°Ρ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, написаниС ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ΄Ρ‘Ρ‚ прямо Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· вас ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, Π½ΠΎ Π½Π΅ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΠ± этом.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π»ΠΈ насколько всё Π±Ρ‹Π»ΠΎ ΠΏΠ»ΠΎΡ…ΠΎ. Когда я Π±Ρ‹Π» малСньким Π΄ΠΆΡƒΠ½ΠΈΠΎΡ€ΠΎΠΌ, я ΠΏΡ€ΠΈΡˆΡ‘Π», ΠΈ ΠΌΠ½Π΅ Π²Ρ‹Π΄Π°Π»ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π²ΡƒΡ…Ρ‚Π΅Ρ€Π°Π±Π°ΠΉΡ‚Π½Ρ‹Π΅ Π±Π°Π·Ρ‹. Π­Ρ‚ΠΎ сСйчас Ρ‚ΡƒΡ‚ Ρƒ всСх highload. Π― Ρ…ΠΎΠ΄ΠΈΠ» Π½Π° ΠΊΠΎΠ½Ρ„Π΅Ρ€Π΅Π½Ρ†ΠΈΠΈ, ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Π»: «РСбят, расскаТитС, Ρƒ вас big data, всё ΠΊΡ€ΡƒΡ‚ΠΎ? Бколько Ρƒ вас Ρ‚Π°ΠΌ Π±Π°Π·Ρ‹?Β» МнС ΠΎΡ‚Π²Π΅Ρ‡Π°Π»ΠΈ: Β«Π£ нас 100 Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚!Β» Π― Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»: Β«ΠšΡ€ΡƒΡ‚ΠΎ, 100 Π³ΠΈΠ³Π°Π±Π°ΠΉΡ‚!Β» А ΠΏΡ€ΠΎ сСбя Π΄ΡƒΠΌΠ°Π», ΠΊΠ°ΠΊ Π±Ρ‹ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½Π΅Π½ΡŒΠΊΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ покСрфСйс. Π”ΡƒΠΌΠ°Π΅ΡˆΡŒ, Π΄Π°, рСбята ΠΊΡ€ΡƒΡ‚Ρ‹Π΅, Π° ΠΏΠΎΡ‚ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΡˆΡŒΡΡ ΠΈ ΠΊΠΎΠ²Ρ‹Ρ€ΡΠ΅ΡˆΡŒΡΡ с этими ΠΌΠ½ΠΎΠ³ΠΎΡ‚Π΅Ρ€Π°Π±Π°ΠΉΡ‚Π½Ρ‹ΠΌΠΈ Π±Π°Π·Π°ΠΌΠΈ. И это — Π±ΡƒΠ΄ΡƒΡ‡ΠΈ Π΄ΠΆΡƒΠ½ΠΈΠΎΡ€ΠΎΠΌ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚Π΅ сСбС, ΠΊΠ°ΠΊΠΎΠΉ это ΡƒΠ΄Π°Ρ€?

Π― знаю большС 20 языков программирования. Π­Ρ‚ΠΎ Ρ‚ΠΎ, Π² Ρ‡Ρ‘ΠΌ ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹. Π’Π΅Π±Π΅ Π²Ρ‹Π΄Π°ΡŽΡ‚ ΠΊΠΎΠ΄ Π½Π° Erlang, Π½Π° C, Π½Π° Π‘++, Π½Π° Lua, Π½Π° Python, Π½Π° Ruby, Π½Π° Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π΅Ρ‰Π΅, ΠΈ Ρ‚Π΅Π±Π΅ Π½Π°Π΄ΠΎ это всё ΠΏΠΈΠ»ΠΈΡ‚ΡŒ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ. Π’ΠΎΡ‡Π½ΠΎΠ΅ количСство ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Π½ΠΎ Π³Π΄Π΅-Ρ‚ΠΎ Π½Π° 20 число ΠΏΠΎΡ‚Π΅Ρ€ΡΠ»ΠΎΡΡŒ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π½Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Parallels, ΠΈ Ρ‡Π΅ΠΌ ΠΌΡ‹ занимаСмся, Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΌΡ‹ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ ΠΈ Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅ΠΌ, Π½Π΅ Π±ΡƒΠ΄Ρƒ. РасскаТу Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ нас 13 офисов ΠΏΠΎ ΠΌΠΈΡ€Ρƒ, большС 300 сотрудников, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π² МосквС, Π’Π°Π»Π»ΠΈΠ½Π΅ ΠΈ Π½Π° ΠœΠ°Π»ΡŒΡ‚Π΅. ΠŸΡ€ΠΈ ΠΆΠ΅Π»Π°Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΅Ρ…Π°Ρ‚ΡŒ Π½Π° ΠœΠ°Π»ΡŒΡ‚Ρƒ, Ссли Π·ΠΈΠΌΠΎΠΉ Ρ…ΠΎΠ»ΠΎΠ΄Π½ΠΎ ΠΈ Π½Π°Π΄ΠΎ ΠΏΠΎΠ³Ρ€Π΅Ρ‚ΡŒ спинку.

ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ наш ΠΎΡ‚Π΄Π΅Π» ΠΏΠΈΡˆΠ΅Ρ‚ Π½Π° Python 2. ΠœΡ‹ занимаСмся бизнСсом ΠΈ Π½Π°ΠΌ Π½Π΅ΠΊΠΎΠ³Π΄Π° Π²Π½Π΅Π΄Ρ€ΡΡ‚ΡŒ ΠΌΠΎΠ΄Π½Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ, поэтому ΠΌΡ‹ страдаСм. Π£ нас Django, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ всё Π΅ΡΡ‚ΡŒ, Π° лишнСС ΠΌΡ‹ взяли ΠΈ Π²Ρ‹ΠΊΠΈΠ½ΡƒΠ»ΠΈ. Π’Π°ΠΊΠΆΠ΅ MySQL, Redis ΠΈ NGINX. Π•Ρ‰Ρ‘ Ρƒ нас — ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΡ€ΡƒΡ‚Ρ‹Ρ… ΡˆΡ‚ΡƒΠΊ. Π£ нас Π΅ΡΡ‚ΡŒ MongoDB, Ρƒ нас ΠΊΡ€ΠΎΠ»ΠΈΠΊΠΈ Π±Π΅Π³Π°ΡŽΡ‚, Ρƒ нас Ρ‡Π΅Π³ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅Ρ‚Β β€” Π½ΠΎ это Π½Π΅ ΠΌΠΎΡ‘, ΠΈ я этим Π½Π΅ занимаюсь.

OpenResty

О сСбС я рассказал. Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрёмся, ΠΎ Ρ‡Π΅ΠΌ я Π±ΡƒΠ΄Ρƒ сСгодня Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ:

  • Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ OpenResty ΠΈ с Ρ‡Π΅ΠΌ Π΅Π³ΠΎ Сдят?
  • Π—Π°Ρ‡Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π΅Ρ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ вСлосипСд, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ Python, NodeJS, PHP, Go ΠΈ ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅ ΡˆΡ‚ΡƒΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ всС Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹?
  • И Π½Π΅ΠΌΠ½ΠΎΠΆΠ΅Ρ‡ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΈΠ· ΠΆΠΈΠ·Π½ΠΈ. МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ сильно ΡƒΡ€Π΅Π·Π°Ρ‚ΡŒ Π΄ΠΎΠΊΠ»Π°Π΄, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρƒ мСня получался Π½Π° 3,5 часа, поэтому ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ°Π»ΠΎ.

OpenRestyΒ β€” это NGINX. Благодаря Π΅ΠΌΡƒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π²Π΅Π±-сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написан Ρ…ΠΎΡ€ΠΎΡˆΠΎ, ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстро. Π― Π΄ΡƒΠΌΠ°ΡŽ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠ· нас ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ NGINX Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π΅. ВсС Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΎΠ½ быстрый ΠΈ ΠΊΡ€ΡƒΡ‚ΠΎΠΉ. Π’ Π½Ρ‘ΠΌ сдСлали ΠΊΡ€ΡƒΡ‚ΠΎΠΉ синхронный Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄, поэтому Π½Π°ΠΌ Π½Π΅ Π½Π°Π΄ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π²Π΅Π»ΠΎΡΠΈΠΏΠ΅Π΄ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΠ°ΠΊ Π² Python навСлосипСдили gevent. GeventΒ β€” ΠΊΡ€ΡƒΡ‚ΠΎΠΉ, здоровский, Π½ΠΎ Ссли Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΡΠΈΡˆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΈ Ρ‚Π°ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠΉΠ΄Ρ‘Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ, Ρ‚ΠΎ с gevent Π²Ρ‹ сойдётС с ΡƒΠΌΠ° это Π΄Π΅Π±Π°ΠΆΠΈΡ‚ΡŒ. Π£ мСня Π±Ρ‹Π» ΠΎΠΏΡ‹Ρ‚: ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΈΡΡŒ Ρ†Π΅Π»Ρ‹Ρ… Π΄Π²Π° дня, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Ρ‚Π°ΠΌ пошло Π½Π΅ Ρ‚Π°ΠΊ. Если Π±Ρ‹ ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π±Ρ‹ Π΄ΠΎ этого Π½Π΅ покопался нСсколько нСдСль, Π½Π΅ нашСл ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Π½Π΅ написал Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅, ΠΈ Google Π½Π΅ нашСл Π±Ρ‹ этого, Ρ‚ΠΎ ΠΌΡ‹ Π±Ρ‹ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΠ²ΠΈΡ…Π½ΡƒΠ»ΠΈΡΡŒ.

Π’ NGINX ΡƒΠΆΠ΅ сдСланы ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ статичСский ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Π’Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠ°Ρ€ΠΈΡ‚ΡŒΡΡ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎ-чСловСчСски, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ вас Π³Π΄Π΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅ Π·Π°Ρ‚ΠΎΡ€ΠΌΠΎΠ·ΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ Π³Π΄Π΅-Ρ‚ΠΎ дСскрипторы Π½Π΅ потСряли. Nginx ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ΡŒ, Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Π·ΡΡ‚ΡŒΒ β€” WSGI, PHP-FPM, Gunicorn, Unicorn. Nginx поставили, Π°Π΄ΠΌΠΈΠ½Π°ΠΌ ΠΎΡ‚Π΄Π°Π»ΠΈ, ΠΎΠ½ΠΈ Π·Π½Π°ΡŽΡ‚, ΠΊΠ°ΠΊ с этим Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Nginx структурированно ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запросы. Π― ΠΎΠ± этом Π½Π΅ΠΌΠ½ΠΎΠΆΠΊΠΎ ΠΏΠΎΠ·ΠΆΠ΅ расскаТу. Π’ΠΊΡ€Π°Ρ‚Ρ†Π΅ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ Ρ„Π°Π·Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ принял запрос, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π» ΠΈ ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚Π΄Π°Π» ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.

Nginx ΠΊΡ€ΡƒΡ‚, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: ΠΎΠ½ нСдостаточно Π³ΠΈΠ±ΠΎΠΊ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ всСх Ρ‚Π΅Ρ… ΠΊΡ€ΡƒΡ‚Ρ‹Ρ… Ρ„ΠΈΡˆΠΊΠ°Ρ…, Ρ‡Ρ‚ΠΎ рСбята Π²ΠΏΠΈΡ…Π½ΡƒΠ»ΠΈ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³, ΠΏΡ€ΠΈ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ. Π­Ρ‚ΠΎΠΉ ΠΌΠΎΡ‰ΠΈ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ рСбята ΠΈΠ· Taobao ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ Π΄Π°Π²Π½ΠΎ, каТСтся, Π»Π΅Ρ‚ восСмь Π½Π°Π·Π°Π΄, встроили Ρ‚ΡƒΠ΄Π° Lua. Π§Ρ‚ΠΎ ΠΎΠ½ Π΄Π°Ρ‘Ρ‚?

  • Π Π°Π·ΠΌΠ΅Ρ€. Он малСнький. LuaJIT Π΄Π°Π΅Ρ‚ Π³Π΄Π΅-Ρ‚ΠΎ 100-200 ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄Π° ΠΏΠΎ памяти ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.
  • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ LuaJIT Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ситуациях Π±Π»ΠΈΠ·ΠΎΠΊ ΠΊ C, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ситуациях ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ Java, Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…Β β€” обгоняСт Π΅Ρ‘. КакоС-Ρ‚ΠΎ врСмя ΠΎΠ½ считался state of art, ΠΊΡ€ΡƒΡ‚Π΅ΠΉΡˆΠΈΠΌ JIT-компилятором. БСйчас Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€ΡƒΡ‚Ρ‹Π΅, Π½ΠΎ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ тяТСлыС, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‚ΠΎΡ‚ ΠΆΠ΅ V8. НСкоторыС JS-Π½Ρ‹Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ дТавовский HotSpot Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ Ρ‚ΠΎΡ‡ΠΊΠ°Ρ… быстрСС, Π½ΠΎ Π² ΠΊΠ°ΠΊΠΈΡ…-Ρ‚ΠΎ мСстах всё Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚.
  • ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π° Π² освоСнии. Если Ρƒ вас, допустим, кодовая Π±Π°Π·Π° Π½Π° Perl, ΠΈ Π²Ρ‹ Π½Π΅ Booking, Π²Ρ‹ Π½Π΅ Π½Π°ΠΉΠ΄Ρ‘Ρ‚Π΅ ΠΏΠ΅Ρ€Π»ΠΎΠ²Ρ‹Ρ… программистов. ΠŸΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΈΡ… Π½Π΅Ρ‚, ΠΈΡ… всСх Π·Π°Π±Ρ€Π°Π»ΠΈ, Π° ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π΄ΠΎΠ»Π³ΠΎ ΠΈ слоТно. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ программистов Π½Π° Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡ… Ρ‚ΠΎΠΆΠ΅ ΠΈΡ… придётся ΠΏΠ΅Ρ€Π΅ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ, Π»ΠΈΠ±ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ. Π’ случаС Lua всё просто. Lua учится Π»ΡŽΠ±Ρ‹ΠΌ Π΄ΠΆΡƒΠ½ΠΈΠΎΡ€ΠΎΠΌ Π·Π° Ρ‚Ρ€ΠΈ дня. МнС ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π³Π΄Π΅-Ρ‚ΠΎ часа Π΄Π²Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ. Π§Π΅Ρ€Π΅Π· Π΄Π²Π° часа я ΡƒΠΆΠ΅ писал ΠΊΠΎΠ΄ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½. Π“Π΄Π΅-Ρ‚ΠΎ Ρ‡Π΅Ρ€Π΅Π· нСдСлю ΠΎΠ½ прямо Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ ΠΈ ΡƒΠ΅Ρ…Π°Π».

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ это выглядит Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π’ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΎ всСго. Π’ OpenResty собрали ΠΊΡƒΡ‡Ρƒ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, ΠΊΠ°ΠΊ Π»ΡƒΠ°ΡˆΠ½Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΈ эндТинсовских. И Ρƒ вас всС Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅Β β€” Π·Π°Π΄Π΅ΠΏΠ»ΠΎΠΈΠ» ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π₯Π²Π°Ρ‚ΠΈΡ‚ Π»ΠΈΡ€ΠΈΠΊΠΈ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ΄Ρƒ. Π’ΠΎΡ‚ малСнький Hello World:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π§Ρ‚ΠΎ здСсь Π΅ΡΡ‚ΡŒ? это эндТинсовский location. ΠœΡ‹ Π½Π΅ паримся, Π½Π΅ пишСм свой Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³, Π½Π΅ Π±Π΅Ρ€Ρ‘ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉΒ β€” Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² NGINX, ΠΌΡ‹ ΠΆΠΈΠ²Π΅ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈ Π»Π΅Π½ΠΈΠ²ΠΎ.

content_by_lua_block – это Π±Π»ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΎΡ‚Π΄Π°Π΅ΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Lua-скрипта. Π‘Π΅Ρ€Π΅ΠΌ ΡΠ½Π΄ΠΆΠΈΠ½ΡΠΎΠ²ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ remote_addr ΠΈ подсовываСм Π΅Ρ‘ Π² string.format. Π­Ρ‚ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС, Ρ‡Ρ‚ΠΎ ΠΈ sprintf, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Lua, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ. И ΠΎΡ‚Π΄Π°Ρ‘ΠΌ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ.

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ это Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Но вСрнёмся Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠΈΡ€. Π’ ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π΄Π΅ΠΏΠ»ΠΎΠΈΡ‚ Hello World. Π£ нас ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π±Π°Π·Ρƒ ΠΈΠ»ΠΈ Π΅Ρ‰Ρ‘ ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΆΠ΄Ρ‘Ρ‚ ΠΎΡ‚Π²Π΅Ρ‚Π°.

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€ΠΎΡΡ‚ΠΎ сидит ΠΈ ΠΆΠ΄Ρ‘Ρ‚. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ. Когда приходят 100.000 ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ, Π½Π°ΠΌ ΠΎΡ‡Π΅Π½ΡŒ тяТко. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π² качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π°ΠΊΠΈΠ΄Π°Π΅ΠΌ ΠΏΡ€ΠΎΡΡ‚Π΅Π½ΡŒΠΊΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Π‘ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ². Волько ΠΌΡ‹ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ просто Ρ‚Π°ΠΊ ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΠΈ, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ поискал «котята», ΠΌΡ‹ Π΅ΠΌΡƒ Π½Π°ΠΉΠ΄Ρ‘ΠΌ ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ², ΠΏΡƒΡˆΠΈΡΡ‚ΠΈΠΊΠΎΠ² ΠΈ ΠΏΡ€ΠΎΡ‡Π΅Π΅. Для Π½Π°Ρ‡Π°Π»Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ запроса Π½Π° бэкСндС. Выглядит это Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π”Π²Π΅ строчки ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π²Π°ΠΌ Π·Π°Π±Ρ€Π°Ρ‚ΡŒ GET-ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π½ΠΈΠΊΠ°ΠΊΠΈΡ… слоТностСй. Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹, допустим, ΠΈΠ· Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… с Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΠΎΠΉ ΠΏΠΎ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠΌΡƒ слову ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ SQL-запросом эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Всё просто. Выглядит это Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡ΠΊΡƒ resty.mysql, которая Ρƒ нас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ‚Π΅. Нам Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, всё Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ΅. Π£ΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒΡΡ, ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ SQL-запрос:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π’ΡƒΡ‚ Π½Π΅ΠΌΠ½ΠΎΠΆΠ΅Ρ‡ΠΊΠΎ ΡΡ‚Ρ€Π°ΡˆΠ½ΠΎ, Π½ΠΎ всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π—Π΄Π΅ΡΡŒ 10Β β€” это Π»ΠΈΠΌΠΈΡ‚. ΠœΡ‹ вытаскиваСм 10 записСй, ΠΌΡ‹ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅, Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ большС ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ. Π’ SQL ΠΏΡ€ΠΎ Π»ΠΈΠΌΠΈΡ‚ я Π·Π°Π±Ρ‹Π».

Π”Π°Π»ΡŒΡˆΠ΅ ΠΌΡ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΏΠΎ всСм запросам. ΠœΡ‹ собираСм ΠΏΠ°Ρ‡ΠΊΡƒ запросов ΠΈ заполняСм Lua-Ρ‚Π°Π±Π»ΠΈΡ‡ΠΊΡƒ, которая называСтся reqs, ΠΈ Π΄Π΅Π»Π°Π΅ΠΌ ngx.location.capture_multi.

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ВсС эти запросы уходят Π² ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒ, ΠΈ Π½Π°ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹. ВрСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ€Π°Π²Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π° самого ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ. Если Ρƒ нас всС ΠΎΡ‚ΡΡ‚Ρ€Π΅Π»ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π·Π° 50 миллисСкунд, ΠΈ ΠΌΡ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ»ΠΈ ΡΠΎΡ‚Π½ΡŽ запросов, Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Ρƒ нас ΠΏΡ€ΠΈΠ΄Ρ‘Ρ‚ Π·Π° 50 миллисСкунд.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π»Π΅Π½ΠΈΠ²Ρ‹Π΅ ΠΈ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ HTTP ΠΈ ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, ΠΌΡ‹ заставим NGINX Π΄Π΅Π»Π°Ρ‚ΡŒ всё Π·Π° нас. Как Π²Ρ‹ Π²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‚Π°ΠΌ Π±Ρ‹Π» запрос Π½Π° url/fetch, Π²ΠΎΡ‚ ΠΎΠ½:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ простой proxy_pass, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, ΠΊΡƒΠ΄Π° Π·Π°ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΈ Ρƒ нас всё Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

Но этого нСдостаточно, Π½Π°ΠΌ Π΅Ρ‰Ρ‘ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ. Бамая простая идСя — это всё ΡΠ΅Ρ€ΠΈΠ»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² JSON, Π»Π΅Π³ΠΊΠΎ, Π² Π΄Π²Π΅ строчки. ΠžΡ‚Π΄Π°Ρ‘ΠΌ Content-Type, ΠΎΡ‚Π΄Π°Ρ‘ΠΌ JSON.

Но Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Ρ…ΠΎΡ‡Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ JSON. Надо ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚ΡŒ Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄Π΅Ρ€ΠΎΠ². Иногда Π½Π°ΠΌ Π½Π΅ хочСтся этого ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ Π΄Π΅Π»Π°Ρ‚ΡŒ. Π”Π° ΠΈ сСошники скаТут, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ ΠΈΡ‰Π΅ΠΌ, Ρ‚ΠΎ ΠΈΠΌ Π±Π΅Π· Ρ€Π°Π·Π½ΠΈΡ†Ρ‹. А Ссли ΠΌΡ‹ ΠΈΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π²Ρ‹Π΄Π°Ρ‘ΠΌ, Ρ‚ΠΎ ΠΎΠ½ΠΈ скаТут, Ρ‡Ρ‚ΠΎ Ρƒ нас поисковики Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΡƒΡŽΡ‚.

Π§Ρ‚ΠΎ с этим Π΄Π΅Π»Π°Ρ‚ΡŒ? Π‘Π°ΠΌΠΎ собой, ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ HTML. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€ΡƒΡ‡ΠΊΠ°ΠΌΠΈΒ β€” Π½Π΅ ΠΊΠΎΠΌΠΈΠ»ΡŒΡ„ΠΎ, поэтому ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹. Для этого Π΅ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° lua-resty-template.

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ Ρ‚Ρ€ΠΈ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ OPM. OpenResty ΠΈΠ΄Π΅Ρ‚ со своим ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΌ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ΠΎΠΌ, Ρ‡Π΅Ρ€Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, Π² частности, lua-resty-template. Π­Ρ‚ΠΎ простой Π΄Π²ΠΈΠΆΠΎΠΊ шаблонов, Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ Django templates. Π’Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ подстановку ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всё Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠœΡ‹ взяли Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ срСндСрили шаблон ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ Π² Π΄Π²Π΅ строчки. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ счастлив, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ². ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΠ»ΠΈ запрос, ΠΎΠ½ Π½Π° котят ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» Π΅Ρ‰Ρ‘ ΠΈ морского ΠΊΠΎΡ‚ΠΈΠΊΠ°. Мало Π»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚, ΠΎΠ½ искал ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π³ΠΎ, Π½ΠΎ Π½Π΅ ΠΌΠΎΠ³ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свой запрос.

Всё ΠΊΡ€ΡƒΡ‚ΠΎ, Π½ΠΎ ΠΌΡ‹ ΠΆΠ΅ Π² Π΄Π΅Π²Π΅Π»ΠΎΠΏΠΌΠ΅Π½Ρ‚Π΅, ΠΈ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ. Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. Π§Ρ‚ΠΎΠ±Ρ‹ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ NGINX ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ запрос Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Ρ… OpenResty:

  • ΠŸΠ΅Ρ€Π²Π°Ρ Ρ„Π°Π·Π°Β β€” access, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈΡˆΠ΅Π», ΠΈ ΠΌΡ‹ Π½Π° Π½Π΅Π³ΠΎ посмотрСли ΠΏΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌ, ΠΏΠΎ IP-адрСсу, ΠΏΠΎ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ Π΄Π°Π½Π½Ρ‹ΠΌ. МоТно сразу ΠΎΡ‚Ρ€ΡƒΠ±ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, Ссли ΠΎΠ½ Π½Π°ΠΌ Π½Π΅ понравился. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π»ΠΈΠ±ΠΎ, Ссли Π½Π°ΠΌ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ запросов, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡ… Π»Π΅Π³ΠΊΠΎ Ρ€ΡƒΠ±ΠΈΡ‚ΡŒ Π½Π° этой Ρ„Π°Π·Π΅.
  • rewrite. ΠŸΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ запроса.
  • content. ΠžΡ‚Π΄Π°Ρ‘ΠΌ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.
  • headers filter. ПодмСняСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ ΠΎΡ‚Π²Π΅Ρ‚Π°. Если ΠΌΡ‹ использовали proxy_pass, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.
  • body filter. МоТСм ΠΏΠΎΠ΄ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ‚Π΅Π»ΠΎ.
  • logΒ β€” Π»ΠΎΠ³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅. МоТно ΠΏΠΈΡΠ°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈ Π² elasticsearch Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ слоя.

Наша авторизация Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠœΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ это Π² Ρ‚ΠΎΡ‚ location, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ описали Π΄ΠΎ этого, ΠΈ засунСм Ρ‚ΡƒΠ΄Π° Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠœΡ‹ смотрим, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ нас cookie token. Если Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΊΠΈΠ΄Π°Π΅ΠΌ Π½Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Ρ…ΠΈΡ‚Ρ€Ρ‹Π΅ ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ cookie token. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΡ‹ Π΅Ρ‰Ρ‘ ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ Π΅Ρ‘ Π² Redis:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Код Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Redis ΠΎΡ‡Π΅Π½ΡŒ простой ΠΈ Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ отличаСтся ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков. ΠŸΡ€ΠΈ этом вСсь Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄ Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ, Ρ‡Ρ‚ΠΎ здСсь, ΠΎΠ½ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ. Если ΠΏΠΈΡˆΠ΅Ρ‚Π΅ синхронный ΠΊΠΎΠ΄, Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ асинхронно. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΊΠ°ΠΊ с gevent, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сдСлано Ρ…ΠΎΡ€ΠΎΡˆΠΎ.

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм саму Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π“ΠΎΠ²ΠΎΡ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ‚Π΅Π»ΠΎ запроса. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ POST-Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, провСряСм, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠ½ ΠΈ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅. Если Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅, Ρ‚ΠΎ ΠΊΠΈΠ΄Π°Π΅ΠΌ Π½Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΡŽ. А Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅, Ρ‚ΠΎ записываСм token Π² Redis:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

НС Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ cookie, это Ρ‚ΠΎΠΆΠ΅ дСлаСтся Π² Π΄Π²Π΅ строчки:

OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ простой, ΡƒΠΌΠΎΠ·Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ. ΠœΡ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π΄Π΅Π»Π°Ρ‚ΡŒ сСрвис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ людям ΠΊΠΎΡ‚ΠΈΠΊΠΎΠ². Π₯отя ΠΊΡ‚ΠΎ нас Π·Π½Π°Π΅Ρ‚. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ пройдёмся ΠΏΠΎ Ρ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½Π΅.

  • ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡ‚ΠΈΡ‡Π½Ρ‹ΠΉ бэкСнд. Иногда Π½Π°ΠΌ трСбуСтся Π² бэкСнд Π²Ρ‹Π΄Π°Ρ‚ΡŒ совсСм Ρ‡ΡƒΡ‚ΡŒ-Ρ‡ΡƒΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ…: Π³Π΄Π΅-Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄Π°Ρ‚Ρƒ ΠΏΠΎΠ΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ, Π³Π΄Π΅-Ρ‚ΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ список вывСсти, ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, сколько сСйчас ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° сайтС, ΠΏΡ€ΠΈΠΊΡ€ΡƒΡ‚ΠΈΡ‚ΡŒ счётчик ΠΈΠ»ΠΈ статистику. Π§Ρ‚ΠΎ-Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ нСбольшоС. ΠœΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ кусочки ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. На этом получится быстро, Π»Π΅Π³ΠΊΠΎ ΠΈ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ.
  • ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΠ½Π³ Π΄Π°Π½Π½Ρ‹Ρ…. Иногда Π½Π°ΠΌ хочСтся Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π² Π½Π°ΡˆΡƒ страничку Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ, ΠΏΡ€ΠΈΡ‡Ρ‘ΠΌ эту Ρ€Π΅ΠΊΠ»Π°ΠΌΡƒ ΠΌΡ‹ Π±Π΅Ρ€Ρ‘ΠΌ API-запросами. Π’Π°ΠΊΠΎΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ здСсь. ΠœΡ‹ Π½Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌ наш бэкСнд, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Ρ‚Π°ΠΊ сидит тяТСло Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. МоТно Π²Π·ΡΡ‚ΡŒ ΠΈ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ здСсь. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ»Π΅ΠΏΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ JS ΠΈΠ»ΠΈ, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, Ρ€Π°Π·Π»Π΅ΠΏΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΎΡ‚Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.
  • Ѐасад для микросСрвиса. Π­Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ кСйс, я Π΅Π³ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Π». Π”ΠΎ этого я Ρ€Π°Π±ΠΎΡ‚Π°Π» Π² ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Tenzor, которая занимаСтся элСктронной ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ, обСспСчиваСт ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ ΡŽΡ€Π»ΠΈΡ† Π² странС. ΠœΡ‹ сдСлали сСрвис, Ρ‚Π°ΠΌ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ этого ΠΆΠ΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° сдСланы ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π²Π΅Ρ‰ΠΈ: ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ, авторизация ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅.
    OpenResty ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΊΠ»Π΅ΠΉ для Π²Π°ΡˆΠΈΡ… микросСрвисов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчит Π΅Π΄ΠΈΠ½Ρ‹ΠΉ доступ ΠΊΠΎ всСму ΠΈ Π΅Π΄ΠΈΠ½Ρ‹ΠΉ интСрфСйс. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ микросСрвисы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ написаны Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²ΠΎΡ‚ здСсь Ρƒ вас Node.js, здСсь Ρƒ вас PHP, здСсь Python, здСсь стоит какая-Ρ‚ΠΎ ΡˆΡ‚ΡƒΠΊΠ° Π½Π° Erlang, ΠΌΡ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄ Π²Π΅Π·Π΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ OpenResty ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡ‚ΠΊΠ½ΡƒΡ‚ΡŒ Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚.

  • Бтатистика ΠΈ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠ°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ NGINX стоит Π½Π° Π²Ρ…ΠΎΠ΄Π΅, ΠΈ всС запросы ΠΈΠ΄ΡƒΡ‚ Ρ‡Π΅Ρ€Π΅Π· Π½Π΅Π³ΠΎ. ИмСнно Π² этом мСстС ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ. МоТно Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сразу ΠΏΠΎΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°ΠΊΠΈΠ½ΡƒΡ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚ΠΎΡ‚ ΠΆΠ΅ Elasticsearch, Logstash ΠΈΠ»ΠΈ просто Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π»ΠΎΠ³ ΠΈ ΠΏΠΎΡ‚ΠΎΠΌ ΠΊΡƒΠ΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.
  • ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ систСмы. НапримСр, ΠΎΠ½Π»Π°ΠΉΠ½-ΠΈΠ³Ρ€Ρ‹ Ρ‚ΠΎΠΆΠ΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ. БСгодня Π² ΠšΠ΅ΠΉΠΏΡ‚Π°ΡƒΠ½Π΅ АлСксандр Π“Π»Π°Π΄Ρ‹Ρˆ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ быстро ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΡƒΡŽ ΠΈΠ³Ρ€Ρƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ OpenResty.
  • Π€ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ запросов (WAF). БСйчас ΠΌΠΎΠ΄Π½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ всякиС web application firewall, Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ сСрвисов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ OpenResty ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ сСбС web application firewall, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто ΠΈ Π»Π΅Π³ΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ запросы ΠΏΠΎ вашим трСбованиям. Если Ρƒ вас Python, Ρ‚ΠΎ Π²Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ PHP Π²Π°ΠΌ Ρ‚ΠΎΡ‡Π½ΠΎ нСзаиндТСктят, Ссли Π²Ρ‹, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΠ· консоли Π΅Π³ΠΎ Π½Π΅ спаунитС Π½ΠΈΠ³Π΄Π΅. Π’Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ Ρƒ вас MySQL ΠΈ Python. НавСрноС, Ρ‚ΡƒΡ‚ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ directory traversal ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π·Π°ΠΈΠ½Π΄ΠΆΠ΅ΠΊΡ‚ΠΈΡ‚ΡŒ Π² Π±Π°Π·Ρƒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Ρ‚ΡŒ стрёмныС запросы быстро ΠΈ дСшСво сразу Π½Π° Ρ„Ρ€ΠΎΠ½Ρ‚Π΅.
  • БообщСство. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ OpenResty построСн Π½Π° Π±Π°Π·Π΅ NGINX, Ρ‚ΠΎ Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ бонус — это NGINX-ΠΊΠΎΠΌΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ. Оно ΠΎΡ‡Π΅Π½ΡŒ большоС, ΠΈ приличная Ρ‡Π°ΡΡ‚ΡŒ вопросов, которая Ρƒ вас Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚ ΠΏΠΎΠ½Π°Ρ‡Π°Π»Ρƒ, ΡƒΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½Π° NGINX-сообщСством.

    Lua-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ. Π’Ρ‡Π΅Ρ€Π° я общался с рСбятами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΡˆΠ»ΠΈ Π½Π° ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΉ дСнь HighLoad++ ΠΈ ΡƒΡΠ»Ρ‹ΡˆΠ°Π», Ρ‡Ρ‚ΠΎ Π½Π° Lua написан Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Tarantool. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ, Π½Π° Lua ΠΌΠ½ΠΎΠ³ΠΎ Ρ‡Π΅Π³ΠΎ написано. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: OpenResty, XMPP-сСрвСр Prosody, ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Π΄Π²ΠΈΠΆΠΎΠΊ Love2D, Lua скриптуСтся Π² Warcraft ΠΈ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… мСстах. Lua-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ, Ρƒ Π½ΠΈΡ… большоС ΠΈ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠ΅ ΠΊΠΎΠΌΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ. ВсС ΠΌΠΎΠΈ вопросы ΠΏΠΎ Lua Ρ€Π΅ΡˆΠ°Π»ΠΈΡΡŒ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… часов. Когда пишСшь Π² список рассылки, Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Ρ‡Π΅Ρ€Π΅Π· нСсколько ΠΌΠΈΠ½ΡƒΡ‚ ΡƒΠΆΠ΅ ΠΊΡƒΡ‡Π° ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Ρ‡Ρ‚ΠΎ ΠΈ ΠΊΠ°ΠΊ, Ρ‡Ρ‚ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ. Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π·Π΄ΠΎΡ€ΠΎΠ²ΠΎ. К соТалСнию, Π½Π΅ Π²Π΅Π·Π΄Π΅ Ρ‚Π°ΠΊΠΎΠ΅ Π΄ΠΎΠ±Ρ€ΠΎΠ΅ Π΄ΡƒΡˆΠ΅Π²Π½ΠΎΠ΅ ΠΊΠΎΠΌΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ.
    По OpenResty Π΅ΡΡ‚ΡŒ GitHub, Ρ‚Π°ΠΌ ΠΌΠΎΠΆΠ½ΠΎ завСсти issue, Ссли Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ сломалось. Π•ΡΡ‚ΡŒ список рассылки Π½Π° Google Groups, Π³Π΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‰ΠΈΠ΅ вопросы, Π΅ΡΡ‚ΡŒ рассылка Π½Π° китайском — ΠΌΠ°Π»ΠΎ Π»ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚, английским Π²Ρ‹ Π½Π΅ Π²Π»Π°Π΄Π΅Π΅Ρ‚Π΅, Π° знания китайского Π΅ΡΡ‚ΡŒ.

Π˜Ρ‚ΠΎΠ³ΠΈ

  • НадСюсь смог донСсти, Ρ‡Ρ‚ΠΎ OpenRestyΒ β€” это ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, Π·Π°Ρ‚ΠΎΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄ Π²Π΅Π±.
  • Π£ Π½Π΅Π³ΠΎ Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΠΎΡ€ΠΎΠ³ вхоТдСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠ΄ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‘ΠΌ ΠΌΡ‹ пишСм, язык довольно прост ΠΈ минималистичСн.
  • Он прСдоставляСт асинхронный I/O Π±Π΅Π· ΠΊΠΎΠ»Π»Π±Π΅ΠΊΠΎΠ², Ρƒ нас Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ лапши, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² NodeJS.
  • Π£ Π½Π΅Π³ΠΎ Π»Π΅Π³ΠΊΠΈΠΉ Π΄Π΅ΠΏΠ»ΠΎΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ NGINX c Π½ΡƒΠΆΠ½Ρ‹ΠΌ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΌ ΠΈ наш ΠΊΠΎΠ΄, ΠΈ всё сразу Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.
  • Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ ΠΈ ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²ΠΎΠ΅ сообщСство.

Π― Π½Π΅ рассказал Π² дСталях ΠΊΠ°ΠΊ дСлаСтся ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ, Ρ‚Π°ΠΌ получался ΠΎΡ‡Π΅Π½ΡŒ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ рассказ.

Бпасибо за вниманиС!


Π’Π»Π°Π΄ΠΈΠΌΠΈΡ€ ΠŸΡ€ΠΎΡ‚Π°ΡΠΎΠ²Β β€” OpenResty: ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ NGINX Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ сСрвСр ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com