1. 程式人生 > >windows下搭建nginx-rtmp伺服器

windows下搭建nginx-rtmp伺服器

# windows下搭建nginx-rtmp伺服器 *此文為筆者在CSDN上的原文遷移:https://blog.csdn.net/never715/article/details/74078954* [toc] 最近因為接觸直播相關的技術工作,使用的也是基於高併發和高效能的nginx,首先需要做的當然是搭建一個nginx伺服器。 對於linux上nginx伺服器的搭建此處就不再贅述,按照操作指引來的話一般都能順理成章搭建起來。 對於linux操作不熟練的手殘黨來說,當然是希望能在windows下也能用上這一套。剛開始在windows下搭建環境的時候遇到了很多問題,後面逐個解決花費不少功夫,怕以後忘了,就把我在windows下編譯nginx和搭建RTMP直播伺服器的過程記錄下來,權當做個備忘。 ------------------- ##準備工作 - ###**安裝MinGW** 在這些準備工作之前,你的電腦上至少安裝有一款IDE,我的是VS2008。 首先安裝MinGW,後面的nginx編譯需要先在msys環境下進行。 安裝方式可以有線上安裝和離線安裝兩種方式,離線安裝的話過程很繁瑣,需要自己下載各種包解壓、配置路徑等等操作,所以此處採用無腦式的線上安裝進行說明。 由於MinGW的很多資源包都是在sourceforge上下載的,國內雖然能訪問,但是速度奇慢,線上安裝過程中經常會出現下載元件失敗,強烈建議FQ安裝。 1. 到[MinGW](http://www.mingw.org/)找到MinGW安裝載入程式[mingw-get-setup.exe](https://sourceforge.net/projects/mingw/files/latest/download?source=files)的連結地址並下載,下載的檔案不到100KB。執行安裝工具,開始選擇安裝路徑時要注意,**不要將MinGW安裝到帶有空格或者中文路徑的目錄下!!**。 ![MinGW安裝器](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240817551-mingw.png) 2. 預設情況下,在下載完成後會在桌面生成一個MinGW Installer快捷圖示,如果沒有,也可以去MinGW安裝目錄中找到, `$MinGW安裝目錄\libexec\mingw-get\guimain.exe`。接下來執行安裝之後的快捷圖示,選擇要線上安裝的元件,此處只需選擇Basic Setup下msys及gcc相關元件就行了。 然後,選擇Installation選單中Apply Changes進行線上下載和安裝,整個過程可能會持續十幾分鍾。 當然後續有需要可以再利用這個安裝介面進行元件的更改或者刪除 ![安裝勾選項](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240818071-mingw-setup-1.png) 如果安裝過程中出現元件下載失敗的情況,直接確定繼續往下,安裝程式會在所有的依賴包下載完成之後進行解壓安裝,執行完成後,在不關閉安裝介面的前提下,回到上面的第二個步驟再來一遍,一直到沒有安裝錯誤。 3. 至此,MinGW的成功安裝後,勾選的專案會變成淺綠色填充。 ![MinGW安裝完成](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240818171-mingw-setup-2.png) MinGW的安裝目錄下也會有msys的目錄,進入該目錄裡面,會看到有個批處理檔案 `msys.bat`,可以把它建立到桌面作為快捷方式,雙擊進去就進入msys環境了。使用上和linux終端類似,不過是個精簡版的,命令沒有linux下的全,可以使用mingw-get命令進行線上安裝某些包,比如,要安裝gdb,直接輸入命令 `mingw-get install gdb`。 ![mingw線上安裝附加包](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240818311-mingw-setup-3-gdb.png) MinGW正常安裝的話,一般會自動將路徑加入到環境變數。如果在使用中出現問題,檢查下是不是因為路徑設定的原因,手動將 `$MinGW安裝目錄\bin` 和 `$MinGW安裝目錄\msys\1.0\bin` 加入到windows的PATH環境變數。 - ###**安裝Mercurial** Mercurial是一個版本管理工具,後面我們需要用它下載windows下的nginx原始碼。 1. 到[Mercurial](https://www.mercurial-scm.org/)下載windows版並安裝。 ![下載Mercurial](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240818422-mercurial.png) 2. 安裝時最好將安裝目錄選擇在沒有空格和中文目錄的路徑下。安裝完成後,在cmd中執行命令 `hg`,如果有以下顯示則表示安裝成功了。 ![安裝Mercurial](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240818512-mercurial-hg.png) - ###**安裝strawberryperl** Strawberry Perl是Windows環境的Perl環境,包含了執行和開發Perl應用程式所需的全部內容,它的目的是儘可能接近UNIX系統上的Perl環境,後面在編譯nginx及其依賴庫的時候需要用到。 1. 到[Strawberry Perl](http://strawberryperl.com/)下載並安裝windows下的安裝程式,選擇安裝路徑時最好選擇在沒有空格和中文目錄的路徑下。 - ###**安裝nasm** NASM全稱The Netwide Assembler,是一款基於80x86和x86-64平臺的組合語言編譯程式,其設計初衷是為了實現編譯器程式跨平臺和模組化的特性,至於為什麼要安裝這貨,後面再說。 1. 到[NASM](http://www.nasm.us/)下載安裝程式安裝即可。 2. 安裝完成後,將其安裝路徑加入到PATH環境變數。 - ###**下載nginx相關的原始碼包** 搭建nginx-rtmp伺服器需要下載nginx原始碼和nginx-rtmp-module原始碼。以及nginx依賴的元件。 後面將要在msys下進行配置,不像linux下直接可以使用yum install xxx-devel的形式安裝依賴的元件包頭。所以需要將nginx相關的原始碼包悉數下載好,注意是原始碼包,因為nginx編譯時需要引用這些依賴庫的開發標頭。 - [**nginx**](http://hg.nginx.org/nginx) linux下的nginx原始碼包可以直接去[nginx網站](http://nginx.org/)下載,但是上面的原始碼包只有linux的,原始碼的os資料夾下僅有unix平臺的。而windows只有編譯好的檔案。這裡就需要使用Mercurial下載帶有win32平臺的nginx原始碼包。 在cmd中執行命令 `hg clone http://hg.nginx.org/nginx nginx-win32-src` 下載最新的nginx程式碼,耐心等待原始碼down到本地,也可以下載指定的版本,具體參考 `hg help` 。 - [**nginx-rtmp-module**](https://github.com/arut/nginx-rtmp-module) 作為nginx外接的擴充套件模組,將用作後面搭建RTMP直播環境的一部分 使用Git或者SVN等工具或者直接去GitHub上下載nginx-rtmp-module - [**pcre**](https://ftp.pcre.org/pub/pcre/) - [**zlib**](http://www.zlib.net/) - [**openssl**](http://distfiles.macports.org/openssl/) 以下是我使用的幾個原始碼包的版本: [nginx-release-1.31.1 tag](http://hg.nginx.org/nginx/rev/b4cb75066262) [nginx-rtmp-module-1.1.11.tar.gz](https://codeload.github.com/arut/nginx-rtmp-module/tar.gz/v1.1.11) [pcre-8.40.tar.gz](https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gz) [zlib-1.2.11.tar.gz](https://sourceforge.net/projects/libpng/files/zlib/1.2.11/zlib-1.2.11.tar.gz/download?use_mirror=nchc&download=) [openssl-1.0.2l.tar.gz](http://distfiles.macports.org/openssl/openssl-1.0.2l.tar.gz) ## 編譯nginx 1. 將上述下載好的五個原始碼包拷貝到msys目錄下 `$MinGW安裝目錄\msys\1.0\home\$USERNAME\`。 2. 開啟msys批處理檔案,分別解壓之前下載的原始碼包。 3. 進入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
4. 此時執行該批處理檔案,稍稍等待幾秒鐘,會出現nginx配置完成的資訊。 ![nginx編譯-1](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240819043-1-nginx-configure.png) 這裡會發現有一個異樣的提示,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"` 。 ![nginx編譯-1.1](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240819203-2-nginx-configure-err.png) 到這裡為止,msys的使命就完成了。 5. 開啟Visual Studio 2008 命令提示,在命令提示符中進入到nginx原始碼目錄,執行命令 `nmake /f objs\MakeFile` ,會發現編譯報錯。 ![nginx編譯-2](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240819283-3-nginx-vs-err.png) 此時,之前安裝的NASM就該登場了。 開啟檔案 `$nginx原始碼目錄\auto\lib\openssl\makefile.msvc`,將其中的 ms\do_ms 修改為 ms\do_nasm 然後,刪除openssl原始碼目錄中的out32和tmp32兩個臨時目錄,重新啟動Visual Studio 2008 命令提示,再次執行前面的第五步就可以了。 6. 成功編譯之後,最終會有以下列印資訊,並且在nginx原始碼目錄的objs目錄中可以看到最終生成的nginx.exe檔案。 ![nginx編譯-3](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240819423-4-nginx-vs-done.png) ## nginx-rtmp環境搭建 1. 可以在msys的根目錄 `/` 下新建一個nginx目錄,然後將生成的nginx.exe,nginx原始碼目錄下的conf目錄以及docs目錄下的html目錄都拷貝到當前目錄,並手動新建logs和temp兩個目錄,形成最終的目錄結構。 ![nginx環境目錄結構](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240819584-1-nginx-rtmp.png) 2. 隨後修改conf/nginx.conf,關於如何配置和修改不在本文範疇內,so,略過~。 在當前nginx目錄中,啟動windows命令列,執行 `start /b nginx.exe -c conf\nginx.conf` 這樣nginx服務就在後臺啟動了。在瀏覽器中輸入地址進入到nginx服務的主頁,如果可以看到如下內容,說明整個環境已經OK,接下來可以使用推流和拉流看看實際效果了。最後使用命令 `nginx.exe -s stop` 優雅地終止nginx服務。 ![nginx環境OK](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820064-2-nginx-rtmp.png) ## 效果測試 接下來的效果測試,對環境稍微做了一點點改動,使用nginx-rtmp-module中提供的JWPlayer的Play頁面進行拉流或者Record頁面進行推流。 1. 首先是在nginx/html/目錄下新建一個資料夾 nginx-rtmp-module,將之前解壓的nginx-rtmp-module-1.1.11目錄下的stat.xsl檔案以及test資料夾拷貝到新建的目錄nginx-rtmp-module下。 2. 修改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; } } } 3. 配置拉流名字,修改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"` 以保持和上面的配置檔案一致。 4. 配置推流名稱,修改nginx/html/nginx-rtmp-module/test/www/record.html檔案,將開始的 `'streamer': 'rtmp://localhost/myapp',` 修改為 `'streamer': 'rtmp://localhost/live'` 以保持和上面的配置檔案一致。 5. 在msys下進入nginx目錄,執行 `nginx.exe -c html/nginx-rtmp-module/test/nginx.conf &` nginx服務會在後臺執行。 ![nginx服務後臺執行](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820154-3-nginx-rtmp.png) 6. 推流,推流的手段有很多,此處使用ffmpeg將本地的檔案流化並推到nginx服務。 `ffmpeg -re -i "F:\TDDownload\BBC記錄片\BBC理查德哈蒙德:看不見的世界BD中字-cd1.mkv" -vcodec copy -f flv rtmp://192.168.100.2/live/test` ![推流](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820224-4-nginx-rtmp.png) 7. 拉流,拉流方式也很多,瀏覽器中開啟nginx服務的主頁面192.168.100.2:8080,可以看到出現的視訊播放視窗,點選Play即可拉流,此時的流地址就是上面配置好的`rtmp://192.168.100.2/live/test` ,也可在[SRS播放器頁面 ](http://www.ossrs.net/players/srs_player.html?vhost=players)輸入流地址`rtmp://192.168.100.2/live/test` 拉流,還可利用 `ffplay rtmp://192.168.100.2/live/test` 拉流。 ![拉流](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820354-5-nginx-rtmp.png) 8. 開啟nginx服務的統計頁面192.168.100.2:8080/stat也可以看到當前的服務執行狀態。 ![nginx服務執行狀態](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820424-6-nginx-rtmp.png) 9. 使用JWPlayer的Record頁面採集攝像頭和麥的資料推流到nginx服務,在[SRS播放器頁面](http://www.ossrs.net/players/srs_player.html?vhost=players)拉流,由於前面配置的Record頁面推流的名字是mystream,所以此處輸入 `rtmp://192.168.100.2/live/mystream`。 ![採集攝像頭推流](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820484-7-nginx-rtmp.png) ![nginx服務執行狀態2](https://images.cnblogs.com/cnblogs_com/tangm421/1887688/o_2011240820564-8-nginx-rtmp.png) ## 最後說明 本來還試著在移動端試試播放效果,不過JWPlayer貌似是不支援直接在html頁面進行rtmp直播,不過可以下載一個app(易推流)進行rtmp的直播測試。 有關nginx-rtmp伺服器的搭建過程到此就算全部完成了,在此過程中當然也不全是靠我自己的摸索,也參考了前輩或同行的經驗,在此感謝那些曾經的貢獻者,參考資料如下: > http://blog.csdn.net/felixking/article/details/51981794 > http://nginx.org/en/docs/howto_build_on_wi