Nginx HTTPS 负载平衡上游发送无效 HTTP/1.0 header
Nginx HTTPS Load Balancing upstream sent no valid HTTP/1.0 header
我正在通过我的 Nginx 服务器向 rails 发送一个 AJAX DELETE 请求,我能够看到数据库正在正确更新以及来自 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错误。
请让我知道我在哪里犯了错误。
提前致谢。
问题与Nginx配置无关。
服务器以 [=20=]0 状态响应,因为 Rails 中的后端控制器代码不正确。
在删除请求中,我返回了一个不正确的 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 服务器向 rails 发送一个 AJAX DELETE 请求,我能够看到数据库正在正确更新以及来自 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错误。
请让我知道我在哪里犯了错误。 提前致谢。
问题与Nginx配置无关。 服务器以 [=20=]0 状态响应,因为 Rails 中的后端控制器代码不正确。
在删除请求中,我返回了一个不正确的 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 调用执行错误代码块而不是成功代码的原因。