使用 SSL 和 Nginx 运行 Puma
Posted
技术标签:
【中文标题】使用 SSL 和 Nginx 运行 Puma【英文标题】:Running Puma with SSL and Nginx 【发布时间】:2018-07-29 09:23:21 【问题描述】:我在 Rails API 上运行 Angular 应用程序。
Web 服务器:nginx 应用服务器:Puma SSL 证书:LetsEncrypt 托管在:运行 Ubuntu 16.04.3 LTS 的 AWS EC2我可以使用 SSL 为我的 Angular 应用程序提供服务,但在 SSL 上运行 Rails API 时遇到问题。在 production.rb 中,我添加了 config.force_ssl = true
。我使用RAILS_ENV=production rails server --binding=*public ip of instance*
运行Rails 服务器。
这是我用于 api 的 nginx 配置文件:
upstream app
server localhost:3000;
server
listen 80;
listen [::]:80;
server_name api.domain.com;
return 302 https://$server_name$request_uri;
server
#SSL Configuration
listen 443 ssl;
listen [::]:443 ssl;
include snippets/snakeoil.conf;
server_name api.domain.com;
location /
proxy_pass https://app;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
这是我包含的snakeoil.conf 文件:
ssl_certificate /etc/letsencrypt/live/www.domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain.com/privkey.pem;
当我向 api.domain.com 发出请求时,我收到 502 Bad Gateway 错误。 Rails 抛出这个 2018-02-19 07:07:02 +0000: HTTP parse error, malformed request (): #<Puma::HttpParserError: Invalid HTTP format, parsing fails.
这是配置问题还是我必须更改应用程序代码中的某些内容?
【问题讨论】:
如果你遇到了 api vai http,那么在你使用 SSL 时将其替换为 https。 我正在使用 https。此外,第一个服务器块无论如何都会将请求重定向到 https。 【参考方案1】:Puma 只理解 http 请求,但您强制它处理 https 请求。
将“proxy_pass https://app”替换为“proxy_pass http://app”应该可以解决您的问题。
【讨论】:
以上是关于使用 SSL 和 Nginx 运行 Puma的主要内容,如果未能解决你的问题,请参考以下文章
使用 -d(守护进程)运行 Rails(Puma)时的 Nginx 502
运行 Puma 和 Nginx 的带有 AWS Elastic Beanstalk 的 Rails 应用程序 502
使用 Nginx、Puma 和 Redis 部署 Rails 5 Action Cable