我怎样才能仅使用 Passenger 2.2.9、nginx 0.7.65 和 sinatra 0.94 提供 https 服务?

我怎样才能仅使用 Passenger 2.2.9、nginx 0.7.65 和 sinatra 0.94 提供 https 服务?

我正在尝试部署一个仅具有 https 访问权限而没有 http 访问权限的网站。我确信我只是在配置文件中遗漏了一些简单的行。

正如标题所说,它是 nginx 0.7.65 上的 Sinatra 0.9.4 到 Passenger 2.2.9。

Sinatra 服务的主要 ruby​​ 文件包含:

require 'ssl_requirement'

def ssl_required?
  true
end

config.ru 有(虽然我不确定它是否相关):

require 'rubygems'
require 'sinatra'
require 'app.rb'

set :environment, :production
run Sinatra::Application

nginx.conf 文件如下所示:

 worker_processes  1;


 events {
   worker_connections  1024;
 }


 http {
   passenger_root /var/lib/gems/1.8/gems/passenger-2.2.9;
   passenger_ruby /usr/bin/ruby1.8;

   include       mime.types;
   default_type  application/octet-stream;


   # HTTPS server
   #
   server {
     listen       80;
     listen       443;
     server_name  an.internal.ip.address;
     root         /my/app/dir/public;
     passenger_enabled on;

     proxy_set_header X_FORWARDED_PROTO https;

     ssl                  on;
     ssl_certificate      /my/app/dir/certificate.pem;
     ssl_certificate_key      /my/app/dir/privkey.pem;

     ssl_session_timeout  5m;

     ssl_protocols  SSLv2 SSLv3 TLSv1;
     ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
     ssl_prefer_server_ciphers   on;

   }

 }

我没有将所有 http 请求重定向到 https,而是收到错误:

The plain HTTP request was sent to HTTPS port

我该如何修复这个问题?https 请求https://an.internal.ip.address工作正常。

(这也发生在 nginx-0.6.36 中,不管这值得)。

不确定这是否应该与 Sinatra 标记,但我还没有足够的声誉。

答案1

如果你输入http://服务器/浏览器通过端口 80 向服务器发送纯文本请求。而如果你输入https://服务器/它会向端口 443 发送加密请求。您所做的就是向 https 发送纯文本,因此 Web 服务器需要加密,但却得到纯文本。

如果你这样做的话https://服务器:80/,因此网络浏览器知道它需要加密,但发送到 80。我怀疑您是否能从用户那里得到这一点。

你想要的是,在 80 上接受未加密的流量,然后将所有请求 http 重定向到 443。在 nginx 中:

server {
  listen server_ip:80;
  server_name server_name;
  location / {
    rewrite ^/(.*) https://server_name permanent;
  }
}

相关内容