手把手教你搭建 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 模組,所以需要從原始碼編譯,聽起來很嚇人?其實就是複製貼上幾行指令的事。😎
安裝編譯依賴
打開終端機,依序執行以下指令:
# 更新軟體源
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 模組包。
# 建立一個工作目錄
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解壓縮與配置
# 解壓縮
tar -zxvf nginx-1.20.2.tar.gz
unzip master.zip
# 進入 Nginx 目錄
cd nginx-1.20.2最關鍵的一步來了:配置編譯參數。 我們要告訴 Nginx:除了自帶的功能,把旁邊那個 nginx-rtmp-module 也打包進去。
./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"。
編譯與安裝
# 編譯(make),-j4 表示用 4 個核心編譯,速度快,可以根據機器配置設置核心數
make -j4
sudo make install安裝完成後,你的 Nginx 就在 /usr/local/nginx 目錄下了。

Ubuntu 系統服務配置
建立 systemd 服務檔案:
sudo vim /etc/systemd/system/nginx-rtmp.service新增以下內容:
[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啟用服務:
sudo systemctl enable nginx-rtmp
sudo systemctl start nginx-rtmpWindows 平台搭建
Windows 編譯環境太麻煩,好在有大神做了編譯好的二進位包。
下載解壓縮
- 訪問 GitHub 倉庫:illuspas/nginx-rtmp-win32。
- 下載最新的
nginx-rtmp-win32-1.2.1.zip。 - 解壓縮到非中文路徑,例如
D:\nginx-rtmp。

看到 nginx.exe 了嗎?這就是我們的主角。
核心配置:nginx.conf 詳解
無論 Ubuntu 還是 Windows,靈魂都在 conf/nginx.conf 檔案裡。 用編輯器打開它,找到 http { ... } 部分,在它的外面同級位置,新增以下 rtmp 配置:
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;
}
}
}配置儲存後:
- Ubuntu:
sudo /usr/local/nginx/sbin/nginx啟動。 - Windows:雙擊
nginx.exe啟動(會閃一個黑視窗)。
防火牆注意:務必開放 1935 (推流) 和 80 (播放) 連接埠!
- Ubuntu:
sudo ufw allow 1935 && sudo ufw allow 80- Windows: 防火牆進階設定 -> 輸入規則 -> 新建規則 -> 連接埠 -> TCP 1935, 80。

實戰推流:OBS 連接伺服器
根據實際情況替換掉下方的伺服器,我這裡的 IP 是 192.168.1.3。
OBS 設定
來源:新增「顯示器擷取」或「視訊擷取裝置」。
設定 -> 直播:
- 服務:自訂
- 伺服器:
rtmp://192.168.1.3/live - 推流碼:
test這個可以自訂,相當於房間號
設定 -> 輸出:
- 碼率:2000 Kbps (2Mbps) 足夠清晰。
- 輸出模式->關鍵幀間隔:2 秒。

點擊「開始推流」
如果 OBS 右下角顯示「正在推流」,且碼率不是 0,恭喜你!資料已經發出去了!
實戰拉流:三種方式看直播
推上去了,怎麼看?有三種主流協定。
| 協定 | URL 格式 | 延遲 | 優點 | 缺點 |
|---|---|---|---|---|
| RTMP | rtmp://ip/live/test | 1-3 秒 | 極低延遲 | 瀏覽器不支援,需播放器 |
| HTTP-FLV | http://ip/live/test.flv | 2-5 秒 | 低延遲,網頁可播 | 需 flv.js 支援 |
| HLS | http://ip/hls/test.m3u8 | 10-30 秒 | 相容性最好 | 延遲高 |
方式一:VLC 播放
- 打開 VLC -> 媒體 -> 開啟網路串流。
- 輸入:
rtmp://你的IP/live/test - 按 Enter,畫面出來了!

方式二:瀏覽器播放 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 檔案,貼入以下程式碼:
<!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裡加:nginxlocation /live { flv_live on; chunked_transfer_encoding on; add_header 'Access-Control-Allow-Origin' '*'; }

進階:內網穿透,讓外網存取
如果你是在自己電腦上搭的(Windows),朋友想看怎麼辦?你沒有公網 IP。
有三種方案:
- 花生殼/Frp:簡單,但免費版限速。
- Zerotier/Hamachi:組建虛擬區域網路,朋友裝個客戶端,用內網 IP 存取。
- Ngrok:國外工具,穩定但要錢。
最傻瓜的方法(路由器連接埠映射): 如果你有光貓撥號的公網 IP:
- 登入路由器(192.168.1.1)。
- 找到「虛擬伺服器」或「連接埠轉發」。
- 新增兩條:
- 外部連接埠 1935 -> 內部 IP(你電腦 IP) -> 內部連接埠 1935
- 外部連接埠 80 -> 內部 IP(你電腦 IP) -> 內部連接埠 80
- 推流位址填你的公網 IP 即可。
常見問題排查
| 現象 | 原因 | 解決方法 |
|---|---|---|
OBS 推流報錯 connection refused | 防火牆擋了 / Nginx 沒開 | 檢查防火牆,`ps -ef |
| OBS 推流成功,VLC 黑屏 | 編碼格式不對 | OBS 視訊編碼改為 H.264,音訊改為 AAC |
| 公網無法存取,內網可以 | 沒做連接埠映射 / 沒公網 IP | 去路由器做映射,或用 Frp |
| HLS 播放 404 | Nginx 配置路徑不對 | 檢查 hls_path 和 location /hls 的 root 是否對應 |
查看日誌是個好習慣!
- Ubuntu:
tail -f /usr/local/nginx/logs/error.log - Windows:
logs/error.log
總結與展望
恭喜你!你已經掌握了串流媒體伺服器最核心的搭建技術。
回顧一下我們做了什麼:
- 搞定了 Ubuntu / Windows Nginx-RTMP 模組的環境搭建。
- 對配置檔案
nginx.conf進行了 RTMP 推流的配置。 - 打通了 OBS -> Nginx -> VLC 的鏈路。
下一步可以玩什麼?
- 錄製回放:配置
record all;和exec_record_done腳本,實現直播自動錄製並上傳到隨選視訊系統。 - 多碼率:配置
ffmpeg轉碼,讓使用者根據網速選擇 720P/1080P。 - 鑑權:防止別人亂推流,配置
on_publish介面回調驗證密鑰。 - WebRTC:Nginx-RTMP 延遲還是有點高,想做連麥互動?去研究 ZLMediaKit 或 SRS,它們原生支援 WebRTC,延遟能到 500ms 以內。