programing

랙 미들웨어란?

css3 2023. 7. 9. 12:36

랙 미들웨어란?

Ruby에서 랙 미들웨어란 무엇입니까?저는 "미들웨어"가 무엇을 의미하는지에 대한 좋은 설명을 찾을 수 없었습니다.

설계에 따른 랙

랙 미들웨어는 "요청 및 응답을 필터링하는 방법" 이상의 기능을 합니다. 랙을 사용하는 웹 서버의 파이프라인 설계 패턴을 구현하는 것입니다.

요청을 처리하는 여러 단계를 매우 깨끗하게 구분합니다. 즉, 문제를 분리하는 것이 모든 잘 설계된 소프트웨어 제품의 핵심 목표입니다.

예를 들어 랙을 사용하면 파이프라인의 개별 단계에서 다음 작업을 수행할 수 있습니다.

  • 인증: 요청이 도착하면 사용자 로그온 세부 정보가 정확합니까?이 OAuth, HTTP 기본 인증, 이름/비밀번호를 어떻게 확인합니까?

  • 권한 부여: "사용자에게 이 특정 작업을 수행할 권한이 있습니까?", 즉 역할 기반 보안입니다.

  • 캐싱: 이 요청을 이미 처리했습니다. 캐시된 결과를 반환할 수 있습니까?

  • 장식: 다운스트림 처리를 개선하기 위해 요청을 어떻게 개선할 수 있습니까?

  • 성능 사용량 모니터링: 요청 및 응답에서 얻을 수 있는 통계는 무엇입니까?

  • 실행: 실제로 요청을 처리하고 응답을 제공합니다.

서로 다른 단계를 분리할 수 있고 선택적으로 포함할 수 있다는 것은 잘 구성된 응용프로그램을 개발하는 데 큰 도움이 됩니다.

지역 사회

또한 Rack Middleware를 중심으로 한 우수한 환경 시스템이 개발되고 있습니다. 위의 모든 단계와 그 이상을 수행할 수 있는 사전 구축된 랙 구성 요소를 찾을 수 있을 것입니다.미들웨어 목록은 Rack GitHub 위키를 참조하십시오.

미들웨어란?

미들웨어는 일부 작업의 실행에 직접적으로 관여하지는 않지만 도움이 되는 소프트웨어 구성 요소/라이브러리를 가리키는 끔찍한 용어입니다.매우 일반적인 예로는 로깅, 인증 및 기타 일반적인 수평 처리 구성 요소가 있습니다.이러한 것들은 여러 애플리케이션에 걸쳐 모두가 필요로 하는 것이지만, 자신을 구축하는 데 관심이 있는(또는 있어야 하는) 사람은 많지 않습니다.

추가 정보

  • 요청을 필터링하는 방법이라는 의견은 RailsCast 151화: Rack Middleware 화면 캐스트에서 나온 것으로 보입니다.

  • 랙 미들웨어는 랙에서 발전했으며 랙 미들웨어 소개에 훌륭한 소개가 있습니다.

  • 여기 위키피디아에 미들웨어에 대한 소개가 있습니다.

우선 랙은 정확히 두 가지입니다.

  • 웹 서버 인터페이스 규칙
  • 보석

랙 - 웹 서버 인터페이스

랙의 가장 기본적인 것은 단순한 규약입니다.모든 랙 호환 웹 서버는 항상 사용자가 제공한 개체에 대해 호출 메소드를 호출하고 해당 메소드의 결과를 제공합니다.랙은 이 호출 방법의 모양과 반환할 내용을 정확하게 지정합니다.그건 랙입니다.

간단하게 해보겠습니다.랙 호환 웹 서버로 WEBrick을 사용하겠지만, 그들 중 누구라도 좋습니다.JSON 문자열을 반환하는 간단한 웹 응용 프로그램을 만듭니다.이를 위해 config.ru 라는 파일을 만들 것입니다.config.ru 은 랙 호환 웹 서버에서 config.ru 의 내용을 실행하는 랙 보석의 명령 랙업에 의해 자동으로 호출됩니다.다음을 config.ru 파일에 추가합니다.

