H2o: ๋‹ค์‹œ ์ž‘์„ฑํ•˜์„ธ์š” ... ๋‹ค์‹œ, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

์— ๋งŒ๋“  2016๋…„ 02์›” 04์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: h2o/h2o

h2o์—์„œ URL์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ฝค์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. mruby๋Š” ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ฐฉ๋ฒ•์€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚˜์˜ ์ตœ๊ทผ ๋„์ „์„ ๋น ๋ฅด๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค.

์„œ๋ฒ„์—์„œ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ์„œ๋ฒ„์˜ ์‹ค์ œ ํŒŒ์ผ์— ๋งคํ•‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๊ณต๋ฐฑ (๋˜๋Š” URL ์ธ์ฝ”๋”ฉ ๋œ ๊ฒฝ์šฐ % 20)์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด :
example.com/search?item=something%20and%somethingelse๊ฐ€ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค.
example.com/search/something_and_somethingelse

h2o ๋ฐ Rack specs์— ๋Œ€ํ•œ mruby ์˜ˆ์ œ๋ฅผ ์ฝ์—ˆ์ง€๋งŒ h2o์—๊ฒŒ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•˜๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•ด์•ผํ•˜๋Š” ๋‚ด์šฉ์„ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. PATH_INFO ๋ฐ QUERY_STRING ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ๊ฐ’์„ h2o ์„œ๋ฒ„์— ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ ( "๊ฑฐ๊ธฐ ๋Œ€์‹  ์—ฌ๊ธฐ๋ฅผ๋ณด์‹ญ์‹œ์˜ค")?

๊ด€๋ จ ๋ฉ”๋ชจ์—์„œ " rack-rewrite "๋ผ๊ณ ํ•˜๋Š” ์ž˜ ์•Œ๋ ค์ง„ ๋ณด์„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๋‚ด ์žฌ ์ž‘์„ฑ ๊ทœ์น™์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ gem์ด ๋‚ด h2o ์„œ๋ฒ„์™€ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

enhancement help wanted mruby

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด mruby๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด NGINX์—์„œ ์˜ค๋Š” ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋งค์šฐ ์ง€๋ฃจํ•˜๊ณ  ๋ณต์žกํ•ด ๋ณด์ธ๋‹ค๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

PATH_INFO ๋ฐ QUERY_STRING ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒˆ ๊ฐ’์„ h2o ์„œ๋ฒ„์— ๋‹ค์‹œ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ ( "๊ฑฐ๊ธฐ ๋Œ€์‹  ์—ฌ๊ธฐ๋ฅผ๋ณด์‹ญ์‹œ์˜ค")?

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ reproxy: on ๋ฅผ ์„ค์ •ํ•˜๊ณ  x-reproxy-url ํ—ค๋” ์„ธํŠธ๊ฐ€์žˆ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” reproxy ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ํ—ค๋”๋กœ ์ง€์ •๋œ URL์˜ ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.
์ฐธ์กฐ : https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request

๊ด€๋ จ ๋ฉ”๋ชจ์—์„œ "rack-rewrite"๋ผ๋Š” ์ž˜ ์•Œ๋ ค์ง„ ๋ณด์„์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๋‚ด ์žฌ ์ž‘์„ฑ ๊ทœ์น™์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋Ÿฌํ•œ gem์ด ๋‚ด h2o ์„œ๋ฒ„์™€ ์–ด๋–ป๊ฒŒ ๊ฒฐํ•ฉ ๋  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์–ด๋”˜๊ฐ€์— ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

Rack-rewrite๋Š” Rack์—์„œ ์ œ๊ณตํ•˜๋Š” _libraries_์— ์˜์กดํ•˜๋ฉฐ mruby์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค (IMO๊ฐ€ mruby๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€ ์•Š์Šต๋‹ˆ๋‹ค).

mruby๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ทœ์น™์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฆฌ๋””๋ ‰์…˜์„ ์ง€์ •ํ•˜๋Š”๋ณด๋‹ค ์„ ์–ธ์ ์ธ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋ž™ ์žฌ ์ž‘์„ฑ ํฌํŠธ ๋‚˜ ๋น„์Šทํ•œ ๊ฒƒ์„ ์ƒ๊ฐ ํ•ด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ •๋ง ๊ณ ๋ง™์Šต๋‹ˆ๋‹ค! ์ด์ œ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ก์„ ์œ„ํ•ด-๊ทธ๋ฆฌ๊ณ  ๋น„์Šทํ•œ ๊ฒƒ์„ ์ฐพ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ : h2o.conf์˜ ๋‹ค์Œ ๋ถ€๋ถ„์€ / test / ์•„๋ž˜์˜ ๋ชจ๋“  URL์—์„œ ๋‹จ์ผ ๋นˆ ๊ณต๊ฐ„์„ ๋ฐ‘์ค„๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์˜ˆ : https://www.example.com/test/something%20and%20somethingelse ๋Š”
https://www.example.com/test/something_and_somethingelse

h2o๊ฐ€ ์žฌ ์ž‘์„ฑ๋œ ํŒŒ์ผ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ PHP ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฆฌ๋””๋ ‰์…˜๋ฉ๋‹ˆ๋‹ค.์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์ œ ๊ฒฝ์šฐ์—๋Š” ์›ํ•˜๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€์ ธ ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค.

      "/test":
        reproxy: ON
        mruby.handler: |
          lambda do |env|
            if /^\/([^ ]+[ ][^ ]+)/.match(env["PATH_INFO"]) # All URLs with at least one empty space NOT in the beginning or end
              str = "#{$1}"
              str = str.gsub( %r{[ ]}, '_') # replace every single empty space with an underscore
              return [307, {"x-reproxy-url" => "https://www.example.com/test/#{str}"}, []] # reproxy to rewritten URL
            end
            return [399, {}, []]
          end
        file.dir: "/usr/local/www/apache22/data/test/json"   # serve static files if found
        redirect:           # if not found, internally redirect to /test/index.php/<path>
          url: /test/index.php/
          internal: YES
          status: 307

๋‚˜๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด mruby๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด NGINX์—์„œ ์˜ค๋Š” ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋งค์šฐ ์ง€๋ฃจํ•˜๊ณ  ๋ณต์žกํ•ด ๋ณด์ธ๋‹ค๊ณ  ๋งํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