Ruby on rails 为什么不是';使用nginx和自签名SSL证书的t Rails是否有效?
在通过站点从Heroku迁移到(数字海洋)VPS之前,我正在尝试测试我的SSL设置,因此我根据使用自签名证书 我使用以下命令创建证书,它们位于相应的目录中:Ruby on rails 为什么不是';使用nginx和自签名SSL证书的t Rails是否有效?,ruby-on-rails,ssl,nginx,self-signed,Ruby On Rails,Ssl,Nginx,Self Signed,在通过站点从Heroku迁移到(数字海洋)VPS之前,我正在尝试测试我的SSL设置,因此我根据使用自签名证书 我使用以下命令创建证书,它们位于相应的目录中: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt 以下是my nginx.conf上的服务器块中的相关行: server { listen 80
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
以下是my nginx.conf上的服务器
块中的相关行:
server {
listen 80 default_server;
listen 443 ssl;
server_name migration.my_domain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
此外,在production.rb中,我使用了以下行:
config.force_ssl = true
myu域
(不是实际的域名)及其子域
迁移都是在我的DNS中设置的,并且都正确指向我的服务器的IP地址。目前,当我通过http://migration.my_domain.com
页面被送达。但是当我通过https://migration.my_domain.com
,我在Chrome中遇到一个错误:
This site can’t be reached
migration.my_domain.com refused to connect.
Try:
Reloading the page
Checking the connection
Checking the proxy and the firewall
ERR_CONNECTION_REFUSED
知道我在这里遗漏了什么吗?找到了。首先,我正在通过Capistrano进行部署,我错误地认为这是在部署之后重新启动nginx。事实证明不是这样。所以我需要手动操作。因此,在我的
服务器
块的开头就部署了这个:
server {
listen 443 ssl default_server deferred;
server_name migration.my_domain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
部署了这个,但在重新启动nginx之后,首先从Chrome得到了关于自签名证书的警告,并且该站点不能被信任(这是可以预料的)。在移动过去之后,收到一条关于重定向太多的消息。结果是,我的production.rb
文件中上面的行:
config.force_ssl = true
导致了一个问题。从我所知道的情况来看,这意味着nginx发送给puma的内容不包含是否为ssl,因此puma重定向所有内容,甚至是https请求,因为它不知道它得到了什么。所以,现在我有两个几乎重复的server
块。第一个处理http
请求的程序具有以下相关语句:
server {
listen 80;
server_name migration.my_domain.com;
# ...bunch of non-relevant config...
location @puma {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://puma;
}
}
由于production.rb
中的config.force\u ssl=true
,puma将所有的80个请求重定向到ssl(我相信),这将处理所有的80个请求。Nginx随后将收到一个针对相同URL的https请求,该请求将由该块处理:
server {
listen 443 ssl;
server_name migration.my_domain.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
# ...bunch of non-relevant config...
location @puma {
proxy_set_header X-Forwarded-Proto https; # IMPORTANT!! I believe this tells puma that everything sent through via this block is https. Thus, puma no longer redirects.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://puma;
}
}
这似乎工作正常,尽管在收到自签名证书时浏览器中会出现所有适当的警告。我相信,一旦我切换到我的实际证书,我现在将有一个正常运行的ssl设置
再次感谢@doon 防火墙规则?服务器正在侦听
netstat-an
或ss-a
,具体取决于linux版本。防火墙处于默认状态,接受所有输入、输出和转发。我假设它正在侦听,因为正常的http请求得到了适当的处理。运行该命令以确保它正在侦听端口443。你在运行代理吗?我看不到它在监听端口443。我是新手,所以我不知道我是否在运行代理,但我对此表示怀疑,因为我或多或少是通过Digital Ocean recipe设置的,我还没有看到任何关于这方面的信息。如何让服务器侦听端口443?listen 443
行不应该这样做吗?尝试将ssl放入另一个服务器块,配置与端口80相同,为ssl行保存一次,然后重新启动ngninx(您正在重新启动文件更改之间的nginx/droplet,对吗?)。这对我来说很有效,在nginx ssl代理后面有一个Sharetribe。-->代理集头X转发协议https;#重要的!!我相信这告诉puma,通过这个区块发送的所有内容都是https。因此,彪马不再重定向。非常感谢。