如何配置 nginx 使 SSL 与 Rails 一起工作?
How to configure nginx to make SSL work with Rails?
我在 Raspberry Pi 上使用 nginx 作为 Rails 应用程序的反向代理。我设法让它在 http 中工作,但我想启用 https。
问题是,Rails 应用程序似乎无法处理 https 请求。这是 Rails 服务器在我尝试访问页面时的输出:
ERROR bad Request-Line `\x16\x03\x01\x01\x1C\x01\x00\x01\x18\x03\x03ɳ▒▒▒ ▒▒ڬ▒▒9C▒▒▒=▒▒▒-v_\f▒&▒%9}\x00\x00▒▒0▒,▒(▒$▒\x14▒'.
我对这一切都很陌生,但根据我的理解,我应该以某种方式将我的证书和密钥传达给 Rails 以便它能够解密请求?
这是我要安装的应用程序:https://github.com/jcs/lobsters
这是我当前的 nginx 配置:
upstream lobsters {
server 127.0.0.1:3000;
keepalive 8;
}
## Redirects all HTTP traffic to the HTTPS host
server {
listen 0.0.0.0:80;
server_name lobsters.my.domain;
server_tokens off;
return 301 https://$http_host$request_uri;
access_log /var/log/nginx/lobsters_access.log;
error_log /var/log/nginx/lobsters_error.log;
}
## HTTPS host
server {
listen 0.0.0.0:443 ssl;
server_name lobsters.my.domain;
access_log /var/log/nginx/lobsters_access.log;
error_log /var/log/nginx/lobsters_error.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/lobsters.my.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lobsters.my.domain/privkey.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://127.0.0.1:3000;
proxy_redirect off;
proxy_http_version 1.1;
}
}
感谢您的帮助。
您在 nginx
终止了 SSL 连接,然后在端口 3000 上与您的后端进程 运行 建立了一个新的 SSL 连接。您应该使用 HTTP 在 nginx
和端口 3000 之间进行通信.
将您的 proxy_pass
语句更改为:
proxy_pass http://127.0.0.1:3000;
或(使用您的 upstream
指令):
proxy_pass http://lobsters;
我在 Raspberry Pi 上使用 nginx 作为 Rails 应用程序的反向代理。我设法让它在 http 中工作,但我想启用 https。
问题是,Rails 应用程序似乎无法处理 https 请求。这是 Rails 服务器在我尝试访问页面时的输出:
ERROR bad Request-Line `\x16\x03\x01\x01\x1C\x01\x00\x01\x18\x03\x03ɳ▒▒▒ ▒▒ڬ▒▒9C▒▒▒=▒▒▒-v_\f▒&▒%9}\x00\x00▒▒0▒,▒(▒$▒\x14▒'.
我对这一切都很陌生,但根据我的理解,我应该以某种方式将我的证书和密钥传达给 Rails 以便它能够解密请求?
这是我要安装的应用程序:https://github.com/jcs/lobsters
这是我当前的 nginx 配置:
upstream lobsters {
server 127.0.0.1:3000;
keepalive 8;
}
## Redirects all HTTP traffic to the HTTPS host
server {
listen 0.0.0.0:80;
server_name lobsters.my.domain;
server_tokens off;
return 301 https://$http_host$request_uri;
access_log /var/log/nginx/lobsters_access.log;
error_log /var/log/nginx/lobsters_error.log;
}
## HTTPS host
server {
listen 0.0.0.0:443 ssl;
server_name lobsters.my.domain;
access_log /var/log/nginx/lobsters_access.log;
error_log /var/log/nginx/lobsters_error.log;
ssl on;
ssl_certificate /etc/letsencrypt/live/lobsters.my.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/lobsters.my.domain/privkey.pem;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass https://127.0.0.1:3000;
proxy_redirect off;
proxy_http_version 1.1;
}
}
感谢您的帮助。
您在 nginx
终止了 SSL 连接,然后在端口 3000 上与您的后端进程 运行 建立了一个新的 SSL 连接。您应该使用 HTTP 在 nginx
和端口 3000 之间进行通信.
将您的 proxy_pass
语句更改为:
proxy_pass http://127.0.0.1:3000;
或(使用您的 upstream
指令):
proxy_pass http://lobsters;