Skip to content

手把手教你搭建 Nginx-RTMP 串流媒體伺服器(Ubuntu/Windows)

作者簡介

👋Hi,我是 EZ 線上工具網的站長,專注於多媒體線上影片技術與瀏覽器端工具開發。

EZ 線上工具網 是一個以 線上影片處理 為核心的工具平台,提供包括 M3U8 線上播放、M3U8 轉 MP4、RTMP / HLS 串流測試、FFmpeg 線上轉碼 等功能,全部可直接在瀏覽器中使用,無需安裝客戶端。

引言

隨著直播產業的爆發,B站、抖音、影片號已經成為我們生活的一部分。但你是否想過,這些光鮮亮麗的直播背後,技術原理是什麼?如果我們想自己做一個私服,或者在內網搭建一個監控推流伺服器,該怎麼做?本文將從零開始,超詳細地教你在 Ubuntu 和 Windows 兩大主流平台上,手把手編譯、配置、並跑通 Nginx-RTMP 串流媒體伺服器。讓你不僅「知其然」,更「知其所以然」。

為什麼選擇 Nginx-RTMP?

在串流媒體領域,協定繁多,例如:RTMP、HLS、FLV、WebRTC 等,伺服器也有 SRS、ZLMediaKit、Nginx-RTMP 等。為什麼偏偏選 Nginx-RTMP? 我總結了概括以下優點:

  • 高效能:眾所周知,Nginx 的高並發能力天下聞名。
  • 極度輕量:資源佔用極低,一台 1H1G 的雲端伺服器就能扛住幾百路推流。
  • 配置簡單:一個 nginx.conf 走天下。
  • 功能強大:支援 RTMP 推流,同時支援 HTTP-FLV 和 HLS 播放,完美相容 PC 和行動端。 本文目標:搭建一台伺服器,實現 OBS 推流 -> 伺服器 -> VLC/瀏覽器 播放 的完整閉環。

前期準備

工欲善其事,必先利其器。請準備好以下環境:

  • 一台伺服器/電腦:雲端伺服器(推薦 Ubuntu 20.04/22.04)或者本地 Windows 電腦。
  • 推流工具: OBS Studio(開源免費,推流界的瑞士軍刀)。
  • 播放工具: VLC Media Player(萬能播放器)。
  • 程式碼編輯器: VS Code、Notepad++ 或 Vim。

Ubuntu 平台搭建

為了方便演示,這裡使用的是 Ubuntu,這裡不用 apt install,因為官方源裡的 Nginx 不帶 RTMP 模組,所以需要從原始碼編譯,聽起來很嚇人?其實就是複製貼上幾行指令的事。😎

安裝編譯依賴

打開終端機,依序執行以下指令:

bash
# 更新軟體源
sudo apt-get update

# 安裝編譯工具和依賴庫
sudo apt-get install build-essential libpcre3 libpcre3-dev libssl-dev zlib1g-dev unzip wget

下載 Nginx 和 RTMP 模組

我們需要兩個壓縮包:Nginx 原始碼包、Nginx-RTMP-Module 模組包。

bash
# 建立一個工作目錄
mkdir ~/nginx-build && cd ~/nginx-build

# 下載 Nginx (推薦 1.20.x 版本,穩定)
wget http://nginx.org/download/nginx-1.20.2.tar.gz

# 下載 RTMP 模組 (作者 arut 的原版)
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip

解壓縮與配置

bash
# 解壓縮
tar -zxvf nginx-1.20.2.tar.gz
unzip master.zip

# 進入 Nginx 目錄
cd nginx-1.20.2

最關鍵的一步來了:配置編譯參數。 我們要告訴 Nginx:除了自帶的功能,把旁邊那個 nginx-rtmp-module 也打包進去。

bash
./configure \
--prefix=/usr/local/nginx \
--add-module=../nginx-rtmp-module-master \
--with-http_ssl_module \
--with-http_v2_module

參數解釋

  • --prefix:指定安裝目錄,方便管理。
  • --add-module:指定 RTMP 模組原始碼路徑,注意是上一級目錄的 master 資料夾。
  • --with-http_ssl_module:開啟 SSL 支援,注意:HLS 必須用 HTTPS。

如果沒有報錯,最後會顯示 "configured successfully"。

編譯與安裝

