如果服务未在启动时就准备好,则Nginx会返回502

时间:2016-10-24 00:15:03

标签: nginx reverse-proxy ffserver

我正在使用Raspberry Pi构建的网络摄像头。它有以下组件:

  • 端口3000上的Node.js
  • 端口8090上的FFmpeg / FFserver
  • Nginx在前面通过端口80/443(HTTP / HTTPS)
  • 代理这些服务

我遇到的问题是,如果在Nginx启动时FFserver在端口8090上没有完全就绪,它将继续为stream.mjpeg返回502,即使该流正在运行。就像Nginx确定主机不存在然后再也不尝试一样。一旦我重新启动/重新加载Nginx配置,它就会重新开始工作。

为什么会这样?我缺少重试条件吗?

这是Nginx的配置:

server {
  listen 80;
  rewrite ^ https://$host$request_uri? permanent;
}

server {
  listen 443 ssl;

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

  location / {
    proxy_pass http://localhost:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_next_upstream error timeout http_502;

    # Basic auth
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd;
  }

  location /stream.mjpeg {
    proxy_pass http://localhost:8090/stream.mjpeg;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_next_upstream error timeout http_502;

    # Basic auth
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd;
  }
}

1 个答案:

答案 0 :(得分:1)

/var/log/nginx/error.log查看Nginx日志后,我可以看到请求是转到IPv6环回地址而不是IPv4。我将localhost更改为127.0.0.1,问题已得到解决。对于我为什么在重新启动Nginx之后才能工作仍然是个谜。但是之前没有。

  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_next_upstream error timeout http_502;

    # Basic auth
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/htpasswd;
  }