我使用以下环境:
Server: Webrick
Rails: 3.2.6
Ruby: 1.9.3p555
我在/ script / rails中添加了以下代码:
require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'
if ENV['SSL'] == "true"
module Rails
class Server < ::Rack::Server
def default_options
super.merge({
:Port => 3000,
:environment => (ENV['RAILS_ENV'] || "production").dup,
:daemonize => false,
:debugger => false,
:pid => File.expand_path("tmp/pids/server.pid"),
:config => File.expand_path("config.ru"),
:SSLEnable => true,
:SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
:SSLPrivateKey => OpenSSL::PKey::RSA.new(
File.open("certs/project.key").read),
:SSLCertificate => OpenSSL::X509::Certificate.new(
File.open("certs/project.crt").read),
:SSLCertName => [["CN", WEBrick::Utils::getservername]],
})
end
end
end
end
APP_PATH = File.expand_path('../../config/application', __FILE__)
require File.expand_path('../../config/boot', __FILE__)
require 'rails/commands'
我在/config/environments/production.rb中添加了以下行:
config.force_ssl = true
现在我尝试了以下尝试:
在3000上启动rails
SSL=true rails s -e production -p 3000
它在https://project.com上运行rails,但在http://project.com
上运行404错误在443上启动rails并在脚本中提到相同的端口:
rvmsudo rails s -p 443
使用两个不同的pid在80和443上启动rails:
rvmsudo rails s -p 80 -P PID1
rvmsudo rails s -p 443 -P PID2
4.最后,我试图将请求从443和80转发到3000:
sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
sudo iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 3000
此外,我也试图用薄宝石运行同样的东西,但结果是一样的。
答案 0 :(得分:7)
冒着被焚烧和贬低的风险......
拥有锤子并且仅将所有内容视为指甲并非有效的计划。有时当遇到螺丝时,您必须找到螺丝刀。
Webrick是rails web服务器最差的选项,只有在绝对必要的情况下才能使用。它太简单了,无法在你的Gemfile中放置瘦身或美洲狮,并在一个更快乐,线程更安全的世界中移动。
在这方面,这是你实现理智的九步计划。
第1步:停止。
第2步:想一想。
第3步:实现最佳实践是有原因的,例如:完美的前向保密,对代理的rails应用程序进行负载均衡,静态资产服务。
步骤4:决定停止重新发明轮子并花时间学习你的手艺。
第5步:通过您的发行版的回购
安装nginx第6步:Change default nginx host to serve your domain via SSL.
步骤7:将puma添加到您的Gemfile,并捆绑更新
第8步:Setup puma init.d or upstart file so it persists across reboots
第9步:获利
答案 1 :(得分:0)
我在/ script / rails中添加了以下代码:
require 'rails/commands/server'
require 'rack'
require 'webrick'
require 'webrick/https'
if ENV['SSL'] == "true"
module Rails
class Server < ::Rack::Server
def default_options
super.merge({
:Port => 443,
:environment => (ENV['RAILS_ENV'] || "production").dup,
:daemonize => false,
:debugger => false,
:pid => File.expand_path("tmp/pids/server.pid"),
:config => File.expand_path("config.ru"),
:SSLEnable => true,
:SSLVerifyClient => OpenSSL::SSL::VERIFY_NONE,
:SSLPrivateKey => OpenSSL::PKey::RSA.new(
File.open("certs/project.key").read),
:SSLCertificate => OpenSSL::X509::Certificate.new(
File.open("certs/project.crt").read),
:SSLCertName => [["CN", WEBrick::Utils::getservername]],
})
end
end
end
end
APP_PATH = File.expand_path('../../config/application', __FILE__)
require File.expand_path('../../config/boot', __FILE__)
require 'rails/commands'
我在/config/environments/production.rb中添加了以下行:
config.force_ssl = true
使用两个不同的pid在80和443上启动rails:
SSL=true rails s -p 443 -e production
rails s -p 80 -P SERVER2 -e production