bash
# 編譯(make),-j4 表示用 4 個核心編譯,速度快,可以根據機器配置設置核心數
make -j4

sudo make install

安裝完成後,你的 Nginx 就在 /usr/local/nginx 目錄下了。

編譯安裝Nginx-RTMP

Ubuntu 系統服務配置

建立 systemd 服務檔案:

bash
sudo vim /etc/systemd/system/nginx-rtmp.service

新增以下內容:

ini
[Unit]
Description=nginx-rtmp server
After=network.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

啟用服務:

bash
sudo systemctl enable nginx-rtmp
sudo systemctl start nginx-rtmp

Windows 平台搭建

Windows 編譯環境太麻煩,好在有大神做了編譯好的二進位包。

下載解壓縮

  1. 訪問 GitHub 倉庫:illuspas/nginx-rtmp-win32
  2. 下載最新的 nginx-rtmp-win32-1.2.1.zip
  3. 解壓縮到非中文路徑,例如 D:\nginx-rtmp

Windows Nginx RTMP

看到 nginx.exe 了嗎?這就是我們的主角。


核心配置:nginx.conf 詳解

無論 Ubuntu 還是 Windows,靈魂都在 conf/nginx.conf 檔案裡。 用編輯器打開它,找到 http { ... } 部分,在它的外面同級位置,新增以下 rtmp 配置:

nginx
rtmp {
    server {
        listen 1935; # RTMP 預設連接埠
        chunk_size 4096;

        application live {
            live on;             # 開啟直播模式
            record off;          # 關閉錄製(節省硬碟)
            allow publish 127.0.0.1; # 允許推流的客戶端 IP,生產環境建議改成內網 IP 或密碼驗證
            
            # 開啟 HLS 切片
            hls on;
            hls_path /tmp/hls;   # Ubuntu 路徑
            # hls_path D:/nginx-rtmp/temp/hls; # Windows 路徑,注意反斜線
            hls_fragment 3s;     # 每個切片 3 秒
            hls_playlist_length 10s; # 播放清單長度 10 秒
        }
    }
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80; # HTTP 預設連接埠,用於播放 HLS
        server_name  localhost;

        # HLS 播放配置
        location /hls {
            types {
                application/vnd.apple.mpegurl m3u8;
                video/mp2t ts;
            }
            root /tmp; # Ubuntu
            # root D:/nginx-rtmp/temp; # Windows
            add_header Cache-Control no-cache;
        }
    }
}

配置儲存後:

  • Ubuntusudo /usr/local/nginx/sbin/nginx 啟動。
  • Windows:雙擊 nginx.exe 啟動(會閃一個黑視窗)。

防火牆注意:務必開放 1935 (推流) 和 80 (播放) 連接埠!

  • Ubuntu: sudo ufw allow 1935 && sudo ufw allow 80
  • Windows: 防火牆進階設定 -> 輸入規則 -> 新建規則 -> 連接埠 -> TCP 1935, 80。

Windows 防火牆連接埠放行設定


實戰推流:OBS 連接伺服器

根據實際情況替換掉下方的伺服器,我這裡的 IP 是 192.168.1.3

OBS 設定

  1. 來源:新增「顯示器擷取」或「視訊擷取裝置」。

  2. 設定 -> 直播

    • 服務:自訂
    • 伺服器rtmp://192.168.1.3/live
    • 推流碼test 這個可以自訂,相當於房間號
  3. 設定 -> 輸出

    • 碼率:2000 Kbps (2Mbps) 足夠清晰。
    • 輸出模式->關鍵幀間隔:2 秒。

OBS Studio 推流設定

點擊「開始推流」

如果 OBS 右下角顯示「正在推流」,且碼率不是 0,恭喜你!資料已經發出去了!


實戰拉流:三種方式看直播

推上去了,怎麼看?有三種主流協定。

協定URL 格式延遲優點缺點
RTMPrtmp://ip/live/test1-3 秒極低延遲瀏覽器不支援,需播放器
HTTP-FLVhttp://ip/live/test.flv2-5 秒低延遲,網頁可播需 flv.js 支援
HLShttp://ip/hls/test.m3u810-30 秒相容性最好延遲高

方式一:VLC 播放

  1. 打開 VLC -> 媒體 -> 開啟網路串流。
  2. 輸入:rtmp://你的IP/live/test
  3. 按 Enter,畫面出來了!

