Как настроить стриминг видео большого размера в Nginx?

Ссылка скопирована
1 ответ

Добрый день!
Есть сайт на котором должно воспроизводиться видео
C Видео которые весят мало все нормально работает
Но когда я пытаюсь запустить видео большого размера около 2GB при запросе вылазит ошибка 502
При запуске проекта локально все работает

Проект написан на Django

Request Headers:

GET /stream/1/ HTTP/1.1 Accept: */* Accept-Encoding: identity;q=1, *;q=0 Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,tt;q=0.6,ro;q=0.5 Connection: keep-alive Cookie: csrftoken=plWGGaJUIsuU45DK6xiPnqzyX0qBrC5o; sessionid=gcoccsqsp7mej0mk5d8wizmhgd9jba7o Host: example.ru Range: bytes=0- Referer: https://example.ru/film/jau-2024/ Sec-Fetch-Dest: video Sec-Fetch-Mode: no-cors Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS"

GET /stream/1/ HTTP/1.1 Accept: */* Accept-Encoding: identity;q=1, *;q=0 Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,tt;q=0.6,ro;q=0.5 Connection: keep-alive Cookie: csrftoken=plWGGaJUIsuU45DK6xiPnqzyX0qBrC5o; sessionid=gcoccsqsp7mej0mk5d8wizmhgd9jba7o Host: example.ru Range: bytes=0- Referer: https://example.ru/film/jau-2024/ Sec-Fetch-Dest: video Sec-Fetch-Mode: no-cors Sec-Fetch-Site: same-origin User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 sec-ch-ua: "Chromium";v="122", "Not(A:Brand";v="24", "Google Chrome";v="122" sec-ch-ua-mobile: ?0 sec-ch-ua-platform: "macOS"

Response Headers:

HTTP/1.1 502 Bad Gateway Server: nginx/1.18.0 (Ubuntu) Date: Tue, 19 Mar 2024 08:07:01 GMT Content-Type: text/html Content-Length: 568 Connection: keep-alive

HTTP/1.1 502 Bad Gateway Server: nginx/1.18.0 (Ubuntu) Date: Tue, 19 Mar 2024 08:07:01 GMT Content-Type: text/html Content-Length: 568 Connection: keep-alive

Содержимое nginx.conf:

user root; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;  events {         worker_connections 768;         # multi_accept on; }  http {          ##         # Basic Settings         ##          sendfile on;         tcp_nopush on;         types_hash_max_size 2048;         client_max_body_size 3G;         client_body_buffer_size 128k;         # server_tokens off;          # server_names_hash_bucket_size 64;         # server_name_in_redirect off;          include /etc/nginx/mime.types;         default_type application/octet-stream;          ##         # SSL Settings         ##          ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE         ssl_prefer_server_ciphers on;          ##         # Logging Settings         ##          access_log /var/log/nginx/access.log;         error_log /var/log/nginx/error.log;          ##         # Gzip Settings         ##          gzip on;          # gzip_vary on;         # gzip_proxied any;         # gzip_comp_level 6;         # gzip_buffers 16 8k;         # gzip_http_version 1.1;         # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;          ##         # Virtual Host Configs "nginx.conf" 85L, 1500B                                                                                                                                                                           20,1-8    Наверху

user root; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events { worker_connections 768; # multi_accept on; } http { ## # Basic Settings ## sendfile on; tcp_nopush on; types_hash_max_size 2048; client_max_body_size 3G; client_body_buffer_size 128k; # server_tokens off; # server_names_hash_bucket_size 64; # server_name_in_redirect off; include /etc/nginx/mime.types; default_type application/octet-stream; ## # SSL Settings ## ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; ## # Logging Settings ## access_log /var/log/nginx/access.log; error_log /var/log/nginx/error.log; ## # Gzip Settings ## gzip on; # gzip_vary on; # gzip_proxied any; # gzip_comp_level 6; # gzip_buffers 16 8k; # gzip_http_version 1.1; # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; ## # Virtual Host Configs "nginx.conf" 85L, 1500B 20,1-8 Наверху

Дополнительно:

php не используется случайно?

  • Drno, нет, проект написан на Python Django
  • А где конфиг сайта?
  • Наверное nginx в режиме реверсного прокси пытается вычитать весь файл в память чтобы потом его медленно
    отдавать клиенту. Но тут облом. Стриминг это обычно не файл. И у стриминга трудно посчитать конец.
    Бесконечный он. Вот такие дела.
  • mayton2019, получается памяти не хватает чтоли? Потому что с маленькими фалами все норм, нет таких проблем
  • sportik174, скорее всего nginx здесь не помошник. Видосы лучше просо перекладывать на какой-то
    видео-хостинг. И давать ссылки.
  • mayton2019, это либо деньги, либо условный ютуб (но тут свои проблемы)
  • В логах то какая ошибка?
  • sportik174, надо смотреть в логи (error.log). Большие ответы могут приводить к записи во временные файлы, и чаще всего где-то там обнаруживается, что доступа на запись нет.
  • Ответы:

    Попробуйте увеличить размер ответа от сервера в конфиге nginx max_response_body_size = ...

    Неплохо было конечно запостить конфиг nginx полностью (так как самое интересное как раз пропущено)
    Попробую предположить: вы используется python для авторизации доступа к видео и после авторизации выдаете файл средствами python?
    Если так, то есть несколько более гуманных способов:

    • использовать в скрипте отдачи видео HTTP заголовок X-Accel-Redirect вместо отдачи самим скриптом (емнип у Джанго даже есть готовый модуль для этого) - думаю самое простое
    • отдавать видео самим nginx (а он прекрасно отдает файлы и в 10Гб) а для авторизации воспользоваться директивами nginx secure_link или AuthUrl -это несколько сложнее но лучше работает под большой нагрузкой
    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Мария Код Ответ

    Для настройки стриминга видео большого размера в Nginx, вам потребуется выполнить несколько шагов:

    1. Установите Nginx на ваш сервер, если он еще не установлен. Вы можете сделать это с помощью менеджера пакетов вашей операционной системы.

    2. Подготовьте видеофайл, который вы планируете транслировать. Убедитесь, что файл имеет подходящий формат и кодеки для воспроизведения в браузере.

    3. Создайте конфигурационный файл для Nginx, в котором будет настроен стриминг видео. Ниже приведен пример конфигурации для стриминга видеофайла с именем "video.mp4":

    server {
        listen 80;
        server_name example.com;
     
        location /video {
            alias /path/to/video/directory;
            mp4;
            mp4_buffer_size 1M;
            mp4_max_buffer_size 5M;
        }
    }

    server { listen 80; server_name example.com; location /video { alias /path/to/video/directory; mp4; mp4_buffer_size 1M; mp4_max_buffer_size 5M; } }

    4. Перезапустите Nginx, чтобы применить изменения в конфигурации. Вы можете сделать это с помощью команды `sudo systemctl restart nginx`.

    5. Теперь вы можете обращаться к видеофайлу по URL вида "http://example.com/video/video.mp4" и стримить его через Nginx.

    Убедитесь, что ваш сервер имеет достаточно ресурсов для обработки стриминга видео большого размера и что ваша сеть поддерживает передачу данных с высокой пропускной способностью. Также учитывайте, что стриминг видео может потреблять большой объем трафика, поэтому убедитесь, что у вас достаточно места на диске и трафика в вашем хостинге.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно