nginx流媒体rtmp直播

 

1.先下载安装  nginx 和 nginx-rtmp 编译依赖工具

sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev

2. 创建一个nginx目录,并切换到nginx目录

mkdir ~/nginx
cd ~/nginx

3. 下载 nginx 和 nginx-rtmp源码

wget http://nginx.org/download/nginx-1.9.9.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

4. 安装unzip工具,解压下载的安装包

sudo apt-get install unzip

5.解压 nginx 和 nginx-rtmp安装包

tar -zxvf nginx-1.9.9.tar.gz
unzip master.zip

6. 切换到 nginx-目录

cd nginx-1.9.9

7.添加 nginx-rtmp 模板编译到 nginx

./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master

8.编译安装

make
sudo make install

9. 安装nginx init 脚本

sudo wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
sudo chmod +x /etc/init.d/nginx
sudo update-rc.d nginx defaults

10. 启动和停止nginx 服务,生成配置文件

sudo service nginx start
sudo service nginx stop

11. 安装 FFmpeg

sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
sudo apt-get update
sudo apt-get install ffmpeg

12. 配置 nginx-rtmp 服务器

打开 /usr/local/nginx/conf/nginx.conf

添加location

location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root ~/nginx/www;
            expires -1;
            add_header Cache-Control no-cache;
        }

文件末尾添加rtmp配置

rtmp {
      server {
              listen 1935; 
              publish_time_fix on;
              application myapp {
                      live on; #stream on live allow
                      allow publish all; # control access privilege
                      allow play all; # control access privilege
              }
              application hls {
                      live on;
                      hls on;  #这个参数把直播服务器改造成实时回放服务器。
                      hls_path ~/nginx/www/hls;        #切片视频文件存放位置。
                      wait_key on; #对视频切片进行保护,这样就不会产生马赛克了。 
                      hls_fragment 10s; #每个视频切片的时长。 
                      hls_playlist_length 60s; #总共可以回看的事件,这里设置的是1分钟。 
                      hls_continuous on; #连续模式。 
                      hls_cleanup on; #对多余的切片进行删除。 
                      hls_nested on; #嵌套模式。
              }
      }
}

13. 保存上面配置文件,然后重新启动nginx服务

sudo service nginx restart

14. ffmpeg将rtsp转码为rtmp