VLC 播放器成功播放畫面

方式二:瀏覽器播放 HLS(Safari/Edge)

直接在網址列輸入:http://你的IP/hls/test.m3u8 Safari 和 Edge 原生支援 HLS,直接就能看。Chrome 需要擴充功能。

方式三:網頁播放 HTTP-FLV

這裡推薦 EZ 線上工具網的 FLV/RTMP 線上播放器,免去開發的麻煩。非常適合 RTMP 直播串流測試,支援 RTMP 和 FLV 格式,即時直播串流資訊、截圖等功能。

如果想自己編寫,可以參考 B 站開源的 flv.js。 建立一個 index.html 檔案,貼入以下程式碼:

html
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Nginx-RTMP 直播</title>
    <script src="https://cdn.bootcss.com/flv.js/1.5.0/flv.min.js"></script>
</head>
<body>
    <h1>我的直播間</h1>
    <video id="videoElement" controls width="800" height="450"></video>
    <script>
        if (flvjs.isSupported()) {
            var videoElement = document.getElementById('videoElement');
            var flvPlayer = flvjs.createPlayer({
                type: 'flv',
                url: 'http://你的IP/live/test.flv' // 注意這裡是 flv
            });
            flvPlayer.attachMediaElement(videoElement);
            flvPlayer.load();
            flvPlayer.play();
        }
    </script>
</body>
</html>

注意:上面的 nginx.conf 預設沒開 flv,要開的話在 rtmp -> application live 裡加一句 allow publish 127.0.0.1; 然後在 http server 裡加:

nginx
location /live {
    flv_live on;
    chunked_transfer_encoding on;
    add_header 'Access-Control-Allow-Origin' '*';
}

FLV/RTMP線上播放器


進階:內網穿透,讓外網存取

如果你是在自己電腦上搭的(Windows),朋友想看怎麼辦?你沒有公網 IP。

有三種方案:

  1. 花生殼/Frp:簡單,但免費版限速。
  2. Zerotier/Hamachi:組建虛擬區域網路,朋友裝個客戶端,用內網 IP 存取。
  3. Ngrok:國外工具,穩定但要錢。

最傻瓜的方法(路由器連接埠映射): 如果你有光貓撥號的公網 IP:

  1. 登入路由器(192.168.1.1)。
  2. 找到「虛擬伺服器」或「連接埠轉發」。
  3. 新增兩條:
    • 外部連接埠 1935 -> 內部 IP(你電腦 IP) -> 內部連接埠 1935
    • 外部連接埠 80 -> 內部 IP(你電腦 IP) -> 內部連接埠 80
  4. 推流位址填你的公網 IP 即可。

常見問題排查

現象原因解決方法
OBS 推流報錯 connection refused防火牆擋了 / Nginx 沒開檢查防火牆,`ps -ef
OBS 推流成功,VLC 黑屏編碼格式不對OBS 視訊編碼改為 H.264,音訊改為 AAC
公網無法存取,內網可以沒做連接埠映射 / 沒公網 IP去路由器做映射,或用 Frp
HLS 播放 404Nginx 配置路徑不對檢查 hls_pathlocation /hlsroot 是否對應

查看日誌是個好習慣!

  • Ubuntu: tail -f /usr/local/nginx/logs/error.log
  • Windows: logs/error.log

總結與展望

恭喜你!你已經掌握了串流媒體伺服器最核心的搭建技術。

回顧一下我們做了什麼:

  1. 搞定了 Ubuntu / Windows Nginx-RTMP 模組的環境搭建。
  2. 對配置檔案 nginx.conf 進行了 RTMP 推流的配置。
  3. 打通了 OBS -> Nginx -> VLC 的鏈路。

下一步可以玩什麼?

  • 錄製回放:配置 record all;exec_record_done 腳本,實現直播自動錄製並上傳到隨選視訊系統。
  • 多碼率:配置 ffmpeg 轉碼,讓使用者根據網速選擇 720P/1080P。
  • 鑑權:防止別人亂推流,配置 on_publish 介面回調驗證密鑰。
  • WebRTC:Nginx-RTMP 延遲還是有點高,想做連麥互動?去研究 ZLMediaKit 或 SRS,它們原生支援 WebRTC,延遟能到 500ms 以內。

參考資料

Last updated: