【问题标题】:Nginx HTTPS Load Balancing upstream sent no valid HTTP/1.0 headerNginx HTTPS 负载平衡上游未发送有效的 HTTP/1.0 标头
【发布时间】:2015-06-29 10:52:15
【问题描述】:

我正在通过我的 Nginx 服务器向 rails 发送 AJAX DELETE 请求,我可以看到 db 正在正确更新,并且来自 rails 服务器的响应符合预期。但响应状态不是success,而是error 状态。

当我提醒 xhr.status 时,它会显示 0

我使用 Nginx 进行了以下负载平衡设置 -

我在端口 3000 和 3001 上有 2 个 rails 服务器。我需要接受来自浏览器的 https 请求并将它们重定向到 rails 服务器。我有以下 Nginx Conf 文件 -

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    passenger_root /home/hkr/.rvm/gems/ruby-2.2.0@global/gems/passenger-5.0.6;
    passenger_ruby /home/hkr/.rvm/wrappers/ruby-2.2.0/ruby;

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

sendfile        on;

keepalive_timeout  65;

gzip  on;

upstream web-cluster {
    ip_hash;
    server localhost:3001;
    server localhost:3000;
}

server {
    listen       80;
    server_name  localhost;

    location / {
        root   html;
        index  index.html index.htm;
    }


    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}

server {
    listen       443 ssl;
    server_name  ruby-trail.com;
    root PATH_TO_PROJECT/public;
    passenger_enabled on;
    rails_env development;

    ssl_certificate      /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key  /etc/nginx/ssl/nginx.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    error_log /var/log/nginx/my-error.log;
    access_log /var/log/nginx/my-access.log;        

    location / {

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

        index  $uri $uri/ index.html index.htm;
        proxy_pass http://web-cluster$request_uri;
        proxy_redirect  http://localhost:3001 https://ruby-trail.com;
    }
}   

当我发送 ajax DELETE 请求时,rails 服务器正在响应正确的预期响应,但响应没有获得 OK 200 状态。

这是来自 NGINX 错误日志 -

2015/04/21 20:28:07 [error] 23316#0: *18 upstream sent no valid HTTP/1.0 header while reading response header from upstream, client: 127.0.0.1, server: ruby-trail.com, request: "DELETE /links/48.json HTTP/1.1", upstream: "http://127.0.0.1:3001/links/48.json", host: "ruby-trail.com", referrer: "https://ruby-trail.com/groups/18"

这是来自 NGINX 访问日志 -

127.0.0.1 - - [21/Apr/2015:20:28:07 -0500] "DELETE /links/48.json HTTP/1.1" 009 1044 "https://ruby-trail.com/groups/18" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36"

当我直接访问 Rails 服务器时没有问题,只有 Nginx 设置我得到 upstream sent no valid HTTP/1.0 header 错误。

请让我知道我在哪里犯了错误。 提前致谢。

【问题讨论】:

    标签: ruby-on-rails ajax nginx load-balancing reverse-proxy


    【解决方案1】:

    该问题与 Nginx 配置无关。 由于 Rails 中的后端控制器代码不正确,服务器以 0 状态响应。

    在删除请求时,我返回了一个不正确的 Json 响应,如下所示。

    def destroy     
        @link = Links.find(params[:id])
        @link.destroy    
        respond_to do |format|
        format.json { render json: @link, status: "success" } // incorrect
    end
    

    json响应需要如下-

    def destroy     
            @link = Links.find(params[:id])
            @link.destroy    
            respond_to do |format|
            format.json { head :no_content } //correct
    end
    

    这就是 Jquery Ajax 调用执行错误代码块而不是成功代码的原因。

    【讨论】:

    • 对不起,我之前没有发现这个问题,在这些情况下它总是代码 - Nginx 不够聪明,无法搞乱来自上游的响应。
    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多