class JSONServer
  def call(env)
    [200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
  end
end

map '/hello.json' do
  run JSONServer.new
end

규약에서 지정한 대로 서버에는 환경 해시를 수락하고 웹 서버가 서비스할 [status, headers, body] 형식의 배열을 반환하는 call이라는 메서드가 있습니다.랙업에 전화해서 해보겠습니다.기본 랙 호환 서버(WEBrick 또는 Mongrel)가 시작되고 요청이 처리될 때까지 즉시 대기합니다.

$ rackup
[2012-02-19 22:39:26] INFO  WEBrick 1.3.1
[2012-02-19 22:39:26] INFO  ruby 1.9.3 (2012-01-17) [x86_64-darwin11.2.0]
[2012-02-19 22:39:26] INFO  WEBrick::HTTPServer#start: pid=16121 port=9292

JSON을 http://localhost:9292/hello.json그고리 voila:

$ curl http://localhost:9292/hello.json
{ message: "Hello!" }

그건 효과가 있다.좋습니다! 그것이 레일즈든 시나트라든 모든 웹 프레임워크의 기초입니다.어느 시점에서 호출 방법을 구현하고 모든 프레임워크 코드를 검토한 후 마지막으로 일반적인 [상태, 머리글, 본문] 양식으로 응답을 반환합니다.

를 들어 에서 랙 은 Ruby on Rails에 합니다.ActionDispatch::Routing.Mapper다음과 같은 클래스:

module ActionDispatch
  module Routing
    class Mapper
      ...
      def initialize(app, constraints, request)
        @app, @constraints, @request = app, constraints, request
      end

      def matches?(env)
        req = @request.new(env)
        ...
        return true
      end

      def call(env)
        matches?(env) ? @app.call(env) : [ 404, {'X-Cascade' => 'pass'}, [] ]
      end
      ...
  end
end

따라서 기본적으로 레일즈는 일치하는 경로가 있으면 환경 해시에 따라 검사합니다.이 경우 응용 프로그램에 환경 해시를 전달하여 응답을 계산하고, 그렇지 않으면 즉시 404로 응답합니다.따라서 랙 인터페이스 규칙을 준수하는 모든 웹 서버는 완전한 Rails 애플리케이션을 지원할 수 있습니다.

미들웨어

랙은 미들웨어 계층 생성도 지원합니다.그들은 기본적으로 요청을 가로채고, 그것으로 무언가를 하고 전달합니다.이 기능은 다양한 작업에 매우 유용합니다.

요청 시간도 측정하는 JSON 서버에 로깅을 추가하려고 합니다.다음과 같은 작업을 수행하는 미들웨어 로거를 간단히 만들 수 있습니다.

class RackLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    @start = Time.now
    @status, @headers, @body = @app.call(env)
    @duration = ((Time.now - @start).to_f * 1000).round(2)

    puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
    [@status, @headers, @body]
  end
end

생성되면 실제 랙 응용프로그램의 복사본이 저장됩니다.이는 JSON 서버의 예입니다.으로 미들웨어의 하고 Rack의 호출 방식을 합니다.[status, headers, body]어레이, JSON서버가 반환하는 것처럼.

JSON 은 JSON 서버 호출과 함께 됩니다.@app.call(env)을 "" " " " " " " " 로거를 합니다.[@status, @headers, @body].

작은 rackup.ru 에서 이 미들웨어를 사용하도록 하려면 다음과 같이 use RackLogger를 추가합니다.

class JSONServer
  def call(env)
    [200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
  end
end

class RackLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    @start = Time.now
    @status, @headers, @body = @app.call(env)
    @duration = ((Time.now - @start).to_f * 1000).round(2)

    puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
    [@status, @headers, @body]
  end
end

use RackLogger

map '/hello.json' do
  run JSONServer.new
end   

서버를 다시 시작하고 voila는 모든 요청에 대한 로그를 출력합니다.랙을 사용하면 추가된 순서대로 호출되는 여러 미들웨어를 추가할 수 있습니다.이는 랙 애플리케이션의 핵심을 변경하지 않고도 기능을 추가할 수 있는 좋은 방법입니다.

랙 - 더 젬

랙은 무엇보다도 전통적인 랙이지만 뛰어난 기능을 제공하는 보석이기도 합니다.JSON 서버에 이미 사용했던 rackup 명령어 중 하나입니다.하지만 더 있어요!랙 보석은 정적 파일 또는 전체 디렉터리를 제공하는 것과 같은 많은 사용 사례에 대한 응용 프로그램을 거의 제공하지 않습니다.htmls/index.html에 위치한 매우 기본적인 HTML 파일과 같은 간단한 파일을 제공하는 방법을 살펴보겠습니다.

<!DOCTYPE HTML>
  <html>
  <head>
    <title>The Index</title>
  </head>

  <body>
    <p>Index Page</p>
  </body>
</html>

웹 사이트 루트에서 이 파일을 제공할 수도 있으므로 다음을 config.ru 에 추가해 보겠습니다.

map '/' do
  run Rack::File.new "htmls/index.html"
end

우리가 방문한다면,http://localhost:9292우리는 우리의 HTML 파일이 완벽하게 렌더링된 것을 봅니다.쉬웠지, 그렇죠?

/javascripts 아래에 javascripts 파일을 만들고 다음을 config.ru 에 추가하여 전체 javascript 파일 디렉토리를 추가합니다.

map '/javascripts' do
  run Rack::Directory.new "javascripts"
end

서버를 다시 시작하고 다음을 방문합니다.http://localhost:9292/javascript이제 어디서든 직접 포함할 수 있는 모든 자바스크립트 파일 목록을 볼 수 있습니다.

저는 오랫동안 Rack 자신을 이해하는 데 문제가 있었습니다.는 이 미니 루비 웹 서버를 직접 만들고 나서야 완전히 이해했습니다.Rack(이야기 형식)에 대한 지식을 블로그에 공유했습니다. http://blog.gauravchande.com/what-is-rack-in-ruby-rails

피드백은 더할 나위 없이 좋습니다.

랙이란?

Rack은 Ruby 및 Ruby 프레임워크를 지원하는 웹 서버 간의 최소한의 인터페이스를 제공합니다.

랙을 사용하여 랙 애플리케이션을 작성할 수 있습니다.

Rack은 환경 해시(CGI와 유사한 헤더로 구성된 클라이언트의 HTTP 요청에 포함된 해시)를 Rack Application으로 전달합니다. 이 해시에 포함된 것을 사용하여 원하는 모든 작업을 수행할 수 있습니다.

랙 애플리케이션이란?

Rack을하려면 Rack에 대응하는 인 '을 .#call으로 " " " " "으로 됩니다.env).#call정확히 세 개의 값 배열을 반환해야 합니다.

  • 상태 코드(예: '200'),
  • 머리글 해시,
  • 응답 본문(Ruby 메서드에 응답해야 함)each).

이러한 배열을 반환하는 랙 응용프로그램을 작성할 수 있습니다. 이 응용프로그램은 클라이언트, 랙별로 응답 내부로 다시 전송됩니다(실제로 Click [문서로 이동하려면] 클릭).

매우 단순한 랙 애플리케이션:

  • gem install rack
  • 성을 합니다.config.ru파일 - 랙은 이것을 찾을 수 있습니다.

반환하는 Application(""의 을 것입니다.Rack::Response는 String: who를 "Hello, World!".

는 " 명을사여로컬서시다작니합버를용다하" 합니다.rackup.

브라우저에서 관련 포트를 방문하면 뷰포트에 렌더링된 "Hello, World!"가 표시됩니다.

#./message_app.rb
class MessageApp
  def call(env)
    [200, {}, ['Hello, World!']]
  end
end

#./config.ru
require_relative './message_app'

run MessageApp.new

로서시작으로 서버 rackup그리고 localhost:9292를 방문하면 'Hello, World!'가 렌더링된 것을 볼 수 있습니다.

설명은 , 서 본질적으로 서버를 통해 Rack을 이 인스턴스화하는 입니다. 즉, " " " ", " ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", ", "MessageApp그리고 실행callMethod)에합니다.env인수).

