모든 Rails, Sinatra 및 기타 Ruby 웹 프레임워크의 배후에서 무슨 일이 일어나고 있나요?
이를 가능하게 하는 핵심 구성요소인 랙이 답입니다.
하지만 Rack이 정확히 무엇인가요?
Rack은 프레임워크(Rails)와 애플리케이션 서버(Puma) 사이의 레이어입니다.
그들이 소통할 수 있게 해주는 것은 접착제입니다.
랙을 사용하는 이유
랙을 사용하면 서로 다른 프레임워크와 서버를 교체할 수 있기 때문입니다.
플러그인할 수 있는 구성요소가 됩니다. .
즉, Rails, Sinatra 및 기타 랙 호환 프레임워크와 함께 Puma를 사용할 수 있습니다. 랙 인터페이스를 구현하는 경우 사용 중인 프레임워크나 서버는 중요하지 않습니다. .
Rack을 사용하면 모든 구성 요소가 제 역할을 하고 모두가 행복해집니다!
랙 미들웨어란 무엇입니까?
Rack은 모든 웹 요청 및 응답의 중간에 위치합니다.
결과적으로 원치 않는 요청에 대한 액세스를 거부하여 보호자 역할을 하거나 느린 응답을 추적하여 역사가 역할을 할 수 있습니다.
이것이 바로 랙 미들웨어입니다. 입니다!
요청-응답 주기의 일부로 호출되고 이를 통해 무언가를 할 수 있는 기회를 얻는 작은 Ruby 프로그램입니다.
어떤 용도로 사용되나요?
- 로깅
- 세션
- 프로파일링(요청을 완료하는 데 걸리는 시간 확인)
- 캐싱
- 보안(IP 주소를 기반으로 요청 거부 또는 요청 횟수 제한)
- 정적 파일(css, js, png…) 제공
이는 매우 유용하며 Rails는 미들웨어를 잘 활용하여 일부 기능을 구현합니다. .
rake middleware
로 미들웨어 목록을 볼 수 있습니다. Rails 프로젝트 내부.
이제 이 랙 인터페이스 앞서 언급했습니다.
어떻게 생겼나요?
예를 들어 보여드리겠습니다...
자신만의 랙 애플리케이션을 작성하는 방법
자신의 응용 프로그램을 작성하여 Rack이 어떻게 작동하는지 배울 수 있습니다.
해보자!
Rack 애플리케이션은 call
메소드가 하나인 클래스입니다. .
이렇게 생겼어요 :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) [200, {"Content-Type" => "text/plain"}, "Hello from Rack"] end end handler.run RackApp.new
이 코드는 포트 8080에서 서버를 시작합니다(시도해보세요! ).
반환되는 이 배열은 무엇입니까?
- HTTP 상태 코드(200)
- HTTP 헤더("콘텐츠 유형")
- 내용("Hello from Rack")
요청 세부 정보에 액세스하려면 env
를 사용할 수 있습니다. 주장.
좋아요 :
req = Rack::Request.new(env)
사용 가능한 방법 :
- 경로 정보(/articles/1)
- IP(사용자)
- user_agent(Chrome, Firefox, Safari…)
- request_method(게시/게시)
- 본문(내용)
- 미디어 유형(일반, json, html)
이 정보를 사용하여 랙 애플리케이션을 구축할 수 있습니다. .
예를 들어 IP 주소가 5.5.5.5
인 경우 콘텐츠에 대한 액세스를 거부할 수 있습니다. .
코드는 다음과 같습니다. :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) req = Rack::Request.new(env) if req.ip == "5.5.5.5" [403, {}, ""] else [200, {"Content-Type" => "text/plain"}, "Hello from Rack"] end end end handler.run RackApp.new
주소를 127.0.0.1
로 변경할 수 있습니다. 효과를 보고 싶다면
그래도 작동하지 않으면 ::1
을(를) 시도하십시오. , localhost의 IPv6 버전.
랙 미들웨어 작성 및 사용 방법
지금:
애플리케이션과 미들웨어가 함께 작동하도록 어떻게 연결합니까?
Rack::Builder
사용 .
이해하는 가장 좋은 방법은 예를 들어보는 것입니다.
랙 앱은 다음과 같습니다. :
require 'rack' handler = Rack::Handler::Thin class RackApp def call(env) req = Rack::Request.new(env) [200, {"Content-Type" => "text/plain"}, "Hello from Rack - #{req.ip}"] end end
미들웨어입니다 :
class FilterLocalHost def initialize(app) @app = app end def call(env) req = Rack::Request.new(env) if req.ip == "127.0.0.1" || req.ip == "::1" [403, {}, ""] else @app.call(env) end end end
이것이 우리가 함께 결합하는 방법입니다. :
app = Rack::Builder.new do |builder| builder.use FilterLocalHost builder.run RackApp.new end handler.run app
이 예에는 두 개의 랙 애플리케이션이 있습니다.
- IP 확인용(
FilterLocalHost
) ) - 애플리케이션 자체가 콘텐츠를 전달하기 위한 것(HTML, JSON 등)
@app.call(env)
, 이것이 FilterLocalHost
를 만드는 것입니다. 미들웨어.
다음 두 가지 중 하나가 발생할 수 있음 :
- 미들웨어 체인을 중지하는 응답을 반환합니다.
@app.call(env)
과 함께 요청을 전달합니다. 다음 미들웨어 또는 앱 자체로
미들웨어를 포함하여 Rack 앱의 모든 부분에서 응답을 변경할 수 있습니다.
예 :
class UpcaseAll def initialize(app) @app = app end def call(env) status, headers, response = @app.call(env) response.upcase! [status, headers, response] end end
이것이 바로 Rack이 작동하는 방식입니다 🙂
요약
Ruby 웹 프레임워크와 서버 간의 상호 작용을 주도하는 인터페이스인 Rack에 대해 배웠습니다. 또한 자신의 Rack 애플리케이션을 작성하여 작동 방식을 이해하는 방법도 배웠습니다.
질문이나 피드백이 있는 경우 아래에 댓글을 남겨주세요.
읽어주셔서 감사합니다!