1. 內(nèi)容介紹
環(huán)境介紹:采用的是華為云的ECS彈性云服務器--鏡像安裝的CentOS7.4 64位 -----是服務器版,非桌面版哦。
在CentOS7.4服務器版本的環(huán)境下搭建NFS服務器、安裝ffmpeg、安裝nginx服務器、部署Qt編譯環(huán)境。
(1)配置NGINX為HTTP服務器,安裝rtmp模塊,完成rtmp視頻推流,支持緩存視頻到本地目錄、支持轉(zhuǎn)為HLS流,通過瀏覽器訪問直播流。
(2)部署Qt編譯環(huán)境,可以編譯Qt代碼,運行Qt程序。 因為是服務器,我這里部署Qt環(huán)境,運行Qt程序是屬于控制臺版本,不用Qt的GUI模塊,只是用核心模塊完成一些功能設計。
(3)安裝、編譯 ffmpeg : 支持源碼編譯安裝ffmpeg、在線安裝ffmpeg,通過ffmpeg可以完成音視頻的一些開發(fā)。比如:視頻轉(zhuǎn)碼、視頻合并、視頻剪切、視頻特效處理。----這里用ffmpeg并不是做播放器,是在服務器上用,主要是處理視頻文件。
(4)安裝NFS服務器,主要是方便與本地Linux系統(tǒng)進行通信,編譯代碼,文件共享。
(5)部署開機自動啟動程序:方便設置自己的程序為開機啟動。
2. 部署NFS服務器
注意:在云服務器上搭建NFS服務器,需要在控制臺開放端口,不然NFS的端口無法正常訪問,會被攔截。
2.1 安裝NFS
[root@ecs-c687-ecrs work]# yum install -y rpc-bind nfs-utils
Loaded plugins: fastestmirror
Determining fastest mirrors
base | 3.6 kB 00:00:00
epel | 4.7 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
(1/7): base/7/x86_64/group_gz | 153 kB 00:00:00
(2/7): epel/x86_64/group_gz | 97 kB 00:00:00
(3/7): epel/x86_64/updateinfo | 1.0 MB 00:00:00
(4/7): base/7/x86_64/primary_db | 6.1 MB 00:00:00
(5/7): epel/x86_64/primary_db | 7.0 MB 00:00:00
(6/7): extras/7/x86_64/primary_db | 250 kB 00:00:00
(7/7): updates/7/x86_64/primary_db | 17 MB 00:00:01
No package rpc-bind available.
Resolving Dependencies
-- > Running transaction check
--- > Package nfs-utils.x86_64 1:1.3.0-0.68.el7.2 will be installed
-- > Processing Dependency: gssproxy >= 0.7.0-3 for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: rpcbind for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: quota for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: libnfsidmap for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: libevent for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: keyutils for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: libnfsidmap.so.0()(64bit) for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Processing Dependency: libevent-2.0.so.5()(64bit) for package: 1:nfs-utils-1.3.0-0.68.el7.2.x86_64
-- > Running transaction check
--- > Package gssproxy.x86_64 0:0.7.0-30.el7_9 will be installed
-- > Processing Dependency: libini_config >= 1.3.1-31 for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libverto-module-base for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libref_array.so.1(REF_ARRAY_0.1.1)(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libini_config.so.3(INI_CONFIG_1.2.0)(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libini_config.so.3(INI_CONFIG_1.1.0)(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libref_array.so.1()(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libini_config.so.3()(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libcollection.so.2()(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
-- > Processing Dependency: libbasicobjects.so.0()(64bit) for package: gssproxy-0.7.0-30.el7_9.x86_64
--- > Package keyutils.x86_64 0:1.5.8-3.el7 will be installed
--- > Package libevent.x86_64 0:2.0.21-4.el7 will be installed
--- > Package libnfsidmap.x86_64 0:0.25-19.el7 will be installed
--- > Package quota.x86_64 1:4.01-19.el7 will be installed
-- > Processing Dependency: quota-nls = 1:4.01-19.el7 for package: 1:quota-4.01-19.el7.x86_64
-- > Processing Dependency: tcp_wrappers for package: 1:quota-4.01-19.el7.x86_64
--- > Package rpcbind.x86_64 0:0.2.0-49.el7 will be installed
-- > Running transaction check
--- > Package libbasicobjects.x86_64 0:0.1.1-32.el7 will be installed
--- > Package libcollection.x86_64 0:0.7.0-32.el7 will be installed
--- > Package libini_config.x86_64 0:1.3.1-32.el7 will be installed
-- > Processing Dependency: libpath_utils.so.1(PATH_UTILS_0.2.1)(64bit) for package: libini_config-1.3.1-32.el7.x86_64
-- > Processing Dependency: libpath_utils.so.1()(64bit) for package: libini_config-1.3.1-32.el7.x86_64
--- > Package libref_array.x86_64 0:0.1.5-32.el7 will be installed
--- > Package libverto-libevent.x86_64 0:0.2.5-4.el7 will be installed
--- > Package quota-nls.noarch 1:4.01-19.el7 will be installed
--- > Package tcp_wrappers.x86_64 0:7.6-77.el7 will be installed
-- > Running transaction check
--- > Package libpath_utils.x86_64 0:0.2.1-32.el7 will be installed
-- > Finished Dependency Resolution
?
Dependencies Resolved
?
=============================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================
Installing:
nfs-utils x86_64 1:1.3.0-0.68.el7.2 updates 413 k
Installing for dependencies:
gssproxy x86_64 0.7.0-30.el7_9 updates 111 k
keyutils x86_64 1.5.8-3.el7 base 54 k
libbasicobjects x86_64 0.1.1-32.el7 base 26 k
libcollection x86_64 0.7.0-32.el7 base 42 k
libevent x86_64 2.0.21-4.el7 base 214 k
libini_config x86_64 1.3.1-32.el7 base 64 k
libnfsidmap x86_64 0.25-19.el7 base 50 k
libpath_utils x86_64 0.2.1-32.el7 base 28 k
libref_array x86_64 0.1.5-32.el7 base 27 k
libverto-libevent x86_64 0.2.5-4.el7 base 8.9 k
quota x86_64 1:4.01-19.el7 base 179 k
quota-nls noarch 1:4.01-19.el7 base 90 k
rpcbind x86_64 0.2.0-49.el7 base 60 k
tcp_wrappers x86_64 7.6-77.el7 base 78 k
?
Transaction Summary
=============================================================================================================================================================
Install 1 Package (+14 Dependent packages)
?
Total download size: 1.4 M
Installed size: 4.1 M
Downloading packages:
(1/15): keyutils-1.5.8-3.el7.x86_64.rpm | 54 kB 00:00:00
(2/15): libcollection-0.7.0-32.el7.x86_64.rpm | 42 kB 00:00:00
(3/15): gssproxy-0.7.0-30.el7_9.x86_64.rpm | 111 kB 00:00:00
(4/15): libevent-2.0.21-4.el7.x86_64.rpm | 214 kB 00:00:00
(5/15): libbasicobjects-0.1.1-32.el7.x86_64.rpm | 26 kB 00:00:00
(6/15): libini_config-1.3.1-32.el7.x86_64.rpm | 64 kB 00:00:00
(7/15): libnfsidmap-0.25-19.el7.x86_64.rpm | 50 kB 00:00:00
(8/15): libpath_utils-0.2.1-32.el7.x86_64.rpm | 28 kB 00:00:00
(9/15): libref_array-0.1.5-32.el7.x86_64.rpm | 27 kB 00:00:00
(10/15): libverto-libevent-0.2.5-4.el7.x86_64.rpm | 8.9 kB 00:00:00
(11/15): quota-nls-4.01-19.el7.noarch.rpm | 90 kB 00:00:00
(12/15): quota-4.01-19.el7.x86_64.rpm | 179 kB 00:00:00
(13/15): tcp_wrappers-7.6-77.el7.x86_64.rpm | 78 kB 00:00:00
(14/15): rpcbind-0.2.0-49.el7.x86_64.rpm | 60 kB 00:00:00
(15/15): nfs-utils-1.3.0-0.68.el7.2.x86_64.rpm | 413 kB 00:00:00
-------------------------------------------------------------------------------------------------------------------------------------------------------------
Total 1.5 MB/s | 1.4 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Warning: RPMDB altered outside of yum.
Installing : rpcbind-0.2.0-49.el7.x86_64 1/15
Installing : libbasicobjects-0.1.1-32.el7.x86_64 2/15
Installing : libref_array-0.1.5-32.el7.x86_64 3/15
Installing : libcollection-0.7.0-32.el7.x86_64 4/15
Installing : libevent-2.0.21-4.el7.x86_64 5/15
Installing : libverto-libevent-0.2.5-4.el7.x86_64 6/15
Installing : 1:quota-nls-4.01-19.el7.noarch 7/15
Installing : tcp_wrappers-7.6-77.el7.x86_64 8/15
Installing : 1:quota-4.01-19.el7.x86_64 9/15
Installing : keyutils-1.5.8-3.el7.x86_64 10/15
Installing : libnfsidmap-0.25-19.el7.x86_64 11/15
Installing : libpath_utils-0.2.1-32.el7.x86_64 12/15
Installing : libini_config-1.3.1-32.el7.x86_64 13/15
Installing : gssproxy-0.7.0-30.el7_9.x86_64 14/15
Installing : 1:nfs-utils-1.3.0-0.68.el7.2.x86_64 15/15
Verifying : gssproxy-0.7.0-30.el7_9.x86_64 1/15
Verifying : 1:quota-4.01-19.el7.x86_64 2/15
Verifying : libpath_utils-0.2.1-32.el7.x86_64 3/15
Verifying : libnfsidmap-0.25-19.el7.x86_64 4/15
Verifying : libevent-2.0.21-4.el7.x86_64 5/15
Verifying : keyutils-1.5.8-3.el7.x86_64 6/15
Verifying : libverto-libevent-0.2.5-4.el7.x86_64 7/15
Verifying : tcp_wrappers-7.6-77.el7.x86_64 8/15
Verifying : libcollection-0.7.0-32.el7.x86_64 9/15
Verifying : 1:quota-nls-4.01-19.el7.noarch 10/15
Verifying : libref_array-0.1.5-32.el7.x86_64 11/15
Verifying : libbasicobjects-0.1.1-32.el7.x86_64 12/15
Verifying : 1:nfs-utils-1.3.0-0.68.el7.2.x86_64 13/15
Verifying : libini_config-1.3.1-32.el7.x86_64 14/15
Verifying : rpcbind-0.2.0-49.el7.x86_64 15/15
?
Installed:
nfs-utils.x86_64 1:1.3.0-0.68.el7.2
?
Dependency Installed:
gssproxy.x86_64 0:0.7.0-30.el7_9 keyutils.x86_64 0:1.5.8-3.el7 libbasicobjects.x86_64 0:0.1.1-32.el7 libcollection.x86_64 0:0.7.0-32.el7
libevent.x86_64 0:2.0.21-4.el7 libini_config.x86_64 0:1.3.1-32.el7 libnfsidmap.x86_64 0:0.25-19.el7 libpath_utils.x86_64 0:0.2.1-32.el7
libref_array.x86_64 0:0.1.5-32.el7 libverto-libevent.x86_64 0:0.2.5-4.el7 quota.x86_64 1:4.01-19.el7 quota-nls.noarch 1:4.01-19.el7
rpcbind.x86_64 0:0.2.0-49.el7 tcp_wrappers.x86_64 0:7.6-77.el7
?
Complete!
[root@ecs-c687-ecrs work]# yum install -y rpcbind
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Package rpcbind-0.2.0-49.el7.x86_64 already installed and latest version
Nothing to do
[root@ecs-c687-ecrs work]#
2.2 設置節(jié)點
(1)設置節(jié)點名稱
hostnamectl set-hostname nfs
(2)服務端安裝NFS
yum -y install nfs-utils rpcbind
2.3 服務端配置
在NFS服務端上創(chuàng)建共享目錄/data/nfs并設置權(quán)限
mkdir -p /data/nfs
chmod 666 /data/nfs
2.4 編輯export文件
vim /etc/exports
?
/data/nfs *(rw,no_root_squash,no_all_squash,sync)
?
其中的/data/nfs 就是NFS服務器需要共享出去的目錄。 *號表示所有IP地址都可以訪問。
參數(shù)介紹:
rw 讀寫權(quán)限
no_root_squash 客戶端使用 root 身份來操作服務器的文件系統(tǒng)
sync 代表數(shù)據(jù)會同步寫入到內(nèi)存與硬盤中
(1)配置生效
exportfs -r
(2)啟動rpcbind、nfs服務
systemctl enable rpcbind && systemctl start rpcbind
systemctl enable nfs && systemctl start nfs
(3)查看 RPC 服務的注冊狀況
rpcinfo -p localhost
?
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 39748 status
100024 1 tcp 41475 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 46720 nlockmgr
100021 3 udp 46720 nlockmgr
100021 4 udp 46720 nlockmgr
100021 1 tcp 33605 nlockmgr
100021 3 tcp 33605 nlockmgr
100021 4 tcp 33605 nlockmgr
(4)showmount令來查閱是否可以聯(lián)機
showmount -e localhost
選項與參數(shù):
-a :顯示目前主機與客戶端的 NFS 聯(lián)機分享的狀態(tài);
-e :顯示某部主機的 /etc/exports 所分享的目錄數(shù)據(jù)。
2.5 客戶端配置
(1)安裝nfs-utils客戶端 ---一般系統(tǒng)都自帶了,不用安裝。
yum -y install nfs-utils
(2)創(chuàng)建掛載目錄---就是用來掛載NFS服務器的共享目錄
mkdir /home/work
(3)查看服務器拋出的共享目錄信息
showmount -e < NFS服務器IP地址 >
(4)掛載服務器共享目錄
mount -t nfs < NFS服務器IP地址 >:< NFS服務器路徑 > < 掛載到本地的路徑 >
(5)查看掛載結(jié)果
df -h
(6)卸載已掛在的NFS
umount < 掛載到本地的路徑 >
3. 安裝ffmpeg
3.1 安裝yasm
wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz #下載源碼包
tar zxvf yasm-1.3.0.tar.gz #解壓
cd yasm-1.3.0 #進入目錄
./configure #配置
make && make install #編譯安裝
3.2 在線安裝ffmpeg
(1)設置下載源
CentOS沒有官方FFmpeg軟件包,可以使用第三方Y(jié)UM源(Nux Dextop)下載,就是版本較低,ffmpeg 2.8。
(1) yum -y install epel-release
(2) yum update -y
(3) rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
(4)
[CentOS 7]
rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm
[CentOS 6]
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el6/x86_64/nux-dextop-release-0-2.el6.nux.noarch.rpm
(2)安裝FFmpeg 和 FFmpeg開發(fā)包
sudo yum install ffmpeg ffmpeg-devel -y
(3)測試ffmpeg是否安裝OK
ffmpeg -version
查看版本:
[root@nfs ecrs_web_lib_centos]# ffmpeg -version
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-36)
configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --extra-ldflags='-Wl,-z,relro ' --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libvo-amrwbenc --enable-version3 --enable-bzlib --disable-crystalhd --enable-gnutls --enable-ladspa --enable-libass --enable-libcdio --enable-libdc1394 --enable-libfdk-aac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libvorbis --enable-libv4l2 --enable-libx264 --enable-libx265 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --shlibdir=/usr/lib64 --enable-runtime-cpudetect
libavutil 54. 31.100 / 54. 31.100
libavcodec 56. 60.100 / 56. 60.100
libavformat 56. 40.101 / 56. 40.101
libavdevice 56. 4.100 / 56. 4.100
libavfilter 5. 40.101 / 5. 40.101
libavresample 2. 1. 0 / 2. 1. 0
libswscale 3. 1.101 / 3. 1.101
libswresample 1. 2.101 / 1. 2.101
libpostproc 53. 3.100 / 53. 3.100
[root@nfs ecrs_web_lib_centos]#
3.3 從源碼編譯ffmpeg
(1)編譯X264
[root@ecs-c687-ecrs work_pc]# tar xvf last_x264.tar.bz2
./configure
make
make install
(2)編譯ffmpeg
./configure --enable-shared --target-os=linux --enable-gpl --enable-ffmpeg --enable-libx264
3.4 如果有多個ffmpeg版本存在怎么辦?
如果系統(tǒng)里有多個ffmpeg存在,那么在命令行執(zhí)行ffmpeg肯定是不知道當前這個命令是不是自己想要的。
如果是編譯ffmpeg源碼得到ffmpeg相關文件,那么在執(zhí)行./configure
時,加一個選項,設置一下安裝路徑--prefix=$PWD/_install
。這樣執(zhí)行make install
時,安裝的文件會拷貝到當前目錄下的_install
目錄里。
然后再通過ln建立一個鏈接文件到/usr/local/bin/
目錄下。
ln -s /home/wbyq/ffmpe4.2.2/_install/bin/ffmpeg /usr/local/bin/ffmpeg422
然后將/home/wbyq/ffmpe4.2.2/_install/lib
目錄加到系統(tǒng)庫搜索的環(huán)境變量里。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wbyq/ffmpe4.2.2/_install/lib
如果覺得設置環(huán)境變量麻煩,以后也不常修改這些庫,那么可以將ffmpeg的全部.so庫拷貝到/usr/lib目錄下去。
cp /home/wbyq/ffmpe4.2.2/_install/lib/* /usr/lib -dfv
說明:拷貝動態(tài)庫最好都加上-d參數(shù),保留庫之間的鏈接屬性。
拷貝之后再執(zhí)行ldconfig
命令生效,也就是刷新緩存文件,讓系統(tǒng)知道你更改了/usr/lib目錄。
4. 編譯zlib
4.1 編譯zlib
wget http://www.zlib.net/zlib-1.2.12.tar.gz #下載zlib
tar zxvf zlib-1.2.12.tar.gz #解壓
cd zlib-1.2.12 #進入目錄
./configure #配置
make && make install #編譯安裝
4.2 安裝g++編譯器
如果需要編譯C++代碼,需提前安裝g++編譯器,默認只有gcc編譯器。
yum -y install gcc-c++
4.3 編譯quazip
wget https://udomain.dl.sourceforge.net/project/quazip/quazip/0.7.3/quazip-0.7.3.zip #下載quazip
unzip quazip-0.7.3.zip #解壓
cd quazip-0.7.3 #進入目錄
qmake #生成Makefile
make #編譯
說明: quazip是Qt的工程,需要使用qmake進行編譯。
如果是桌面版Linux那就很簡單的,直接在Qt官網(wǎng)上下載xxx.run安裝包,在命令行運行就可以安裝。
那如果在Linux服務器上如何安裝Qt的編譯環(huán)境?因為可能有這么個需求,需要在Linux服務器命令行上編譯Qt代碼。 這種情況下就需要搭建一個Qt編譯環(huán)境。
解決辦法: 將桌面版上安裝好的Qt目錄下,對應的編譯器套件目錄打包拷貝到Linux服務器上解碼即可使用。
比如:我在ubuntu18.04上安裝了Qt5.12.6,我的安裝目錄:/home/wbyq/Qt5.12.6
, 那么將/home/wbyq/Qt5.12.6/5.12.6/gcc_64/
目錄打包即可。
下面是/home/wbyq/Qt5.12.6/5.12.6/gcc_64/
目錄下的文件。
wbyq@wbyq:~/work$ ls /home/wbyq/Qt5.12.6/5.12.6/gcc_64/
bin doc include lib mkspecs phrasebooks plugins qml translations
打包壓縮的命令:
tar czvf gcc_64.tar.gz /home/wbyq/Qt5.12.6/5.12.6/gcc_64
打包之后生成的文件: gcc_64.tar.gz
,拷貝到Linux服務器上解壓,然后將bin目錄下的qmake
文件建立一個軟鏈接文件到/usr/local/bin/
目錄下。
ln -s /home/work/gcc_64/bin/qmake /usr/local/bin/qmake
前面的目錄/home/work/gcc_64/bin/qmake
是我在服務器上解壓的路徑。
然后就可以在Qt的工程目錄下使用qmake生成Makefile文件,然后執(zhí)行make即可編譯Qt程序了。
如果編譯好的Qt程序無法正常的運行,缺少庫,需要告訴系統(tǒng)你的Qt動態(tài)庫在哪里。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/work/gcc_64/lib
這行命令在當前命令行執(zhí)行只是當前終端進程有效,如果想要全局生效,將這行代碼加到/etc/profile文件最后,然后執(zhí)行reoot
命令重啟系統(tǒng)即可。
5. Centos中安裝帶rtmp模塊的Nginx
5.1 新安裝的系統(tǒng)可以先安裝一些工具
yum install -y pcre pcre-devel openssl openssl-devel zlib zlib-devel gcc gcc-c++
yum install -y vim wget lsof git zip unzip
5.2 獲取Nginx二進制源碼
聽說srtmp模塊暫時只支持Nginx13-15版本,當前就在官網(wǎng)下載Nginx14
wget http://nginx.org/download/nginx-1.14.2.tar.gz
tar xvf nginx-1.14.2.tar.gz
5.2 獲取nginx-rtmp-module
wget https://github.com/arut/nginx-rtmp-module/archive/refs/tags/v1.2.1.tar.gz
tar xvf v1.2.1.tar.gz
5.3 編譯nginx
cd nginx-1.14.2
./configure --add-module=../nginx-rtmp-module-1.2.1/ --with-http_ssl_module
make && make install
#建立軟鏈接
ln -s /usr/local/nginx/sbin/nginx /usr/bin
特別說明:
如果在配置時報錯,一般就是缺東西了,安裝了再配置。
比如:報錯 ./configure: error: the HTTP rewrite module requires the PCRE library. You can either disable the mo ....
解決:
yum -y install pcre-devel
yum -y install openssl openssl-devel
5.4 修改Nginx的配置文件
打開/usr/local/nginx/conf/nginx.conf文件,在文件最后面加入下面的配置。
rtmp {
server {
listen 8888;
application live {
live on;
}
}
}
上面8888是rtmp推流和拉流的端口。
修改nginx.conf之后,重啟nginx服務:
sudo service nginx restart
重啟服務之后,使用netstat -ltn命令查看TCP監(jiān)聽的端口,確認下Nginx的監(jiān)聽端口是否正常。
正常情況,一個是我們自己設置的rtmp服務監(jiān)聽端口8888,還有一個80是Nginx默認的HTTP服務監(jiān)聽端口。
接下來可以在瀏覽器里輸入本機IP地址:http://127.0.0.1/,查看Nginx服務開啟狀態(tài)。
5.5 設置開機啟動
wget http://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx -O /etc/init.d/nginx
chmod +x /etc/init.d/nginx
update-rc.d nginx defaults
5.6 控制nginx服務的3個命令: 啟動、停止、重啟
service nginx start
service nginx stop
service nginx restart 或者 nginx -s reload (運行中生效配置文件)
5.7 進行rtmp推流
服務器搭建好之后,推流和拉流的地址就是: rtmp://< 服務器IP地址 >:8888/live/< 推流存放的目錄 >
例如: rtmp://127.0.0.1:8888/live/xl
5.8 nginx保存推流視頻文件
如果需要讓推流上來的文件保存下來后續(xù)進行查看歷史文件,可以配置nginx進行保存。
在原來的/usr/local/nginx/conf/nginx.conf
配置文件里rtmp模塊中增加新的配置:
record all;
record_unique on;
record_path "./video"; #視頻緩存的路徑
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
完整/usr/local/nginx/conf/nginx.conf
里的rtmp模塊的配置如下:
#RTMP服務
rtmp {
server {
listen 8888;
application live {
live on; #開啟實時
record all;
record_unique on;
record_path "./video"; #視頻緩存的路徑
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
}
}
}
配置之后執(zhí)行命令nginx -s reload
重啟服務器即可。
5.9 rtmp直播流轉(zhuǎn)為hls直播流
什么是HLS直播流?
HLS 全稱是 HTTP Live Streaming,是一個由 Apple 公司提出的基于 HTTP 的媒體流傳輸協(xié)議,用于實時音視頻流的傳輸。目前HLS協(xié)議被廣泛的應用于視頻點播和直播領域。
原理介紹
HLS 跟 DASH 協(xié)議的原理非常類似。通過將整條流切割成一個小的可以通過 HTTP 下載的媒體文件,然后提供一個配套的媒體列表文件,提供給客戶端,讓客戶端順序地拉取這些媒體文件播放,來實現(xiàn)看上去是在播放一條流的效果。由于傳輸層協(xié)議只需要標準的 HTTP 協(xié)議,HLS 可以方便的透過防火墻或者代理服務器,而且可以很方便的利用 CDN 進行分發(fā)加速,并且客戶端實現(xiàn)起來也很方便。
HLS 把整個流分成一個個小的基于 HTTP 的文件來下載,每次只下載一些。HLS 協(xié)議由三部分組成:HTTP、M3U8、TS。這三部分中,HTTP 是傳輸協(xié)議,M3U8 是索引文件,TS 是音視頻的媒體信息。
HLS協(xié)議編碼格式要求:
視頻的編碼格式:H264
音頻的編碼格式:AAC、MP3、AC-3
視頻的封裝格式:ts
保存 ts 索引的 m3u8 文件
配置/usr/local/nginx/conf/nginx.conf
將RTMP流轉(zhuǎn)為HLS流。
在http
模塊的server
配置里增加新的配置:
location /live_hls{
types {
#m3u8 type設置
application/vnd.apple.mpegurl m3u8;
#ts分片文件設置
video/mp2t ts;
}
#指向訪問m3u8文件目錄
alias ./m3u8File; #和rtmp模塊里的hls_path設置路徑一樣
add_header Cache-Control no-cache; #禁止緩存
}
在rtmp
模塊的server
配置里增加新的配置:
hls on; #開啟hls
hls_path ./m3u8File; #hls的ts切片存放路徑 (這是個目錄,會自動創(chuàng)建的)
hls_fragment 2s; #本地切片長度
hls_playlist_length 6s;#HLS播放列表長度
/usr/local/nginx/conf/nginx.conf文件的完整的配置如下:
worker_processes 1; #Nginx進程數(shù),建議設置為等于CPU總核數(shù)
events {
worker_connections 1024; #工作模式與連接數(shù)上限
}
rtmp_auto_push on;
#RTMP服務
rtmp {
server {
listen 8888;
application live {
live on; #開啟實時
record all;
record_unique on;
record_path "./video"; #視頻緩存的路徑
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
hls on; #開啟hls
hls_path ./m3u8File; #hls的ts切片存放路徑
hls_fragment 2s; #本地切片長度
hls_playlist_length 6s;#HLS播放列表長度
}
}
}
#HTTP服務
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8099;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type設置
application/vnd.apple.mpegurl m3u8;
#ts分片文件設置
video/mp2t ts;
}
#指向訪問m3u8文件目錄
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止緩存
}
location /control{
rtmp_control all;
}
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
配置之后重啟服務器即可。
按照前面的配置,RTMP推流地址和HTTP訪問地址如下:
RTMP推流和拉流地址: rtmp://127.0.0.1:8888/live/video01
那么對應的HTTP的訪問地址:http://127.0.0.1:8099/live_hls/video01.m3u8
說明: 轉(zhuǎn)為HLS流之后,如果瀏覽器支持HLS流就可以直接輸入地址播放。一般手機瀏覽器都支持的。比如:蘋果手機的自帶瀏覽器,QQ瀏覽器等瀏覽器都支持直接播放HLS流。PC機的谷歌瀏覽器默認是不支持的。
5.10 NGINX配置HTTP文件服務器
在5.8小節(jié)里介紹了如何配置NGINX保留RTMP推流的視頻文件,如果想做一個直播回放,歷史記錄查看的播放器,那么就可以將rtmp視頻緩存的目錄作為HTTP文件服務器訪問的根目錄,通過訪問這個根目錄獲取目錄下文件的索引,得到視頻文件的訪問地址就可以直接進行播放,就能做一個視頻回放播放器。
在http
模塊里新增加一個server
配置,并填入新的配置,詳細內(nèi)容如下:
server {
listen 8090;
server_name localhost;
location / {
root ./video; #指定哪個目錄作為Http文件服務器的根目錄,如果你這里寫了file就是你的根目錄,那么訪問的時候file就不會出現(xiàn)在目錄中
autoindex on; #設置允許列出整個目錄
autoindex_exact_size off; #默認為on,顯示出文件的確切大小,單位是bytes。改為off后,顯示出文件的大概大小,單位是kB或者MB或者GB
autoindex_localtime on; #默認為off,顯示的文件時間為GMT時間。改為on后,顯示的文件時間為文件的服務器時間
charset utf-8; #防止文件亂碼顯示, 如果用utf-8還是亂碼,就改成gbk試試
}
}
特別說明: nginx是支持配置多個server
配置,監(jiān)聽不同的端口,可以給文件服務器單獨設置一個監(jiān)聽端口,專門作為文件遍歷使用。
/usr/local/nginx/conf/nginx.conf文件的完整的配置如下:
worker_processes 1; #Nginx進程數(shù),建議設置為等于CPU總核數(shù)
events {
worker_connections 1024; #工作模式與連接數(shù)上限
}
rtmp_auto_push on;
#RTMP服務
rtmp {
server {
listen 8888;
application live {
live on; #開啟實時
record all;
record_unique on;
record_path "./video"; #視頻緩存的路徑
record_suffix -%Y-%m-%d-%H_%M_%S.flv;
hls on; #開啟hls
hls_path ./m3u8File; #hls的ts切片存放路徑
hls_fragment 2s; #本地切片長度
hls_playlist_length 6s;#HLS播放列表長度
}
}
}
#HTTP服務
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8090;
server_name localhost;
location / {
root ./video; #指定哪個目錄作為Http文件服務器的根目錄,如果你這里寫了file就是你的根目錄,那么訪問的時候file就不會出現(xiàn)在目錄中
autoindex on; #設置允許列出整個目錄
autoindex_exact_size off; #默認為on,顯示出文件的確切大小,單位是bytes。改為off后,顯示出文件的大概大小,單位是kB或者MB或者GB
autoindex_localtime on; #默認為off,顯示的文件時間為GMT時間。改為on后,顯示的文件時間為文件的服務器時間
charset utf-8; #防止文件亂碼顯示, 如果用utf-8還是亂碼,就改成gbk試試
}
}
server {
listen 8099;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location /live_hls{
types{
#m3u8 type設置
application/vnd.apple.mpegurl m3u8;
#ts分片文件設置
video/mp2t ts;
}
#指向訪問m3u8文件目錄
alias ./m3u8File;
add_header Cache-Control no-cache; #禁止緩存
}
location /control{
rtmp_control all;
}
location /stat{
rtmp_stat all;
rtmp_stat_stylesheet stat.xsl;
}
location /stat.xsl{
root ./nginx-rtmp-module-master;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
訪問文件測試:http://127.0.0.1:8090
6. Linux下開機啟動的執(zhí)行流程
6.1 開機執(zhí)行腳本順序
第一步:init /etc/inittab
第二步:啟動相應的腳本,并且打開終端
rc.sysinit
rc.d(里面的腳本)
rc.local
第三步:啟動login登錄界面 login
第四步:在用戶登錄的時候執(zhí)行sh腳本的順序,每次登錄的時候都會完全執(zhí)行的
/etc/profile.d/file
/etc/profile
/etc/bashrc
/root/.bashrc
/root/.bash_profile
6.2 Linux中修改環(huán)境變量及生效方法
修改/etc/profile 或者 /etc/bashrc 可以讓環(huán)境變量全部用戶全局生效(需要重啟系統(tǒng))。 修改~/.bash_profile 或~/.bashrc對當前用戶全局有效(需要重啟系統(tǒng))。
如果需要立即生效,修改完之后用source命令執(zhí)行,如: source .bash_profile
6.3 rcX.d的啟動級別
一般有開機自啟動的需求時,一般會在/etc/rc.local
文件中寫命令行或腳本執(zhí)行命令的方式來實現(xiàn)。也可以在/etc/profile文件里實現(xiàn)(不建議)。
現(xiàn)在很多Linux發(fā)行版,默認是沒有/etc/rc.local這個文件或者沒有去執(zhí)行,而使用的是/etc/rcX.d。
rcX.d并不是指這個目錄或者文件就是叫rcX.d,這其中的X對應是0~6這7個數(shù)字,不同的數(shù)字對應著不同的級別
查看當前系統(tǒng)/etc/rcX.d
目錄:
[root@ecs-c687-ecrs work]# ls /etc/ | grep rc
bashrc
csh.cshrc
inputrc
mail.rc
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rc.d
rc.local
vimrc
virc
wgetrc
通過runlevel
命令查看當前系統(tǒng)的啟動級別:
啟動級別(X所代表的數(shù)字) | 啟動級別所代表的含義 |
---|---|
0 | 停機(不能使用) |
1 | 單用戶模式 |
2 | 多用戶模式,但不能使用NFS等 |
3 | 完整的多用戶模式 |
4 | 系統(tǒng)保留(未使用) |
5 | 圖形化界面模式 |
6 | 重啟模式(不能使用) |
我當前使用的是CentOS7.4服務器版本,啟動級別如下:
[root@ecs-c687-ecrs ]# runlevel
N 3
查看/etc/rc3.d/
目錄下文件的詳細信息:
[root@ecs-c687-ecrs ~]# ls /etc/rc3.d/ -l
total 0
lrwxrwxrwx. 1 root root 20 Feb 14 2022 K50netconsole - > ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Feb 14 2022 K90network - > ../init.d/network
lrwxrwxrwx 1 root root 19 Sep 15 22:07 S12hostguard - > ../init.d/hostguard
lrwxrwxrwx 1 root root 24 Feb 14 2022 S50multi-queue-hw - > ../init.d/multi-queue-hw
可以看到該目錄下的文件都是鏈接文件,而且都是指向/etc/init.d中的shell腳本或者其他可執(zhí)行文件,它們的命名方式基本都是以S
或者K
開頭,其后緊跟一個數(shù)字,數(shù)字后則是鏈接文件的名字,這個名字可以自行定義。
命名規(guī)則解釋如下:
以K90network為例:
K表示stop,S表示start。(表示需要傳入?yún)?shù)),也就是說開機自啟動命令會向腳本傳入start或者stop,在腳本里可以收到參數(shù)$1進行一些判斷,完成一些不同情況下的邏輯處理。比如:開機執(zhí)行什么代碼,關機執(zhí)行什么代碼。
90 表示腳本執(zhí)行等級。(通常越小越優(yōu)先)
network與/etc/init.d下的腳本文件名稱保持一致。
6.4 利用rcX.d實現(xiàn)開機自動執(zhí)行腳本
比如:需求是開機之后創(chuàng)建一個文件,并向文件里存放一些數(shù)據(jù)。
(1)先在/etc/init.d目錄下創(chuàng)建一個up_demo.sh腳本,編寫腳本代碼:
#!/bin/bash
echo $0 $1 > > /home/up_test.txt
修改腳本權(quán)限:
[root@ecs-c687-ecrs init.d]# chmod 777 /etc/init.d/up_demo.sh
[root@ecs-c687-ecrs init.d]# ls up_demo.sh -l
-rwxrwxrwx 1 root root 76 Sep 16 14:13 up_demo.sh
(2) 在/etc/rc3.d目錄里,創(chuàng)建軟連接。 (因為我的系統(tǒng)啟動級別為3)
[root@ecs-c687-ecrs rc3.d]# ln -s /etc/init.d/up_demo.sh S10up_demo
[root@ecs-c687-ecrs rc3.d]# ls -l
total 0
lrwxrwxrwx. 1 root root 20 Feb 14 2022 K50netconsole - > ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Feb 14 2022 K90network - > ../init.d/network
lrwxrwxrwx 1 root root 22 Sep 16 14:17 S10up_demo - > /etc/init.d/up_demo.sh
lrwxrwxrwx 1 root root 19 Sep 15 22:07 S12hostguard - > ../init.d/hostguard
lrwxrwxrwx 1 root root 24 Feb 14 2022 S50multi-queue-hw - > ../init.d/multi-queue-hw
(3)重啟系統(tǒng),進入到/home目錄下查看文件內(nèi)容,可以看到開機啟動成功,內(nèi)容已經(jīng)寫到up_test.txt
文件里了。
Welcome to Huawei Cloud Service
[root@ecs-c687-ecrs ~]# cd /home/
[root@ecs-c687-ecrs home]# ls
lib_run.sh up_test.txt video work work_pc work.tar.gz
[root@ecs-c687-ecrs home]# cat up_test.txt
/etc/rc.d/init.d/up_demo.sh start
[root@ecs-c687-ecrs home]#
審核編輯:湯梓紅
-
Linux
+關注
關注
87文章
11292瀏覽量
209318 -
服務器
+關注
關注
12文章
9123瀏覽量
85322 -
Qt
+關注
關注
1文章
302瀏覽量
37898 -
NFS
+關注
關注
1文章
53瀏覽量
26098 -
nginx
+關注
關注
0文章
149瀏覽量
12170
發(fā)布評論請先 登錄
相關推薦
評論