# httpd 2.4.39
# apr 1.7.0
# apr-util 1.6.1
# httpd 빌드시 --with-apr=${HOME}/apr 로 옵션사용
# 빌드 후 httpd 실행시 특정 서버에서 다음과 같은 에러가 발생한다.
[:crit] [pid 478] (38)Function not implemented: AH00141: Could not initialize random number generator
# 잘되는 서버(A)
# 에러 발생하는 서버(B)
# 확인 1
# apr 문제로 보고 잘되는 서버와 libapr-1.so 가 사용하는 shared library 를 살펴봤다.
# libuuid.so 사용 여부가 다르긴 하다.
# B 서버에서는 make 에서 -luuid 가 추가된다.
# A 서버
ldd libapr-1.so
linux-vdso.so.1 => (0x00007fff695fc000)
librt.so.1 => /lib64/librt.so.1 (0x00007ff7836ee000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007ff7834b6000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff78329a000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ff783096000)
libc.so.6 => /lib64/libc.so.6 (0x00007ff782cd2000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007ff782acf000)
/lib64/ld-linux-x86-64.so.2 (0x00005560922d1000
# B 서버
ldd libapr-1.so
linux-vdso.so.1 => (0x00007ffcd53f8000)
libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f8dc4c56000)
librt.so.1 => /lib64/librt.so.1 (0x00007f8dc4a4d000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f8dc4816000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f8dc45fa000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f8dc43f5000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8dc4032000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8dc50a6000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f8dc3e2f000)
# 확인 2
# A -> B 로 libapr-1.so.0.7.0(libapr-1.so 가 링크)를 복사했지만 에러가 발생한다.
# B -> A 로 libapr-1.so.0.7.0(libapr-1.so 가 링크)를 복사했지만 실행된다.
# 그래서 apr 빌드의 문제는 아니다.
# 확인 3
# libapr 에 포함된 함수중에 random 관련 함수가 실행될 수 없는 문제인것 같다.
nm libapr-1.so | grep random
42:000000000023aed0 b all_random
218:0000000000023d90 T apr_generate_random_bytes
442:000000000002a460 T apr_random_add_entropy
443:000000000002a370 T apr_random_after_fork
444:000000000002a750 T apr_random_barrier
445:000000000002a0c0 t apr_random_bytes
446:000000000002a210 T apr_random_init
447:000000000002a730 T apr_random_insecure_bytes
448:000000000002a780 T apr_random_insecure_ready
449:000000000002a710 T apr_random_secure_bytes
450:000000000002a760 T apr_random_secure_ready
451:000000000002a400 T apr_random_standard_new
912:000000000002a070 t random_cleanup
# 확인 4
# apr v1.7.0 설치 디렉토리의 lib 를 잠깐 lib2 로 변경해 놓으면 실행된다.
# httpd 빌드시 사용된 라이브러리 및 옵션을 확인해봤다.
# 실제 서버에서 로딩하는 APR 버전이 빌드시 사용된 APR 버전보다 낮은
# centos 기본 내장된 /usr/lib64/libapr-1.so.0.4.8 을 사용하는것으로 보인다.
./httpd -V
Server version: Apache/2.4.39 (Unix)
Server built: Jul 16 2019 18:31:52
Server's Module Magic Number: 20120211:84
Server loaded: APR 1.4.8, APR-UTIL 1.6.1
Compiled using: APR 1.7.0, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_PROC_PTHREAD_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=256
-D HTTPD_ROOT="/home/ysoftman/apache-2.4.39"
-D SUEXEC_BIN="/home/ysoftman/apache-2.4.39/bin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"
# 결론
# 구글링 해보면 환경변수 PATH 에 깨진 문자가 포함되었거나
# 커널에서 제공하는 랜럼 디바이스 파일 /dev/random, /dev/urandom 이 없는 경우
# 라고하는데 두 경우 특별한 문제점을 찾을 수 없었다.
# 대신 apr 1.5.2 버전을 다운받아 빌드하면 잘 동작한다.
# 참고로 나와 같은 에러가 발생한다는 버그 리포팅이 있다.
https://bz.apache.org/bugzilla/show_bug.cgi?id=63388
comments:
댓글 쓰기