之前在使用nginx和nginx-rtmp-module搭建流媒體伺服器的時候遇到一個很尷尬的問題,就是在把nginx-rtmp-module模塊添加到nginx中去的時候,我最開始採取的做法是先卸載原來的nginx,再下載nginx和nginx-rtmp-module的源碼重新編譯並安裝.重裝完之 ...
之前在使用nginx和nginx-rtmp-module搭建流媒體伺服器的時候遇到一個很尷尬的問題,就是在把nginx-rtmp-module模塊添加到nginx中去的時候,我最開始採取的做法是先卸載原來的nginx,再下載nginx和nginx-rtmp-module的源碼重新編譯並安裝.重裝完之後我測試了一下流媒體伺服器是正常的,但是接下來問題來了,由於我有一些WEB工程是部署在之前搭建好的LUMP環境下的,現在重裝了nginx,這些工程需要重新部署.於是,我又開始重新部署這些WEB工程,但是結果讓我哭暈在了廁所,因為nginx的目錄結構發生了很大改變,導致我沒辦法配置原來的WEB工程了.此後我陷入了很長時間的掙扎和徘徊,網上搜尋了很多解決方案,但是這些方案大多都是側重講如何編譯安裝nginx以及進行推拉流測試,沒有涉及到我這方面的問題.後來,我在瀏覽帖子的時候看到有人說把自己編譯的nginx可執行文件替換掉原來的nginx共用庫能解決問題,於是立馬試了一把,結果發現真的可以!現在的nginx能同時運行流媒體服務和部署WEB工程,魚與熊掌兼得!
下麵簡單介紹一下我的操作過程,希望能為遇到同樣問題的你帶來一些幫助(我的配置環境:Ubuntu Server 16.04 + nginx1.10.0 + nginx-rtmp-module-master).
1.先採用apt-get的方式安裝nginx.目前用此方式安裝的nginx的版本號為1.10.0
1 sudo apt-get update 2 sudo apt-get install nginx
2.到你喜歡的目錄下用你喜歡的名字創建一個目錄,用於存放nginx和nginx-rtmp-module的源碼,例如:我在根目錄/softwares(softwares也是我自己創建的)下麵創建了nginx目錄,接下來我會把nginx和nginx-rtmp-module下載到nginx目錄下.
1 cd softwares/ 2 sudo mkdir nginx
3.進入nginx目錄.
1 cd nginx/
4.下載nginx源碼,註意:下載的源碼版本需要與步驟1安裝的nginx的版本保持一致,以避免不必要的問題.獲取nginx源碼的途徑很多,此處推薦兩種方式.
方式a:在終端執行apt-get source nginx命令,直接獲取到對應版本的源碼.
1 sudo apt-get source nginx
此方式下載完之後會自動解壓,nginx-1.10.0目錄即nginx源碼目錄.
方式b:在nginx的官網上面找到對應版本然後下載.
1 sudo wget http://nginx.org/download/nginx-1.10.0.tar.gz
此方式下載完之後需要自己手動解壓.解碼命令:
1 sudo tar zxvf nginx-1.10.0.tar.gz
5.下載nginx-rtmp-module的源碼.
1 sudo wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
因為nginx-rtmp-module已在GitHub上開源,所以也可以直接從GitHub上獲取.GitHub地址: https://github.com/arut/nginx-rtmp-module.
6.解壓nginx-rtmp-module源碼的壓縮包.
1 sudo unzip master.zip
7.進入nginx源碼目錄.
1 cd nginx-1.10.0/
8.查看當前nginx的配置信息,並將當前配置信息完整保存到一個地方,後面在編譯nginx源碼的時候需要依據當前的配置信息來進行配置.
1 nginx -V
註意命令行中的V是大寫哦,小寫只能看到nginx的版本號.我當前的nginx配置信息如下:
--with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads
9.配置nginx源碼編譯信息,將nginx-rtmp-module添加到nginx中.
1 sudo ./configure --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=../nginx-rtmp-module-master
註意,這一行命令其實是這樣組成的: sudo ./configure <原來的配置信息> --add-module=../nginx-rtmp-module-master.這樣就將nginx-rtmp-module添加到nginx配置裡面了,同時將之前保存的nginx配置信息添加到了用於此次編譯的配置信息裡面,儘可能地保證了編譯出來的nginx與原來的nginx功能一致.細心的同學會發現,其實我在配置nginx信息的時候並沒有將原來所有的配置信息都寫進去,原因是如果全部複製粘貼過去,在編譯的時候會出現一些不太好處理的錯誤,這些錯誤一時半會兒還沒找到好的解決方案,所以就縮減了一些配置信息,縮減之後在功能模塊上並無太大差異,所以可放心使用.
10.配置完成之後,執行make命令開始編譯nginx源碼.編譯完成之後,會在nginx源碼目錄的objs目錄下生成nginx可執行文件.
1 sudo make
11.將生成的nginx可執行文件拷貝到/usr/sbin目錄下,替換原來的nginx共用庫文件. 註意: 原來/usr/sbin目錄有一個nginx共用庫文件,我們使用編譯出來的nginx可執行文件對其進行替換.
1 sudo nginx /usr/sbin
12.重啟nginx.
1 sudo service nginx restart
13.再次查看nginx配置信息.
1 nginx -V
可以看到nginx-rtmp-module模塊已經添加到了nginx裡面.
1 --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads --add-module=../nginx-rtmp-module-master
試了試推流拉流,功能正常,再運行了一下原來的WEB工程,也正常!
最後,我說明一下為什麼要先通過apt-get的方式安裝nginx,再進行編譯替換.原因是為了方便在LUMP環境下部署WEB工程.如果不先通過apt-get的方式安裝nginx,而是直接下載源碼編譯安裝,則nginx的配置目錄會不齊全,很難去部署WEB項目(也許通過某些操作也能實現部署,但是具體怎麼操作還是要花時間去研究nginx的).如果不搭建流媒體服務,我建議都通過apt-get的方式安裝nginx,步驟簡單又省心!