문제

는 무엇입 랙 미들웨어에 Ruby?어디에도 없습니다 좋은 설명을 위해 무엇을 의미하"미들웨어".

도움이 되었습니까?

해결책

랙 디자인

랙 미들웨어가보다 더 많은"방법을 필터링 요청과 응답"-그것의 구현 파이프라인 디자인 패턴 웹 서버를 사용하여 선반.

그것은 매우 깔끔하게 분리의 다른 단계 요청을 처리-관심을 분리되는 주요 목표의 모든 잘 설계된 소프트웨어 제품입니다.

예를 들어 랙 수 있는 별도의 단계 파이프라인을 하:

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

  • 승인:"는 사용자가 인가 수행하는 이 특정 작업?", 즉역할 기반 보안입니다.

  • 캐싱:내가 이 요청을 처리한 이미 반환할 수 있습니 캐시 결과는?

  • 장식:는 방법을 향상시킬 수 있는 요청을 만들 다운스트림 처리 더 나은?

  • 성능 및 사용량을 모니터링:어떤 통계에서 받을 수 있는 요청과 응답?

  • 실행:실제로 요청을 처리하고 대답을 알려줍니다.

할 수 있는 별도의 다른 단계(선택적으로 포함하는)훌륭한 개발에 도움이 잘 구축한 응용 프로그램.

커뮤니티

또한 중대한 에코시스템을 개발하 주변의 랙 미들웨어-당신은 당신을 찾을 수 있어야 pre-내 랙 구성 요소를 수행한 모든 단계의 위와 더 있습니다.보 랙 GitHub 위키에 대한 목록의 미들웨어.

What's Middleware?

미들웨어가 무서운 기간을 참조하는 모든 소프트웨어 구성 요소/라이브러리를 도와 하지만 직접 참여하여 실행의 일부 작업입니다.매우 일반적인 예는 다음과 같습니다깅,인증 및 다른 일반적인,가로 가공 부품.이러한 경향이 있는 것 모두 필요로 하는 여러 애플리케이션에서 발생하는지만 너무 많은 사람들이 관심이 있는(또는)구축에다.

더 많은 정보

다른 팁

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

  • 웹 서버 인터페이스 컨벤션
  • 보석

랙 - 웹 서버 인터페이스

랙의 기본은 간단한 컨벤션입니다. 모든 랙 호환 웹 서버는 항상 그에게 제공 한 객체에서 호출 메소드를 호출하고 해당 방법의 결과를 제공합니다. 랙은이 호출 방법의 모습과 반환 해야하는 내용을 정확하게 지정합니다. 그게 랙입니다.

간단한 시도를하자. Webrick을 Rack Compliant Webserver로 사용하지만 그 중 누구도 할 것입니다. 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

컨벤션이 지정됨에 따라 서버에는 환경 해시를 수락하는 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

URL을 컬링하거나 방문하여 새로운 JSON 서버를 테스트합시다. http://localhost:9292/hello.json 그리고 voila :

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

효과가있다. 엄청난! 이것이 모든 웹 프레임 워크의 기초입니다. Rails 또는 Sinatra. 어느 시점에서 그들은 호출 방법을 구현하고 모든 프레임 워크 코드를 통해 작동하며 마지막으로 일반적인 [상태, 헤더, 본문] 양식으로 응답을 반환합니다.

예를 들어 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

따라서 기본적으로 Rails는 경로가 일치하는 경우 ENV 해시에 따라 점검합니다. 그렇다면 응답을 계산하기 위해 ENV 해시를 애플리케이션으로 전달합니다. 그렇지 않으면 즉시 404로 응답합니다. 따라서 Rack Interface 컨벤션을 준수하는 모든 웹 서버는 완전히 블로우 레일 애플리케이션을 제공 할 수 있습니다.

미들웨어

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

요청이 얼마나 오래 걸리는지 측정하는 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

그것이 만들어지면 실제 랙 애플리케이션의 사본을 저장합니다. 우리의 경우 그것은 Jsonserver의 인스턴스입니다. 랙은 자동으로 미들웨어에서 호출 방법을 호출하고 [status, headers, body] jsonserver가 반환하는 것처럼 배열.

따라서이 미들웨어에서는 시작점이 취해지고 JSonserver에 대한 실제 호출이 이루어집니다. @app.call(env), 그런 다음 로거는 로깅 항목을 출력하고 마지막으로 응답을 다음과 같이 반환합니다. [@status, @headers, @body].

작은 rackup.ru를 사용하려면이 미들웨어를 사용하려면 다음과 같이 사용하는 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 아래에 일부 JavaScript 파일을 작성하고 config.ru에 다음을 추가하여 JavaScript 파일의 전체 디렉토리를 추가하겠습니다.

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

