Skip to content

Instantly share code, notes, and snippets.

@CSRaghunandan
Last active December 28, 2023 21:37
Show Gist options
  • Star 40 You must be signed in to star a gist
  • Fork 18 You must be signed in to fork a gist
  • Save CSRaghunandan/ce2394cd5a9c8a412f8ff5ee1478560a to your computer and use it in GitHub Desktop.
Save CSRaghunandan/ce2394cd5a9c8a412f8ff5ee1478560a to your computer and use it in GitHub Desktop.
Nginx configuration for serving mp4 videos
#user nobody;
worker_processes 4;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
access_log off;
sendfile_max_chunk 512k;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
server {
# add proxy caches
proxy_cache_path /tmp/mycache keys_zone=mycache:70m;
listen *:9000 ;
#listen [::]:80 ipv6only=on;
root /usr/local/nginx/html;
index index.html index.htm;
# Make site accessible from http://localhost/
server_name _;
location /rtc {
#try_files $uri $uri/ /index.html;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:8088/janus;
}
location /rtcapp {
# enable thread pools for livestream
aio threads=default;
proxy_pass http://localhost:8188;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
}
location ~ \.flv$ {
# enable thread pool
aio threads=default;
flv;
}
location ~/.mp4 {
root /media;
mp4;
mp4_buffer_size 1M;
mp4_max_buffer_size 3M;
# enable thread bool
aio threads=default;
# enable caching for mp4 videos
proxy_cache mycache;
proxy_cache_valid 200 300s;
proxy_cache_lock on;
# enable nginx slicing
slice 1m;
proxy_cache_key $host$uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
# Immediately forward requests to the origin if we are filling the cache
proxy_cache_lock_timeout 0s;
# Set the 'age' to a value larger than the expected fill time
proxy_cache_lock_age 200s;
proxy_cache_use_stale updating;
}
}
}
@insinfo
Copy link

insinfo commented Jan 27, 2022

I currently have this configuration below for an nginx reverse proxy server that points to another application server, I would like to enable mp4 pseudo-streaming on this nginx reverse proxy server. since the videos are on the other application server the "10.0.0.72:85" does this work on a reverse proxy server? Because I heard that the mp4 module only works on the server where the videos are hosted, is this correct?

#experimenteriodasostras.com.br HTTP
# Expires map
map $sent_http_content_type $expires {
    default off;
    text/html epoch;
    text/css max;
    application/javascript max;
    ~image/ max;
}
server {
    listen 80;
    listen [::]:80;
    server_name experimenteriodasostras.com.br;
    return 301 https://www.experimenteriodasostras.com.br$request_uri;
}
server {
    listen 80;
    listen [::]:80;
    server_name www.experimenteriodasostras.com.br;
    return 301 https://www.experimenteriodasostras.com.br$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name experimenteriodasostras.com.br;
    ssl_certificate /var/www/html/config/www.experimenteriodasostras.com.br_chained.crt;
    ssl_certificate_key /var/www/html/config/www.experimenteriodasostras.com.br.key;
    return 301 https://www.experimenteriodasostras.com.br$request_uri;
}
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    #expires $expires;
    location / {
        proxy_pass http://10.0.0.72:85;
        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-Host $server_name;
        proxy_redirect off;
    }

    ssl_certificate /var/www/html/config/www.experimenteriodasostras.com.br_chained.crt;
    ssl_certificate_key /var/www/html/config/www.experimenteriodasostras.com.br.key;
   
    client_max_body_size 64M;
    server_name www.experimenteriodasostras.com.br;
}

@CSRaghunandan
Copy link
Author

@insinfo yes, the videos that need to be served for nginx mp4 video module has to be located on the same machine where the nginx server is running.

You operate nginx as both a reverse proxy and a mp4 VOD server.

@leslietoo
Copy link

@CSRaghunandan Could you please tell me what nginx modules needed for your conf file?

@romitkarmakar
Copy link

For Ubuntu Users please first install nginx mp4 module using this command

sudo apt-get install nginx-extras

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment