虚拟主机在Webrick的另一个端口上运行服务器

时间:2019-10-18 16:11:14

标签: ruby

这可能是一个转储问题,但是我正在尝试运行两个Webrick'服务器'。一个在端口8080上,一个在端口8443上。我可以在2个线程中启动两个服务器,但是我看到了:https://github.com/ruby/webrick/blob/master/lib/webrick/httpserver.rb#L191,并认为我可以使用类似以下代码的代码将8443端口之一作为虚拟主机运行:

import React from 'react'
import { render as jestRender } from 'react-native-testing-library'

const navigation = {
  navigate: Function.prototype,
  setParams: Function.prototype,
  dispatch: Function.prototype,
  getParam: (param, defaultValue) => {
    return defaultValue
  },
}

export function render(Component) {
  const NewComponent = React.cloneElement(Component, { navigation })
  return jestRender(NewComponent)
}

但是,如果我这样做,在端口8443上运行的服务器将永远不会启动,也永远不会收到请求。这是输出:

## build default server
svr = WEBrick::HTTPServer.new(
  :Port => 8080,
  :BindAddress => "0.0.0.0"
)
svr.mount_proc("/"){|req, res|
  res.body = "This is default server!"
  res['content-type'] = "text/plain"
}

## Build 'SSL' server
ssl_svr = WEBrick::HTTPServer.new(
  #:DoNotListen => true, # don't forget!
  :Port => 8443,
  :BindAddress => "0.0.0.0",
)

ssl_svr.mount_proc("/"){|req, res|
  res.body = "This is ssl server!"
  res['content-type'] = "text/plain"
}

svr.virtual_host(ssl_svr)
svr.start

请注意,端口8443上的服务器永远不会启动。

如果我用以下内容修补Webrick:

[2019-10-18 12:07:23] INFO  WEBrick 1.5.0
[2019-10-18 12:07:23] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin18]
[2019-10-18 12:07:23] INFO  WEBrick 1.5.0
[2019-10-18 12:07:23] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin18]
[2019-10-18 12:07:23] INFO  WEBrick::HTTPServer#start: pid=94091 port=8080

现在,在端口8443上运行的服务器将启动并可以接收请求:

  def start
    @vhost_threads = []
    @virtual_hosts.each do |vhost|
      puts "Starting vhost"
      @vhost_threads << Thread.new { vhost.start }
    end
    super
  end

  def shutdown
    @virtual_hosts.each do |vhost|
      vhost.shutdown
    end
    @vhost_threads.each {|vt| vt.join }

    super
  end
end

我的第一版代码有什么问题吗? Webrick上的虚拟主机是否应该以我所描述的方式使用?

1 个答案:

答案 0 :(得分:1)

WEBrick中的虚拟主机用于多个都在同一端口上侦听的域名。请注意this文档:

  

服务器可以充当多个主机名的虚拟主机。创建监听主机后,可以创建其他不监听主机并将其附加为虚拟主机

如果您希望多个WEBrick实例在多个端口上进行侦听,则可以进行多进程(而不是您想要的)或多线程(已完成)。但是,您可以通过以下方式简化生活:

require 'webrick'

svr = WEBrick::HTTPServer.new(
  :Port => 8080,
  :BindAddress => "0.0.0.0"
)

ssl_svr = WEBrick::HTTPServer.new(
  :Port => 8443,
  :BindAddress => "0.0.0.0",
)

svr.mount_proc("/"){|req, res|
  res.body = "This is default server!"
  res['content-type'] = "text/plain"
}

ssl_svr.mount_proc("/"){|req, res|
  res.body = "This is ssl server!"
  res['content-type'] = "text/plain"
}

threads = [
  Thread.new { svr.start },
  Thread.new { ssl_svr.start }
].each(&:join)

现在您的两个线程正在运行,您可以在各自的端口上访问WEBrick实例:

[2019-10-18 11:40:27] INFO  WEBrick 1.4.2
[2019-10-18 11:40:27] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin19]
[2019-10-18 11:40:27] INFO  WEBrick 1.4.2
[2019-10-18 11:40:27] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin19]
[2019-10-18 11:40:27] INFO  WEBrick::HTTPServer#start: pid=35295 port=8080
[2019-10-18 11:40:27] INFO  WEBrick::HTTPServer#start: pid=35295 port=8443
相关问题