값 이를 하여 Rack의 합니다.Rack::Response다시 클라이언트로 전송합니다.브라우저는 마법을 사용하여 화면에 'Hello, World!'를 인쇄합니다.

덧붙여서, 환경 해시가 어떻게 생겼는지 보고 싶다면, 다음과 같이 입력합니다.puts envdef call(env).

최소한 여기에 기록한 것은 랙 애플리케이션입니다!

랙 응용프로그램이 들어오는 환경 해시와 상호 작용하도록 만들기

에서, 는 작의은서에앱리우다,와 상호 할 수 있습니다.env해시(환경 해시에 대한 자세한 내용은 여기 참조).

사용자가 URL에 자신의 쿼리 문자열을 입력할 수 있는 기능을 구현하여 해당 문자열이 HTTP 요청에 존재하며 환경 해시의 키/값 쌍 중 하나에 값으로 캡슐화됩니다.

Rack 앱은 환경 해시에서 쿼리 문자열에 액세스하고 응답의 본문을 통해 클라이언트(이 경우 브라우저)로 다시 보냅니다.

환경 해시의 랙 문서에서: "QUERY_STRING: 요청 URL 중에서 ? 뒤에 오는 부분입니다(있는 경우). 비어 있을 수 있지만 항상 필요합니다!"

#./message_app.rb
class MessageApp
  def call(env)
    message = env['QUERY_STRING']
    [200, {}, [message]]
  end
end

지금이다,rackup 방문와를 하세요.localhost:9292?hello(?hello쿼리 문자열이 됩니다.) 그러면 뷰포트에 '안녕하세요'가 렌더링됩니다.

랙 미들웨어

다음을 수행:

  • Rack Middleware를 코드베이스에 삽입합니다. 클래스:MessageSetter,
  • 이 됩니다.env,
  • MessageSetter를 합니다.'MESSAGE' 해시에 대한 키은 env 시 대 키 가 는 치 그'Hello, World!'한다면env['QUERY_STRING']비어 있습니다.env['QUERY_STRING']아니라면,
  • 마침내, 그것은 돌아올 것입니다.@app.call(env)-@app'것: 'Stack' 음이앱것는:MessageApp.

먼저, '롱핸드' 버전:

#./middleware/message_setter.rb
class MessageSetter
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['QUERY_STRING'].empty?
      env['MESSAGE'] = 'Hello, World!'
    else
      env['MESSAGE'] = env['QUERY_STRING']
    end
    @app.call(env)
  end
end

#./message_app.rb (same as before)
class MessageApp
  def call(env)
    message = env['QUERY_STRING']
    [200, {}, [message]]
  end
end

#config.ru
require_relative './message_app'
require_relative './middleware/message_setter'

app = Rack::Builder.new do
  use MessageSetter
  run MessageApp.new
end

run app

랙에서:: Builder 문서는 다음과 같습니다.Rack::Builder랙 응용 프로그램을 반복적으로 구성하기 위해 소형 DSL을 구현합니다.할 ' level'수 합니다.하위 수준의 응용 프로그램으로 진행되는 모든 요청은 먼저 미들웨어에서 처리됩니다.

#use스택에서 사용할 미들웨어를 지정합니다.미들웨어를 논쟁거리로 삼습니다.

랙 미들웨어는 다음을 수행해야 합니다.

  • 스택의 다음 응용 프로그램을 매개 변수로 사용하는 생성자가 있습니다.
  • 에 합니다.call환경 해시를 매개 변수로 사용하는 메서드입니다.

