windows下搭建nginx-rtmp伺服器
- 2020 年 11 月 24 日
- 筆記
- JWPlayer, Nginx, nginx windows, nginx-rtmp, 備忘錄, 直播
windows下搭建nginx-rtmp伺服器
此文為筆者在CSDN上的原文遷移://blog.csdn.net/never715/article/details/74078954
最近因為接觸直播相關的技術工作,使用的也是基於高並發和高性能的nginx,首先需要做的當然是搭建一個nginx伺服器。
對於linux上nginx伺服器的搭建此處就不再贅述,按照操作指引來的話一般都能順理成章搭建起來。
對於linux操作不熟練的手殘黨來說,當然是希望能在windows下也能用上這一套。剛開始在windows下搭建環境的時候遇到了很多問題,後面逐個解決花費不少功夫,怕以後忘了,就把我在windows下編譯nginx和搭建RTMP直播伺服器的過程記錄下來,權當做個備忘。
準備工作
-
安裝MinGW
在這些準備工作之前,你的電腦上至少安裝有一款IDE,我的是VS2008。
首先安裝MinGW,後面的nginx編譯需要先在msys環境下進行。
安裝方式可以有在線安裝和離線安裝兩種方式,離線安裝的話過程很繁瑣,需要自己下載各種包解壓、配置路徑等等操作,所以此處採用無腦式的在線安裝進行說明。
由於MinGW的很多資源包都是在sourceforge上下載的,中國雖然能訪問,但是速度奇慢,在線安裝過程中經常會出現下載組件失敗,強烈建議翻牆安裝。
-
到MinGW找到MinGW安裝引導程式mingw-get-setup.exe的鏈接地址並下載,下載的文件不到100KB。執行安裝工具,開始選擇安裝路徑時要注意,不要將MinGW安裝到帶有空格或者中文路徑的目錄下!!。
-
默認情況下,在下載完成後會在桌面生成一個MinGW Installer快捷圖標,如果沒有,也可以去MinGW安裝目錄中找到,
$MinGW安裝目錄\libexec\mingw-get\guimain.exe
。接下來運行安裝之後的快捷圖標,選擇要在線安裝的組件,此處只需選擇Basic Setup下msys及gcc相關組件就行了。
然後,選擇Installation菜單中Apply Changes進行在線下載和安裝,整個過程可能會持續十幾分鐘。
當然後續有需要可以再利用這個安裝介面進行組件的更改或者刪除
如果安裝過程中出現組件下載失敗的情況,直接確定繼續往下,安裝程式會在所有的依賴包下載完成之後進行解壓安裝,執行完成後,在不關閉安裝介面的前提下,回到上面的第二個步驟再來一遍,一直到沒有安裝錯誤。 -
至此,MinGW的成功安裝後,勾選的項目會變成淺綠色填充。
MinGW的安裝目錄下也會有msys的目錄,進入該目錄裡面,會看到有個批處理文件msys.bat
,可以把它創建到桌面作為快捷方式,雙擊進去就進入msys環境了。使用上和linux終端類似,不過是個精簡版的,命令沒有linux下的全,可以使用mingw-get命令進行在線安裝某些包,比如,要安裝gdb,直接輸入命令mingw-get install gdb
。
MinGW正常安裝的話,一般會自動將路徑加入到環境變數。如果在使用中出現問題,檢查下是不是因為路徑設置的原因,手動將$MinGW安裝目錄\bin
和$MinGW安裝目錄\msys\1.0\bin
加入到windows的PATH環境變數。
-
安裝Mercurial
Mercurial是一個版本管理工具,後面我們需要用它下載windows下的nginx源碼。
-
到Mercurial下載windows版並安裝。
-
安裝時最好將安裝目錄選擇在沒有空格和中文目錄的路徑下。安裝完成後,在cmd中執行命令
hg
,如果有以下顯示則表示安裝成功了。
-
安裝strawberryperl
Strawberry Perl是Windows環境的Perl環境,包含了運行和開發Perl應用程式所需的全部內容,它的目的是儘可能接近UNIX系統上的Perl環境,後面在編譯nginx及其依賴庫的時候需要用到。
- 到Strawberry Perl下載並安裝windows下的安裝程式,選擇安裝路徑時最好選擇在沒有空格和中文目錄的路徑下。
-
安裝nasm
NASM全稱The Netwide Assembler,是一款基於80×86和x86-64平台的彙編語言編譯程式,其設計初衷是為了實現編譯器程式跨平台和模組化的特性,至於為什麼要安裝這貨,後面再說。
- 到NASM下載安裝程式安裝即可。
- 安裝完成後,將其安裝路徑加入到PATH環境變數。
-
下載nginx相關的源碼包
搭建nginx-rtmp伺服器需要下載nginx源碼和nginx-rtmp-module源碼。以及nginx依賴的組件。 後面將要在msys下進行配置,不像linux下直接可以使用yum install xxx-devel的形式安裝依賴的組件包頭。所以需要將nginx相關的源碼包悉數下載好,注意是源碼包,因為nginx編譯時需要引用這些依賴庫的開發標頭。
- nginx
linux下的nginx源碼包可以直接去nginx網站下載,但是上面的源碼包只有linux的,源碼的os文件夾下僅有unix平台的。而windows只有編譯好的文件。這裡就需要使用Mercurial下載帶有win32平台的nginx源碼包。
在cmd中執行命令hg clone //hg.nginx.org/nginx nginx-win32-src
下載最新的nginx程式碼,耐心等待源碼down到本地,也可以下載指定的版本,具體參考hg help
。 - nginx-rtmp-module
作為nginx外接的擴展模組,將用作後面搭建RTMP直播環境的一部分
使用Git或者SVN等工具或者直接去GitHub上下載nginx-rtmp-module
以下是我使用的幾個源碼包的版本:
nginx-release-1.31.1 tag
nginx-rtmp-module-1.1.11.tar.gz
pcre-8.40.tar.gz
zlib-1.2.11.tar.gz
openssl-1.0.2l.tar.gz
編譯nginx
-
將上述下載好的五個源碼包拷貝到msys目錄下
$MinGW安裝目錄\msys\1.0\home\$USERNAME\
。 -
打開msys批處理文件,分別解壓之前下載的源碼包。
-
進入nginx源碼目錄。新建一個configuration-nginx.bat文件,裡面內容如下,後面的將幾個依賴包加入的配置程式碼根據實際情況填寫不同路徑。
auto/configure --with-cc=cl --builddir=objs --prefix=
--conf-path=conf/nginx.conf --pid-path=logs/nginx.pid
--http-log-path=logs/access.log --error-log-path=logs/error.log
--sbin-path=nginx.exe --http-client-body-temp-path=temp/client_body_temp
--http-proxy-temp-path=temp/proxy_temp
--http-fastcgi-temp-path=temp/fastcgi_temp
--with-cc-opt=-DFD_SETSIZE=1024
--with-select_module
--with-debug
--with-http_ssl_module
--with-pcre=../pcre-8.40 --with-zlib=../zlib-1.2.11 --with-openssl=../openssl-1.0.2l
--add-module=../nginx-rtmp-module-1.1.11
-
此時執行該批處理文件,稍稍等待幾秒鐘,會出現nginx配置完成的資訊。
這裡會發現有一個異樣的提示,auto/cc/msvc: line 117: [: : integer expression expected ,只要修改文件$nginx源碼目錄\auto\cc\msvc
即可,在echo " + cl version: $NGX_MSVC_VER"
的前面加入一行NGX_MSVC_VER=15.00
,當然不修改也不會影響後續的編譯。
如果需要指定後續編譯nginx時禁用優化,則將其中的CFLAGS="$CFLAGS -O2"
修改為CFLAGS="$CFLAGS -Od"
。
到這裡為止,msys的使命就完成了。 -
打開Visual Studio 2008 命令提示,在命令提示符中進入到nginx源碼目錄,執行命令
nmake /f objs\MakeFile
,會發現編譯報錯。
此時,之前安裝的NASM就該登場了。
打開文件$nginx源碼目錄\auto\lib\openssl\makefile.msvc
,將其中的
ms\do_ms
修改為
ms\do_nasm
然後,刪除openssl源碼目錄中的out32和tmp32兩個臨時目錄,重新啟動Visual Studio 2008 命令提示,再次執行前面的第五步就可以了。 -
成功編譯之後,最終會有以下列印資訊,並且在nginx源碼目錄的objs目錄中可以看到最終生成的nginx.exe文件。
nginx-rtmp環境搭建
-
可以在msys的根目錄
/
下新建一個nginx目錄,然後將生成的nginx.exe,nginx源碼目錄下的conf目錄以及docs目錄下的html目錄都拷貝到當前目錄,並手動新建logs和temp兩個目錄,形成最終的目錄結構。
-
隨後修改conf/nginx.conf,關於如何配置和修改不在本文範疇內,so,略過~。
在當前nginx目錄中,啟動windows命令行,運行start /b nginx.exe -c conf\nginx.conf
這樣nginx服務就在後台啟動了。在瀏覽器中輸入地址進入到nginx服務的主頁,如果可以看到如下內容,說明整個環境已經OK,接下來可以使用推流和拉流看看實際效果了。最後使用命令nginx.exe -s stop
優雅地終止nginx服務。
效果測試
接下來的效果測試,對環境稍微做了一點點改動,使用nginx-rtmp-module中提供的JWPlayer的Play頁面進行拉流或者Record頁面進行推流。
-
首先是在nginx/html/目錄下新建一個文件夾 nginx-rtmp-module,將之前解壓的nginx-rtmp-module-1.1.11目錄下的stat.xsl文件以及test文件夾拷貝到新建的目錄nginx-rtmp-module下。
-
修改nginx/html/nginx-rtmp-module/test/nginx.conf文件,關閉nginx的守護和master-worker模式,由於本機有SVN佔據了80埠,所以修改http的服務埠為8080,同時將nginx服務的訪問目錄修改為剛才nginx-rtmp-module中指向的index文件。再加入RTMP模組的配置,最終的配置文件內容如下:
worker_processes 1; daemon off; master_process off; error_log logs/error.log info; events { worker_connections 1024; } rtmp { server { listen 1935; application live { live on; } } } http { server { listen 8080; location /stat { rtmp_stat all; rtmp_stat_stylesheet stat.xsl; } location /stat.xsl { root html/nginx-rtmp-module/; } location /control { rtmp_control all; } location /rtmp-publisher { root html/nginx-rtmp-module/test; } location / { root html/nginx-rtmp-module/test/www; } } }
-
配置拉流名字,修改nginx/html/nginx-rtmp-module/test/www/index.html文件,將
file: "rtmp://localhost/myapp?carg=1/mystream?sarg=2"
修改為
file: "rtmp://localhost/live?carg=1/test?sarg=2"
以保持和上面的配置文件一致。 -
配置推流名稱,修改nginx/html/nginx-rtmp-module/test/www/record.html文件,將開始的
'streamer': 'rtmp://localhost/myapp',
修改為
'streamer': 'rtmp://localhost/live'
以保持和上面的配置文件一致。 -
在msys下進入nginx目錄,執行
nginx.exe -c html/nginx-rtmp-module/test/nginx.conf &
nginx服務會在後台運行。
-
推流,推流的手段有很多,此處使用ffmpeg將本地的文件流化並推到nginx服務。
ffmpeg -re -i "F:\TDDownload\BBC記錄片\BBC理查德哈蒙德:看不見的世界BD中字-cd1.mkv" -vcodec copy -f flv rtmp://192.168.100.2/live/test
-
拉流,拉流方式也很多,瀏覽器中打開nginx服務的主頁面192.168.100.2:8080,可以看到出現的影片播放窗口,點擊Play即可拉流,此時的流地址就是上面配置好的
rtmp://192.168.100.2/live/test
,也可在SRS播放器頁面
輸入流地址rtmp://192.168.100.2/live/test
拉流,還可利用ffplay rtmp://192.168.100.2/live/test
拉流。
-
打開nginx服務的統計頁面192.168.100.2:8080/stat也可以看到當前的服務運行狀態。
-
使用JWPlayer的Record頁面採集攝影機和麥的數據推流到nginx服務,在SRS播放器頁面拉流,由於前面配置的Record頁面推流的名字是mystream,所以此處輸入
rtmp://192.168.100.2/live/mystream
。
最後說明
本來還試著在移動端試試播放效果,不過JWPlayer貌似是不支援直接在html頁面進行rtmp直播,不過可以下載一個app(易推流)進行rtmp的直播測試。
有關nginx-rtmp伺服器的搭建過程到此就算全部完成了,在此過程中當然也不全是靠我自己的摸索,也參考了前輩或同行的經驗,在此感謝那些曾經的貢獻者,參考資料如下:
//blog.csdn.net/felixking/article/details/51981794
//nginx.org/en/docs/howto_build_on_win32.html