这可能是一个转储问题,但是我正在尝试运行两个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上的虚拟主机是否应该以我所描述的方式使用?
答案 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