2016-10-24 62 views
-1

我正在使用Raspberry Pi构建的摄像头。它具有以下组件:如果服务未准备就绪,Nginx会返回502

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

我遇到的问题是,如果在Nginx启动时FFserver在端口8090上没有完全准备好,即使流正在运行,它也将持续返回502的stream.mjpeg。就好像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; 
    } 
} 
+0

如果确实有一个应用程序在8090上运行,那么不应该发生这种情况。您确认您的应用程序正在运行吗?关于防火墙问题呢?有什么东西在8090上听? (例如'netstat -atun | grep 8090'可能会给出一些指示)。作为一个方面说明:您不需要将'/ stream.mjpeg'附加到'proxy_pass'。 NGINX为你做这件事,因为它落在那个位置块。 –

+0

我可以通过直接转到该端口来确认服务正在运行。他们确实需要分开的地点,因为他们在不同的港口。不过,我相信我解决了它,所以请参阅下面的答案。 – jocull

回答

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; 
    } 
+0

很好解决。从未见过这个问题,谢谢! –