서버를 다시 시작하고 방문하십시오 http://localhost:9292/javascript 또한 어디에서나 바로 포함 할 수있는 모든 JavaScript 파일 목록이 표시됩니다.

문제를 이해 랙 나 자신을 위해 좋은 시간이다.저만 완전히 이해한 후에 이 소형 루비 web server 자신입니다.나는 나의 학습 내용에 대한 선반(의 형태로 이야기)여기에 나 블로그: http://gauravchande.com/what-is-rack-in-ruby-rails

피드백 보다 더 환영합니다.

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 포장 및 호출합니다.따라서 그것은 수 pre-프로세스가 요청,그리고 포스트-프로세스의 응답에서 어떤 방법입니다.

로 설명: http://guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-middleware-stack 고,레일 사용하여 랙한 미들웨어를 위한 그것의 많은 기능을 추가할 수 있습니다 당신의 자신도 config.middleware.use 가족 방법이 있습니다.

의 이점을 구현하는 기능에 미들웨어 재사용할 수 있는 그것에 모든 랙 framework,따라서 모든 주요 루비 사람,그리고 단지도 있습니다.

Rack Middleware는 응용 프로그램에 요청 및 응답을 필터링하는 방법입니다. 미들웨어 구성 요소는 클라이언트와 서버 사이에 있으며 인바운드 요청 및 아웃 바운드 응답을 처리하지만 웹 서버와 대화하는 데 사용할 수있는 인터페이스 이상입니다. 일반적으로 루비 클래스 인 모듈을 그룹화하고 주문하는 데 사용되며 그 사이의 종속성을 지정합니다. 랙 미들웨어 모듈은 다음과 같아야합니다. - 매개 변수로 스택에서 다음 응용 프로그램을 사용하는 생성자가 있어야합니다. 이 호출에서 값을 반환하는 것은 지위 코드, 환경 해시 및 응답 본문의 배열입니다.

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

  1. 사용자 정의 랙 미들웨어로 JSON 구문 분석 오류를 잡습니다 클라이언트가 Busted JSON을 제출할 때 멋지게 형식화 된 오류 메시지를 반환합니다.
  2. 랙을 통한 컨텐츠 압축 :: deflater

두 경우 모두 꽤 우아한 수정 사항을 제공했습니다.

랙이란 무엇입니까?

랙은 루비와 루비 프레임 워크를 지원하는 웹 서버 사이의 최소 인터페이스를 제공합니다.

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

랙은 환경 해시 (해시, CGI와 같은 헤더로 구성된 클라이언트의 HTTP 요청 내부에 포함 된 해시)를 통과합니다.이 해시에 포함 된 물건을 사용할 수있는 랙 애플리케이션으로 원하는 모든 것을 수행 할 수 있습니다.

랙 애플리케이션이란 무엇입니까?

랙을 사용하려면 '앱'을 제공해야합니다. #call 매개 변수로서 환경 해시를 사용한 메소드 (일반적으로 정의 된 env). #call 정확히 세 값 배열을 반환해야합니다.

  • 그만큼 상태 코드 (예 : '200'),
  • 헤더 해시,
  • 그만큼 응답 본문 (루비 방법에 응답해야합니다. each).

그러한 배열을 반환하는 랙 애플리케이션을 작성할 수 있습니다.이 배선은 클라이언트, 랙, 내부로 다시 전송됩니다. 응답 (이것은 실제로가 될 것입니다 사례 수업의 Rack::Response 문서로 이동하려면 클릭하십시오]).

매우 간단한 랙 응용 프로그램 :

  • gem install rack
  • a config.ru 파일 - 랙은 이것을 찾는 것을 알고 있습니다.

응답을 반환하는 작은 랙 애플리케이션을 생성합니다 (인스턴스 Rack::Response) 누가 응답 본문은 문자열을 포함하는 배열입니다. "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 그리고 방문 로컬 호스트 : 9292 그리고 당신은 '안녕하세요, 세계!' 렌더링.

이것은 포괄적 인 설명이 아니지만 본질적으로 여기서 일어나는 일은 클라이언트 (브라우저)가 로컬 서버를 통해 랙에 HTTP 요청을 보낸다는 것입니다. MessageApp 그리고 달린다 call, 환경을 통과하여 방법에 대한 매개 변수로 해시를 전달합니다 ( env 논쟁).

