nginx移植記錄

fulinux發表於2017-05-23

只是記錄而已,防止日後忘記。

由於最新版本的nginx要求比較新的automake版本,但是我們老大是保守型別的,系統版本很老了 然後有些東西不方便升級,以免造成不必要的麻煩,因此需要用比較老版本的nginx來實現。下面參考這幾個連結中提供的內容:

http://blog.csdn.net/crazyman2010/article/details/18266487

http://blog.csdn.net/u011641885/article/details/49863723

http://blog.csdn.net/fish43237/article/details/40515897

我這裡下載了他修改後的nginx-1.5..8_arm庫,斌修改了nginx-1.5.8_arm/auto/types/sizeof 檔案,因為現在大部分linux都是i686 64位的系統了,通過講$CC修改為系統的gcc那還是不能獲取正確的size。所以這裡就直接修改了

ngx_size=4

cat << END > $NGX_AUTOTEST.c

#include <sys/types.h>
#include <sys/time.h>
$NGX_INCLUDE_UNISTD_H
#include <signal.h>
#include <stdio.h>
#include <sys/resource.h>
$NGX_INCLUDE_INTTYPES_H
$NGX_INCLUDE_AUTO_CONFIG_H

int main() {
    printf("%d", (int) sizeof($ngx_type));
    return 0;
}

END


ngx_test="gcc $CC_TEST_FLAGS $CC_AUX_FLAGS \
          -o $NGX_AUTOTEST $NGX_AUTOTEST.c $NGX_LD_OPT $ngx_feature_libs"

eval "$ngx_test >> $NGX_AUTOCONF_ERR 2>&1"


if [ -x $NGX_AUTOTEST ]; then
    ngx_size=4
    echo " $ngx_size bytes"
fi

下面我貼出我的my_configure_arm.sh檔案的內容:

#!/bin/sh
BUILD_PATH=$PWD/arm-build
CC_PATH=arm-linux-gcc
CPP_PATH=arm-linux-g++
./configure \
  --prefix=$PWD/install \
  --user=root \
  --group=root \
  --builddir=$BUILD_PATH \
  --with-pcre \
  --with-pcre=../pcre-8.20 \
  --with-pcre-jit \
  --with-http_flv_module \
  --with-http_mp4_module \
  --add-module=../nginx-rtmp-module \
  --with-cc=$CC_PATH  \
  --with-cpp=$CPP_PATH

其中builddir目錄不能是build目錄,不然make的時候會出現make:沒有什麼可以做的為`default',我看了Makefile檔案裡面有build偽指令。新增的nginx-rtmp-module工程是最新的,在master分支,還新增了flv和MP4的module。


然後make install 後會安裝到當前的install目錄,主要是我沒有根使用者的許可權,所以nginx所使用的nginx.conf配置檔案的路徑,要保持和你安裝時候的路徑一致。


問題:

# ./nginx
nginx: [emerg] getpwnam("root") failed (2: No such file or directory)

這個問題查閱網上的解決方法沒有用,通過strace命令來跟蹤程式執行時的系統呼叫和所接收的訊號,得到如下資訊:

open("/etc/nsswitch.conf", O_RDONLY)    = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=4163, ...}) = 0
mmap2(NULL, 4163, PROT_READ, MAP_PRIVATE, 4, 0) = 0x2ab4d000
close(4)                                = 0
open("/lib/libnss_compat.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libnss_compat.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0x2ab4d000, 4163)                = 0
open("/etc/ld.so.cache", O_RDONLY)      = 4
fstat64(4, {st_mode=S_IFREG|0644, st_size=4163, ...}) = 0
mmap2(NULL, 4163, PROT_READ, MAP_PRIVATE, 4, 0) = 0x2aba4000
close(4)                                = 0
open("/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
munmap(0x2aba4000, 4163)                = 0
write(3, "1970/01/04 08:41:42 [emerg] 8091"..., 91) = 91
write(2, "nginx: [emerg] getpwnam(\"root\") "..., 70nginx: [emerg] getpwnam("root") failed (2: No such fi)
) = 70
exit_group(1)                           = ?


發現缺少libnss_*相關的庫檔案,講缺少的庫補上後,nginx可以正常執行了。


修改配置檔案/home/fulinux/nginx-src/nginx-1.5.8_arm/install/conf/nginx.conf,最後加上:

rtmp {
    server {
        listen 1935;
        application live {
            live on;
            record off;
        }
    }
}

./nginx -s reload

通過如下命令向rtmp服務傳送視訊流:

# gst-launch -e v4l2src do-timestamp=true ! 'video/x-raw-yuv, format=(fourcc)I42
0, width=(int)640, height=(int)480, interlaced=(boolean)false, framerate=(fracti
on)15/1' ! vpuenc codec=6 bitrate=458752 seqheader-method=3 ! flvmux streamable=
true name=mux alsasrc device=plughw:1,0 blocksize=22050 ! audioconvert ! faac bi
trate=65536 ! mux. mux. ! rtmpsink location="rtmp://localhost:1935/live/video"

會有如下提示:

# ./nginx
# gst-launch -e v4l2src do-timestamp=true ! 'video/x-raw-yuv, format=(fourcc)I42
0, width=(int)640, height=(int)480, interlaced=(boolean)false, framerate=(fracti
on)15/1' ! vpuenc codec=6 bitrate=458752 seqheader-method=3 ! flvmux streamable=
true name=mux alsasrc device=plughw:1,0 blocksize=22050 ! audioconvert ! faac bi
trate=65536 ! mux. mux. ! rtmpsink location="rtmp://localhost:1935/live/video"
Setting pipeline to PAUSED ...
[INFO]  Product Info: i.MX6Q/D/S
vpuenc versions :)
        plugin: 3.0.7
        wrapper: 1.0.35(VPUWRAPPER_ARM_LINUX Build on May 18 2017 16:22:43)
        vpulib: 5.4.12
        firmware: 2.3.10.40778
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstAudioSrcClock
[INFO]  chromaInterleave 0, mapType 0, linear2TiledEnable 0
WARNING: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Can't record audio fast enough
Additional debug info:
gstbaseaudiosrc.c(840): gst_base_audio_src_create (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:
Dropped 64386 samples. This is most likely because downstream can't keep up and is consuming samples too .
WARNING: from element /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0: Can't record audio fast enough
Additional debug info:
gstbaseaudiosrc.c(840): gst_base_audio_src_create (): /GstPipeline:pipeline0/GstAlsaSrc:alsasrc0:
Dropped 11907 samples. This is most likely because downstream can't keep up and is consuming samp


不過這個提示在我的平臺上暫且忽略,然後在PC上可以通過如下方法播放:

ffplay rtmp://192.168.0.51:1935/live/video

相關文章