2016-10-24 11 views
-1

Я работаю над веб-камерой, которую я построил с помощью малины Pi. Она имеет следующие компоненты:Nginx возвращает 502, если служба не готова к запуску

  • Node.js на порт 3000
  • FFmpeg/FFserver на порт 8090
  • Nginx перед к прокси эти услуги вместе над портами 80/443 (HTTP/HTTPS)

Проблема, с которой я столкнулся, заключается в том, что если FFserver не полностью готов на порт 8090 при запуске Nginx, он будет постоянно возвращать 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

После просмотра журналов Nginx на /var/log/nginx/error.log я мог видеть, что запросы шли на адрес обратной связи 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

Хорошо решена. Никогда не видел эту проблему раньше, спасибо! –