Виртуальный хост, на котором запущен сервер на другом порту Webrick - PullRequest
1 голос
/ 18 октября 2019

Возможно, это вопрос дампа, но я пытаюсь запустить два «сервера» Уэбрика. Один на порту 8080 и один на порту 8443. Я мог запустить два сервера в 2-х потоках, но я увидел это: https://github.com/ruby/webrick/blob/master/lib/webrick/httpserver.rb#L191 и подумал, что могу запустить один из порта 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, никогда не будет запущен и никогда не получит запросы. Это вывод:

[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

ТеперьСервер, работающий на порту 8443, запускается и может получать запросы:

[2019-10-18 12:08:58] INFO  WEBrick 1.5.0
[2019-10-18 12:08:58] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin18]
[2019-10-18 12:08:58] INFO  WEBrick 1.5.0
[2019-10-18 12:08:58] INFO  ruby 2.6.3 (2019-04-16) [x86_64-darwin18]
Starting vhost
[2019-10-18 12:08:58] INFO  WEBrick::HTTPServer#start: pid=94134 port=8080
[2019-10-18 12:08:58] INFO  WEBrick::HTTPServer#start: pid=94134 port=8443

Что-то не так с первой версией кода? Разве виртуальные хосты на Webrick не должны использоваться так, как я описал?

1 Ответ

1 голос
/ 18 октября 2019

Виртуальные хосты в WEBrick предназначены для нескольких доменных имен, которые прослушивают один и тот же порт. Примечание эта документация:

Сервер может выступать в качестве виртуального хоста для нескольких имен хостов. После создания прослушивающего хоста можно создать дополнительные хосты , которые не слушают и подключить их как виртуальные хосты

Если вы хотите, чтобы несколько экземпляров 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...