Ruby on Rails 에서 Rack 미들웨어 의 기초 학습 튜 토리 얼

8569 단어 rackRuby
rack 는 ruby 서버 와 rack 응용 프로그램 간 의 프레임 워 크 입 니 다.rails,sinatra 는 모두 rack 를 바탕 으로 구 축 된 것 으로 모두 rack 응용 프로그램 에 속 합 니 다.
rack 는 서버 와 대화 할 수 있 는 표준 인 터 페 이 스 를 제공 합 니 다.표준 rack 프로그램 은 call 에 응답 할 수 있 는 대상 입 니 다.대상,Proc,lambda 심지어 method 일 수 있 습 니 다.env 인자(환경 대상)를 받 고 배열 을 되 돌려 줍 니 다.배열 은 다음 과 같 습 니 다.
상태(status),http 응답 상태 코드
  • hash 일 수 있 습 니 다.http 의 header 정보 입 니 다
  • each 방법 을 가 진 대상,each 반환 문자열
  • rack 는 미들웨어 를 통 해 확장 합 니 다.즉,원시 적 인 rack 프로그램 을 장식 하고 기 존의 배열 로 돌아 가 는 토대 에서 rack 대상 을 되 돌려 줍 니 다.
    간단 한 rack 프로그램
    
    require 'rack'
    
    app = lambda{|env|[200,{},["hello from rack"]]}
    Rack::Handler::WEBrick.run app
    
    
    중간 부품 을 사용 하 는 rack 프로그램:
    require 'rack'
    
    class Decorator
     def initialize(app)
      @app = app
     end
     def call(env)
      status, headers, body = @app.call(env)
      new_body = "from middleware input <br/>"
      body.each{|str| new_body << str}
      headers['Content-Length'] = new_body.bytesize.to_s
      [status, headers, [new_body]]
     end
    end
    
    app = lambda{|env|[200,{},["hello from rack"]]}
    Rack::Handler::WEBrick.run Decorator.new(app)
    
    
    위 에서 미들웨어 를 사용 하 는 방법 은 여러 개 를 사용 할 때 혼 란 스 럽 기 쉬 우 며,rack 는 Builder 류 를 효과적으로 관리 할 수 있 습 니 다.
    아래 와 같이 사용 합 니 다.
    require 'rack'
    
    require 'decorator'
    
    app = Rack::Builder.new{
     use Rack::ContentLength
     use Decorator
     run lambda {|env| [200, {"Content-Type"=>"text/html"}, ["hello world"]]}
    }.to_app
    Rack::Handler::WEBrick.run app
    
    
    Rack::Builder 의 map 방법 을 사용 하면 경로 가 있 는 rack 프로그램 을 만 들 수 있 습 니 다.
    require 'rack'
    
    app = Rack::Builder.new {
     map '/hello' do
    run lambda {|env| [200, {"Content-Type" => "text/html"}, ["hello"]] } end
    map '/world' do
    run lambda {|env| [200, {"Content-Type" => "text/html"}, ["world"]] }
    end
    map '/' do
    run lambda {|env| [200, {"Content-Type" => "text/html"}, ["all"]] } end
    }.to_app
    Rack::Handler::WEBrick.run app, :Port => 3000
    
    rails 의 전체 스 택 성 으로 인해 rack 미들웨어 가 많 고 높 은 병행 이지 만 업무 가 간단 한 사이트 나 api 에서 사용 할 때
    응답 시간 이 너무 길 면 rack 나 sinatra 를 사용 하 는 것 을 고려 할 수 있 습 니 다.
    rack 프로그램 을 시작 하 는 데 는 두 가지 방법 이 있 습 니 다.
    1.ruby 를 사용 하여.rb 파일 을 직접 실행 합 니 다.기본적으로 8080 에서 서 비 스 를 시작 합 니 다.로그 파일 이 없습니다.
    2.rackup 를 사용 하면 기본적으로 9292 에서 서 비 스 를 시작 합 니 다.로그 파일 이 있 습 니 다.rackup 는-o 로 ip 을 지정 할 수 있 습 니 다.-p 로 포트 번 호 를 지정 합 니 다.
    
    require 'rack'
    app = lambda{|env| [200,{},["hello world"]] }
    Rack::Server.new.server.run app
    ruby xxx.rb
    
    201664165914441.png (688×98)
    
    #test.ru
    run lambda{|env| [ 200,{},["rackup start"] ]}
    rackup test.ru
    
    201664165939149.png (1126×126)
    rack 는 시작 할 때 중간 부품 을 기본적으로 불 러 옵 니 다.
    
    def logging_middleware
        lambda { |server|
         server.server.name =~ /CGI/ || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr]
        }
       end
    
        m = Hash.new {|h,k| h[k] = []}
        m["deployment"] = [
         [Rack::ContentLength],
         [Rack::Chunked],
         logging_middleware,
         [Rack::TempfileReaper]
        ]
        m["development"] = [
         [Rack::ContentLength],
         [Rack::Chunked],
         logging_middleware,
         [Rack::ShowExceptions],
         [Rack::Lint],
         [Rack::TempfileReaper]
        ]
    
        m
       end
    
    
    body 길이 오류 알림 접근 기록 등 을 포함 합 니 다.
    rack 는 디 렉 터 리 파일 에 웹 서 비 스 를 만 들 수 있 는 Directory 미들웨어 가 있 습 니 다.
    아주 간단 한 한 마디 를 사용 합 니 다.
    
    #test.ru
    run Rack::Directory.new "~/"
    rackup test.ru
    
    홈 디 렉 터 리 에 있 는 모든 파일,폴 더 를 브 라 우 저 에 표시 합 니 다.
    201664170255131.png (1240×371)
    rails 응용 프로그램 에서 rake middleware 를 사용 하면 모든 middleware(미들웨어)를 표시 할 수 있 습 니 다.
    
    ** **rake middleware
    use Rack::Sendfile
    use ActionDispatch::Static
    use Rack::Lock
    use #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x007feef1563b90>
    use Rack::Runtime
    use Rack::MethodOverride
    use ActionDispatch::RequestId
    use Rails::Rack::Logger
    use ActionDispatch::ShowExceptions
    use WebConsole::Middleware
    use ActionDispatch::DebugExceptions
    use ActionDispatch::RemoteIp
    use ActionDispatch::Reloader
    use ActionDispatch::Callbacks
    use ActiveRecord::Migration::CheckPending
    use ActiveRecord::ConnectionAdapters::ConnectionManagement
    use ActiveRecord::QueryCache
    use ActionDispatch::Cookies
    use ActionDispatch::Session::CookieStore
    use ActionDispatch::Flash
    use ActionDispatch::ParamsParser
    use Rack::Head
    use Rack::ConditionalGet
    use Rack::ETag
    run Fool::Application.routes
    
    rails 는 rack 가 정의 하 는 미들웨어 를 사용 하여 미들웨어 를 사용자 정의 하 였 습 니 다.그 중에서 사용자 정의 routes 는 rack 프로그램 이 고 routes 는 rails contrller 의 action 을 lambda 로 바 꾸 고 rack 프로그램 으로 실행 하 며 rails console 에 입력 하 였 습 니 다.
    
    2.2.1 :001 > QuestionsController.action(:new)
     => #<Proc:0x007fbe482ee0b0@/Users/killman/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.1/lib/action_controller/metal.rb:237 (lambda)>
    
    config/application.rb 에 미들웨어 추가,삭제,수정 가능
    
    config.middleware.use(new_middleware, args)#:            ;
    config.middleware.insert_before(existing_middleware,
     new_middleware, args)#:  existing_middleware
    
     이전에 새 미들웨어 추가 하기;
    
    config.middleware.insert_after(existing_middleware,
     new_middleware, args)#:  existing_middleware
    
     다음 에 새 미들웨어 추가 하기;
    
    config.middleware.swap ActionDispatch::ShowExceptions, Lifo::ShowExceptions #     
    config.middleware.delete "Rack::Lock"#     
    
    중간 부품 의 역할:
    Rack::Sendfile:서버 에 있 는 X-Sendfile 헤더 설정.config.actiondispatch.x_sendfile_header 옵션 설정..
  • Action Dispatch:Static:정적 자원 파일 을 서비스 합 니 다.설정 config.serverstatic_assets 가 false 이면 이 미들웨어 를 사용 하지 않 습 니 다
  • Rack:Lock:env[rack.mlithread]깃발 을 false 로 설정 하고 프로그램 을 상호 배척 자물쇠 에 넣 습 니 다
  • ActiveSupport::Cache:Strategy::LocalCache::Middleware:메모리 에 캐 시 를 저장 하고 비 스 레 드 가 안전 합 니 다
  • Rack::Runtime:X-Runtime 헤 더 를 설정 합 니 다.즉,요청 을 실행 하 는 시간 이 길 고 단 위 는 초 입 니 다Rack::MethodOverride:params[:method]매개 변 수 는 요청 방법 을 덮어 씁 니 다.이 중간 부품 은 PUT 와 DELETE 방법 을 실현 하 였 다
  • Action Dispatch:RequestId:응답 에 유일한 X-Request-id 헤 더 를 설정 하고 Action Dispatch::Request\#uid 방법 을 사용 합 니 다
  • Rails::Rack:Logger:요청 시작 시 알림 로그,요청 완료 후 로 그 를 기록 합 니 다
  • Action Dispatch:ShowExceptions:구제 프로그램 이 던 진 모든 이상,처리 이상 프로그램 을 호출 하여 특정한 형식 으로 사용자 에 게 표시 합 니 다
  • Action Dispatch::DebugExceptions:로 컬 에서 개발 하면 이상 을 로그 에 기록 하고 디 버 깅 페이지 를 표시 합 니 다
  • Action Dispatch:RemoteIp:사기 공격 의 IP 를 검사 합 니 다.
  • Action Dispatch:Reloader:"준비"와"청소"리 셋 을 제공 하여 개발 환경의 코드 재 로드 기능 을 협조 합 니 다
  • Action Dispatch:Callbacks:요청 을 처리 하기 전에"준비"리 셋 을 호출 합 니 다
  • ActiveRecord::Migration:CheckPending:실행 할 이전 여 부 를 확인 하고 있 으 면 ActiveRecord::PendingMigration Error 이상 을 던 집 니 다
  • ActiveRecord::Connection Adapters::Connection Management:요청 처리 가 완료 되면 활성 화 된 연결 을 정리 합 니 다.요청 한 환경 에서 rack.test 를 true 로 설정 하지 않 는 한
  • ActiveRecord::QueryCache:Active Record 쿼 리 캐 시 를 사용 합 니 다
  • Action Dispatch::Cookies:요청 한 cookies 를 설정 합 니 다
  • Action Dispatch::Session:CookieStore:세 션 을 cookies 에 저장 하 는 것 을 책임 집 니 다
  • Action Dispatch::Flash:Flash 메시지 의 키 를 설정 합 니 다.config.action 만 설정 되 어 있 습 니 다.controller.session_store 옵션 을 사용 할 때 만 사용 할 수 있 습 니 다
  • Action Dispatch:ParamsParser:요청 한 인 자 를 params 에 출입 합 니 다
  • Action Dispatch:Head:HEAD 요청 을 GET 요청 으로 변환 하고 처리 합 니 다
  • Rack:Condition alGet:"조건 GET"에 대한 지원 을 추가 합 니 다.페이지 가 수정 되 지 않 으 면 응답 하지 않 습 니 다
  • Rack::ETag:모든 문자열 형식의 주체 에 ETags 헤 더 를 추가 합 니 다.ETags 는 캐 시 를 검증 하 는 데 사 용 됩 니 다
  • 좋은 웹페이지 즐겨찾기