(后面的rtmp在其他地方的访问地址为:rtmp://ip:1935/myapp/stream-name,可用VLC media player打开)

ffmpeg -i "rtsp://xxxx" -f flv -r 15 -s 1280x960 -an "rtmp://localhost:1935/myapp/stream-name"

15. ffmpeg将rtsp转码为m3u8:

(m3u8的访问地址为:http://ip:port/hls/stream-name.m3u8,port为nginx的访问端口号)

ffmpeg -i "rtsp://admin:auto12345@114.242.47.195:2012" -strict -2 -c:v libx264 -c:a aac -f hls /var/www/hls/stream-name.m3u8

16. html中使用video.js访问流媒体服务器:

国人处理好的videojs包为:http://pan.baidu.com/s/1kVuU3PX,此包已经支持IE8的视频播放。

<!DOCTYPE html>
<html>
<head>
  <title>Video.js | HTML5 Video Player</title>

  <!-- Chang URLs to wherever Video.js files will be hosted -->
  <link href="video-js.css" rel="stylesheet" type="text/css">
  <!-- video.js must be in the <head> for older IEs to work. -->
  <script src="video.js"></script>

  <!-- Unless using the CDN hosted version, update the URL to the Flash SWF -->
  <script>
    videojs.options.flash.swf = "video-js.swf";
  </script>
</head>
<body>
  <video id="example_video_1" class="video-js vjs-default-skin" controls preload="none" width="640" height="264"
      poster="oceans-clip.png"
      data-setup="{}">
   <source src="rtmp://e.5iwf.cn:1935/myapp/video5" type="rtmp/flv">
    <!-- 如果上面的rtmp流无法播放,就播放hls流 -->
    <source src="http://e.5iwf.cn:9999/hls/video5.m3u8" type='application/x-mpegURL'>
  </video>
</body>
</html>

为博客添加Let’s Encrypt 免费证书

前段时间闹得沸沸扬扬的沃通丑闻事件最终以 Google,Firefox 相继宣布停止信任沃通和 StartCom 的证书宣告结束。按照沃通 CA 以及 StartCom 的证书在国内外的使用广泛程度,估计得有一大批网站需要更换 SSL 证书。

本博客在建立之初就使用了 Let’s Encrypt 的免费证书,这个被沃通说成是「非常危险」的 CA,恰恰是一个不错的选择。

在之前的文章中提到,Let’s Encrypt 是一家旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的 SSL/TLS 证书的数字证书认证机构。在 2015 年 9 月 7 日推出之后后不到半年的时间里就签发了一百万张证书,而现在每天都要签发 5.5 万张证书。可以说 Let’s Encrypt 对 HTTPS 的普及起到了至关重要的作用。

关于 HTTPS

大概从去年开始,我偶尔会发现之前收藏的网站变成了未收藏状态,仔细一看才发现原来是这些网站的地址都变成了 https 开头。

越来越多的网站开始采用 HTTPS 加密,同时 Mozilla、Google 等公司也在促进 HTTPS 的普及。可以看到,全面启用 HTTPS 已经是大势所趋。

2016年10月13日 Firefox 用户加载的半数网页启用了 HTTPS
2016年11月04日 Chrome 用户访问的网页 HTTPS 超过一半

什么是 HTTPS

简单地来说,HTTPS 是建立在非对称加密方式上的保证通信双方信息传输安全性的一种超文本传输安全协议,能够防止信息在传送过程中被监听和篡改。

为什么要采用 HTTPS

可能你会觉得,只有那些银行或者购物网站等涉及到财产安全的网站才需要采用 HTTPS 加密,或者只有登录的时候需要 HTTPS,一般的个人网站根本没有必要。但我想你肯定不会希望自己网站的图片都被替换成小广告吧(滑稽?

另外,Mozilla 和 Google 等主流浏览器公司也在逐步淘汰 HTTP,终极目标是彻底使用 HTTPS 取代 HTTP。为此 Google 还于 2014 年 8 月 6 日宣布提高 HTTPS 网站的排名。

2015 年 4 月 30 日 Mozilla 宣布淘汰 HTTP
2016 年 9 月 08 日 谷歌 Chrome56 正式将 HTTP 页面标记「不安全」

不加密的 HTTP 连接是不安全的,你和目标服务器之间的任何中间人能读取和操纵传输的数据,最简单的例子就是运营商劫持的页面跳转和小广告,你很可能根本不知道你看到的广告是否是网站发布的。而且中间人能够注入的代码不仅仅是看起来无害的广告,他们还可能注入具有恶意目的的代码。

为网站启用 HTTPS

申请 Let’s Encrypt 证书

Let’s Encrypt 官方提供了方便快捷的部署工具 Certbot,可以实现自动部署甚至自动续签。

安装 Certbot

在 Ubuntu 上只需要简单的几行命令:

$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx

其他的发行版可以在这里选择。

使用 webroot 自动生成证书

Certbot 支持多种不同的「插件」来获取证书,这里选择使用 webroot 插件,它可以在不停止 Web 服务器的前提下自动生成证书,使用 --webroot 参数指定网站的根目录。

$ sudo certbot certonly --webroot -w /var/www/wordpress -d liangjb.cc

这样,在 /var/www/wordpress/ 目录下创建临时文件 .well-known/acme-challenge ,通过这个文件来证明对域名 liangjb.cc 的控制权,然后 Let’s Encrypt 验证服务器发出 HTTP 请求,验证每个请求的域的 DNS 解析,验证成功即颁发证书。

验证过程中需要配置服务器接受来自http端口当前请求,如果是采用proxy_pass方式则需要预先设置好root目录。

location ^~ /.well-known/acme-challenge/ {
   default_type "text/plain";
   root     /var/www/wordpress;
}

location = /.well-known/acme-challenge/ {
   return 404;
}

生成的 pem 和 key 在 /etc/letsencrypt/live/ 目录下

cert.pem 用户证书
chain.pem 中间证书
fullchain.pem 证书链, chain.pem + cert.pem
privkey.pem 证书私钥

配置 Nginx

修改 Nginx 配置文件中关于证书的配置,配置文件可以通过 Mozilla SSL Configuration Generator 生成。

ssl_certificate /etc/letsencrypt/live/liangjb.cc/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/liangjb.cc/privkey.pem;

然后重启 Nginx ,应该就可以看到小绿标了。

$ sudo systemctl restart nginx

自动续期方式1

Let’s Encrypt 的证书有效期为 90 天,不过我们可以通过 crontab 定时运行命令更新证书。

先运行以下命令来测试证书的自动更新:

cerbot renew dryrun

如果一切正常,就可以编辑 crontab 定期运行以下命令:

cerbot renew

执行频率只要小于 30 天一次即可,因为证书默认从有效期内第 60 天开始被视为即将过期。

sudo crontab -e

添加配置

30 2 * * 1 /usr/bin/certbot renew  >> /var/log/le-renew.log

自动续期方式2

通过 systemd 来自动执行证书续期任务。

$ sudo vim /etc/systemd/system/letsencrypt.service
[Unit]
Description=Let's Encrypt renewal

[Service]
Type=oneshot  
ExecStart=/usr/bin/letsencrypt renew  
ExecStartPost=/bin/systemctl reload nginx.service  

然后增加一个 systemd timer 来触发这个服务:

$ sudo vim /etc/systemd/system/letsencrypt.timer
[Unit]
Description=Monthly renewal of Let's Encrypt's certificates

[Timer]
OnCalendar=daily  
Persistent=true

[Install]
WantedBy=timers.target  

启用服务,开启 timer:

$ sudo systemctl enable letsencrypt.service
$ sudo systemctl start letsencrypt.timer

HTTPS 评分

完成配置之后可以使用以下两个工具对博客 HTTPS 配置的安全性进行评分。

扩展阅读

  1. Certbot#ubuntuxenial-nginx
  2. User Guide — Certbot documentation #Webroot
  3. Let’s Encrypt,免费好用的 HTTPS 证书
  4. Let’s Encrypt 给网站加 HTTPS 完全指南