랙은 반환 값 (배열)을 가져 와서이를 사용하여 인스턴스를 만듭니다. Rack::Response 그리고 그것을 고객에게 다시 보냅니다. 브라우저가 사용됩니다 마법 '안녕하세요, 세계!' 화면에.

덧붙여서, 당신이 환경 해시가 어떻게 생겼는지보고 싶다면 puts env 아래에 def call(env).

최소한의 경우, 여기에 쓴 것은 랙 응용 프로그램입니다!

랙 애플리케이션이 들어오는 환경과 상호 작용하는 해시

우리의 작은 랙 앱에서 우리는 env 해시 (참조 여기 환경 해시에 대한 자세한 내용).

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

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

환경의 랙 문서에서 해시 :"query_string : 요청 URL의 일부는?

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

지금, rackup 그리고 방문 localhost:9292?hello (?hello 쿼리 문자열) 및 뷰포트에서 'Hello'가 렌더링되는 것을 볼 수 있습니다.

랙 미들웨어

우리는 :

  • 코드베이스에 랙 미들웨어 조각을 삽입 - 클래스 : MessageSetter,
  • 환경 해시는이 클래스를 먼저 치고 매개 변수로 전달됩니다. env,
  • MessageSetter 삽입 a 'MESSAGE' Env Hash의 키, 그 가치는입니다 'Hello, World!' 만약에 env['QUERY_STRING'] 비었다; env['QUERY_STRING'] 그렇지 않다면
  • 마지막으로 돌아올 것입니다 @app.call(env) - @app '스택'의 다음 앱이기 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

로부터 랙 :: 빌더 문서 우리는 그것을 봅니다 Rack::Builder 작은 DSL을 구현하여 랙 애플리케이션을 반복적으로 구성합니다. 이것은 기본적으로 하나 이상의 중간 전쟁과 '하단 레벨'응용 프로그램으로 구성된 '스택'을 만들 수 있음을 의미합니다. 하단 수준 응용 프로그램에 대한 모든 요청은 먼저 미들웨어에서 처리됩니다.

#use 스택에서 사용할 미들웨어를 지정합니다. 미들웨어를 논쟁으로 취합니다.

Rack Middleware는 다음과 같습니다.

  • 스택에서 다음 응용 프로그램을 매개 변수로 사용하는 생성자가 있습니다.
  • 응답 call 환경 해시를 매개 변수로 취하는 방법.

우리의 경우 '미들웨어'는입니다 MessageSetter, '생성자'는 MessessEtter입니다 initialize 방법, 스택의 '다음 응용 프로그램'은 MessageApp.

그래서 여기에 무엇이 Rack::Builder 후드 아래에서 app 논쟁 MessageSetter'에스 initialize 방법은 MessageApp.

(계속하기 전에 위의 머리를 잡아라)

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

#run 응답하는 객체 인 논증을 취합니다. #call 랙 응답을 반환합니다 (인스턴스 Rack::Response).

결론

사용 Rack::Builder 중간 전쟁 체인을 구성 할 수 있으며 응용 프로그램에 대한 모든 요청은 각 미들웨어에 의해 처리되기 전에 마침내 스택의 최종 조각으로 처리되기 전에 (이 경우, 우리의 경우,. MessageApp). 이것은 처리 요청의 다른 단계를 분리하기 때문에 매우 유용합니다. '우려의 분리'측면에서, 그것은 훨씬 더 깨끗할 수 없었습니다!

다음과 같은 것들을 다루는 여러 중간 전쟁으로 구성된 '요청 파이프 라인'을 구성 할 수 있습니다.

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

(이 스레드의 다른 답변에서 총알 포인트 위)

당신은 종종 전문 Sinatra 응용 프로그램에서 이것을 볼 수 있습니다. 시나트라는 랙을 사용합니다! 보다 여기 Sinatra의 정의 이다!

마지막 메모로, 우리 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

유용한 링크

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

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

평신도로, 기본적으로 서버와 레일 앱 (또는 다른 루비 웹 앱)이 서로 대화 해야하는 방법에 대한 일련의 지침 일뿐입니다..

랙을 사용하려면 "앱"을 제공합니다. 호출 방법에 응답하고 환경 해시를 매개 변수로 취하고 세 가지 요소가있는 배열을 반환하는 객체입니다.

  • 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

레일에는 랙 파일로 config.ru가 있습니다. rackup 명령. 그리고 이것의 기본 포트는입니다 9292. 이것을 테스트하려면 간단히 실행할 수 있습니다 rackup Rails 디렉토리에서 결과를 확인하십시오. 실행하려는 포트를 할당 할 수도 있습니다. 특정 포트에서 랙 파일을 실행하도록 명령

rackup -p PORT_NUMBER
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top