windows下搭建nginx-rtmp伺服器
阿新 • • 發佈:2020-11-24
# 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檔案,裡面內容如下,後面的將幾個依賴包加入的配置程式碼根據實際情況填寫不同路徑。
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
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