'Nginx RTMP not recording

I already setting up Nginx RTMP in ubuntu linux hosted by DigitalOcean. And currently running my laravel web application in localhost mode in my desktop. Everything seems work fine for the live streaming. I'm testing with my localhost JWPlayer and Open Broadcaster Software(OBS) for live streaming. It works. But whenever I need to record the streaming video to linux directory (/var/www), seems like nothing happen and no error at all after I hit stop streaming button in OBS.

I'm don't know how does the recording works, I try record manual and it has the link on it. I click start record, it comes out /var/rec/{mystream}.flv

This manual version of recording link embed in laravel website:

rtmp {
    server {
            listen 1935;
            chunk_size 4096;

            application live {

                    live on;

                    recorder rec1 {
                        record all manual;
                        record_suffix all.flv;
                        record_path /var/rec;
                        record_unique on;
                    }
            }
    }
}

Start Recording:

<a href="http://server.com/control/record/start?app=live&name=key&rec=rec1" target="_blank">Start rec1</a>

nginx config for http:

access_log logs/rtmp_access.log;
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  logs/access.log  main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout  0;
keepalive_timeout  65;

#gzip  on;

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;

    location / {
        root   html;
        index  index.html index.htm;
    }

    location /stat {
        rtmp_stat all;
        rtmp_stat_stylesheet stat.xsl;  
    }

    location /stat.xsl {
        root /var/www/;
    }


    location /control {
        rtmp_control all;
    }


   #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

By the way

Plan B: I plan to store my recorded stream files to Amazon AWS s3. Anyone know how to do this with RTMP Nginx instead of using Wowza Amazon.



Solution 1:[1]

You can run inside shell script nginx conf. Check the permission first:

chown -R nobody:nogroup foldername

chmod -R 700 foldername

Shell script:

ffmpeg -v error -y -i "$1" -vcodec libx264 -acodec aac -f mp4 -movflags +faststart "/tmp/recordings/$2.mp4"

aws s3 cp "/tmp/recordings/$basname.mp4" "s3://bucketname/"

exec_record_done bash -c "/home/ubuntu/script/record.sh $path $basname";

Solution 2:[2]

You should check the permissions on the directory you're trying to record to (/var/rec in your case). Nginx, even though started up with sudo, spawns worker processes as user "nobody" by default. You can also try changing the user that the worker processes spawn as: https://serverfault.com/a/534512/102045

Solution 3:[3]

When i did this with my partner I would use

record_path /tmp/rec;

Then in the file I would set a crontab that permanently tries to send new files(videos) to his NextCloud FTP(In this case could be your amazon aws)

Solution 4:[4]

Apart from the user permission settings mentioned in other answers, I also had to change the path to end with a trailing backslash i.e. /var/rec/ instead of /var/rec

Solution 5:[5]

It seems like bhh1998 and akash jakhad answers are correct, although it seems that nowadays the nginx.conf file comes with nginx user as default, so instead of using nobody and nogroup, use only nginx instead. The command mentioned in previous answers would be like this:

chown -R nginx:nginx foldername

To be sure of the correct username, check your configuration file and see which user is being specified.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 sɐunıɔןɐqɐp
Solution 2 Community
Solution 3 Explosivo30
Solution 4 nsrCodes
Solution 5 João Luca