使用 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?

使用 Nginx、Puma 和 Redis 部署 Rails 5 Action Cable

使用 puma nginx 和 capistrano 设置 ROR 应用程序

在 puma、rails、nginx 上设置 rails 应用程序一切都在运行,但 nginx 发送错误