는 'Middleware'입니다.MessageSetter는'messageSetter'입니다.initialize 응용 프로그램은 '다음 응용 프로그램'입니다.MessageApp.

그래서 여기, 무엇 때문에.Rack::Builder후드아서합니다에래▁under▁does▁the합니다.appMessageSetterinitialize는 은법입니다.MessageApp.

(계속 진행하기 전에 위의 내용에 대해 머리를 숙이세요)

따라서 미들웨어의 각 부분은 기본적으로 기존 환경 해시를 체인의 다음 애플리케이션으로 '전달'하므로 스택의 다음 애플리케이션으로 전달하기 전에 미들웨어 내에서 해당 환경 해시를 변형할 수 있습니다.

#run 개는인사용다니에 대응하는 합니다.#call Rack Response(" "(으)로 표시되는" 를합니다.Rack::Response).

결론들

용사를 합니다.Rack::Builder할 수 응용 모든 각 된 후 에는 당은미체구대우에션이한모최요스의최은청처경종처것차의로전미각리으되기적에우될리의리다니입들웨로례어해에해조에의종택신각든수케고의어신있당플웨들을축할인리애우▁youin▁ofation▁will▁to▁be▁middle▁any▁construct▁applic▁request처경▁chains의▁in▁case▁(▁can차wa것▁your미▁middle각▁inres▁by,▁stack전MessageApp이것은 요청을 처리하는 여러 단계를 구분하기 때문에 매우 유용합니다. 분리'의에서 보면, 보다 더 깨끗할 수 고민 분리'라는 측면에서 이보다 더 깨끗할 수는 없습니다!

다음과 같은 작업을 처리하는 여러 미들웨어로 구성된 '요청 파이프라인'을 구성할 수 있습니다.

  • 인증
  • 권한 부여
  • 캐싱
  • 장식
  • 성능 및 사용량 모니터링
  • 실행(실제 요청 처리 및 응답 제공)

(이 스레드의 다른 답변의 글머리 기호 위)

전문적인 시나트라 애플리케이션에서 자주 볼 수 있습니다.시나트라는 랙을 사용합니다!시나트라의 정의는 여기를 참조하십시오!

마막으로의우리, 지의▁as,.config.ru다음과 같은 기능을 제공하는 짧은 글씨체로 작성할 수 있습니다(일반적으로 확인할 수 있음).

require_relative './message_app'
require_relative './middleware/message_setter'

use MessageSetter
run MessageApp.new

그리고 좀 더 으로 어떤 것이 무엇인지를 요.MessageApp하고 있습니다. 여기 그것의 '긴 손' 버전이 있습니다. 그것을 보여줍니다.#call 스 턴 있 만 다 고Rack::Response필요한 세 개의 인수를 사용합니다.

class MessageApp
  def call(env)
    Rack::Response.new([env['MESSAGE']], 200, {})
  end
end

유용한 링크

image showing rack in between unicorn and rails

랙은 HTTP 요청/응답을 추상화하기 위한 간단한 인터페이스를 제공하는 보석입니다.랙은 어댑터로 웹 프레임워크(Rails, Sinatra 등)와 웹 서버(Unicorn, Puma) 사이에 위치합니다.위의 이미지에서 이는 유니콘 서버가 유니콘에 대해 알지 못하는 레일과 레일에 대해 알지 못하는 것으로부터 완전히 독립적으로 유지합니다.이는 느슨한 결합, 문제 분리좋은 예입니다.

위 이미지는 랙 https://youtu.be/3PnUV9QzB0g 에서 진행된 이 레일 컨퍼런스 강연에서 나온 것입니다. 더 깊은 이해를 위해 시청할 것을 권장합니다.

config.ru runnable 실행 가능

app = Proc.new do |env|
  [
    200,
    {
      'Content-Type' => 'text/plain'
    },
    ["main\n"]
  ]
end

class Middleware
  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @body = @app.call(env)
    [@status, @headers, @body << "Middleware\n"]
  end
end

use(Middleware)

run(app)

려달을 합니다.rackup 방문와를 하세요.localhost:9292출력은 다음과 같습니다.

main
Middleware

그래서 확실한 것은Middleware기본 앱을 래핑하고 호출합니다.따라서 요청을 사전 처리하고 어떤 방식으로든 응답을 사후 처리할 수 있습니다.

http://guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-middleware-stack 에서 설명한 바와 같이 Rails는 많은 기능을 위해 Rack 미들웨어를 사용하고 있으며, 사용자는 자신의 기능도 추가할 수 있습니다.config.middleware.use가정적인 방법

미들웨어에 기능을 구현하면 레일뿐만 아니라 모든 주요 Rack 프레임워크에서 재사용할 수 있다는 장점이 있습니다.

랙 미들웨어는 응용프로그램에 들어오는 요청과 응답을 필터링하는 방법입니다.미들웨어 구성요소는 클라이언트와 서버 사이에 위치하여 인바운드 요청과 아웃바운드 응답을 처리하지만 웹 서버와 대화하는 데 사용할 수 있는 인터페이스 이상의 기능을 제공합니다.일반적으로 Ruby 클래스인 모듈을 그룹화 및 정렬하고 모듈 간의 종속성을 지정하는 데 사용됩니다.랙 미들웨어 모듈은 다음과 같이 해야 합니다. – 스택에서 다음 애플리케이션을 매개 변수로 사용하는 생성자가 있어야 합니다. – 환경 해시를 매개 변수로 사용하는 "호출" 방법에 응답해야 합니다.이 호출에서 반환되는 값은 상태 코드, 환경 해시 및 응답 본문의 배열입니다.

랙 미들웨어를 사용하여 몇 가지 문제를 해결했습니다.

  1. 사용자 지정 Rack 미들웨어로 JSON 구문 분석 오류를 포착하고 클라이언트가 고장 난 JSON을 제출할 때 적절한 형식의 오류 메시지를 반환합니다.
  2. 랙을 통한 콘텐츠 압축::Deflater

두 경우 모두 상당히 우아한 수정을 제공했습니다.

랙 - 웹 및 앱 서버 인터페이스

Rack은 웹 서버가 응용 프로그램과 통신할 수 있는 인터페이스를 제공하는 Ruby 패키지입니다.웹 서버와 앱 사이에 미들웨어 구성 요소를 쉽게 추가하여 요청/응답 동작을 수정할 수 있습니다.미들웨어 구성요소는 클라이언트와 서버 사이에 위치하여 인바운드 요청 및 아웃바운드 응답을 처리합니다.

일반적으로 말하면, 기본적으로 서버와 Rails 앱(또는 다른 Ruby 앱) 서로 대화하는 방법에 대한 일련의 지침일 뿐입니다.

Rack을 사용하려면 호출 방법에 응답하여 환경 해시를 매개 변수로 사용하고 다음과 같은 세 가지 요소가 포함된 Array를 반환하는 "app"를 제공합니다.

  • HTTP 응답 코드
  • 머리글 해시
  • 응답 본문. 각 요청에 응답해야 합니다.

자세한 내용은 아래 링크를 참조하십시오.

1. https://rack.github.io/
2. https://redpanthers.co/rack-middleware/
3. https://blog.engineyard.com/2015/understanding-rack-apps-and-middleware
4. https://guides.rubyonrails.org/rails_on_rack.html#resources

.ru 이 되며, config.ru 또는 config.ru 에서 모든 랙할 수 . 어떤 랙 파일이든 실행할 수 있습니다.rackup 포트는 "" "" " "" 입니다.9292이를 테스트하려면 간단히 실행할 수 있습니다.rackup레일 디렉토리에서 결과를 확인합니다.실행할 포트를 할당할 수도 있습니다.랙은 " " " 입니다.

rackup -p PORT_NUMBER

언급URL : https://stackoverflow.com/questions/2256569/what-is-rack-middleware