RTMP推流服务器nginx在linux上的编译部署
RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等),然后将处理后的数据流发送给观看客户端。RTMP推流服务器的好处在于支持高性能、低延迟的实时数据传输,广泛应用于在线直播、视频会议、实时监控等场景1。
RTMP推流服务器的具体作用和好处
- 接收和处理推流数据:RTMP推流服务器接收来自推流客户端的音视频数据流,对其进行处理和转发。服务器可以对推流数据进行转码、录制等操作,确保数据的稳定传输1。
- 低延迟和高性能传输:RTMP协议支持高性能、低延迟的实时数据传输,能够满足高并发、低延迟的实时数据传输需求,提供稳定可靠的服务1。
- 多种推流客户端支持:RTMP推流服务器支持多种推流客户端,如各种直播软件和硬件设备,增加了其应用的广泛性和灵活性
实现RTMP推流服务:Nginx部署,并带入ginx-http-flv-module
采集板子上的摄像头视频流,使用gstreamer/ffmpeg进行RTMP推流到板子上的nginx服务器(nginx通过rtmp模块提供rtmp服务),然后在同个局域网内使用vlc播放器(或其他客户端)从nginx服务器获取该实时视频流。
nginx-http-flv-module 是一个基于 nginx-rtmp-module 开发的媒体流服务器模块。该项目的主要编程语言是C语言,它扩展了 nginx-rtmp-module 的功能,使其支持HTTP-FLV协议,从而提供更高效的流媒体传输服务。
1.configure failed问题:
./configure: error: C compiler /opt/bstos/linux-23/sysroots/x86_64-bstsdk-linux/usr/bin/aarch64-bst-linux/aarch64-bst-linux-gcc is not found
congigure文件增加:
CC=gcc
export CC
2,.configure failed问题,安装 pcre
apt update
apt install libpcre3 libpcre3-dev
3,.configure failed问题,安装zlib
apt-get update
apt-get install zlib1g zlib1g-dev
4,.configure:ok
根据configuration自动生成ngx_auto_config.h功能配置文件,功能宏的开关
cd nginx-1.18.0
./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --add-module=../nginx-http-flv-module --with-http_ssl_module --with-http_flv_module --with-pcre=/path/to/pcre --with-zlib=/path/to/zlib --with-openssl=/path/to/openssl --with-ld-opt="-static" --with-http_dav_module --with-http_degradation_module --with-http_realip_module --with-http_stub_status_module
Configuration summary
+ using threads
+ using PCRE library: /path/to/pcre
+ using OpenSSL library: /path/to/openssl
+ using zlib library: /path/to/zlib
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/nginx/sbin/nginx"
nginx modules path: "/usr/local/nginx/modules"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"
5,Linking, undefined reference to `ngx_rtmp_dash_module'
解决方案: 增加nginx-http-flv-module\dash的编译
6,Linking, undefined reference to `crypt_r'
[100%] Linking C executable nginx
/opt/bstos/linux-23/sysroots/x86_64-bstsdk-linux/usr/libexec/aarch64-bst-linux/gcc/aarch64-bst-linux/8.3.0/real-ld: CMakeFiles/nginx.dir/nginx-1.18.0/src/os/unix/ngx_user.c.o: in function `ngx_libc_crypt':
/home/C882Dev_2351/C882_AP/app/nginx/nginx-1.18.0/src/os/unix/ngx_user.c:25: undefined reference to `crypt_r'
collect2: error: ld returned 1 exit status
CMakeFiles/nginx.dir/build.make:2866: recipe for target 'nginx' failed
make[2]: *** [nginx] Error 1
CMakeFiles/Makefile2:94: recipe for target 'CMakeFiles/nginx.dir/all' failed
make[1]: *** [CMakeFiles/nginx.dir/all] Error 2
Makefile:102: recipe for target 'all' failed
make: *** [all] Error 2
解决方案:
增加: -lcrypt
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${CMAKE_SYSROOT} -O0 -std=c++17 -s -lcrypt")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${CMAKE_SYSROOT} -I${OPENSSL_INCLUDE_DIR} -O2 -Wall -Werror -g -lcrypt")
7,link & Built target nginx OK
[ 93%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_netcall_module.c.o
[ 94%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_notify_module.c.o
[ 94%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_parse.c.o
[ 95%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_play_module.c.o
[ 95%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_proxy_protocol.c.o
[ 96%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_receive.c.o
[ 96%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_record_module.c.o
[ 97%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_relay_module.c.o
[ 97%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_send.c.o
[ 98%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_shared.c.o
[ 98%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_stat_module.c.o
[ 99%] Building C object CMakeFiles/nginx_http_flv.dir/nginx-http-flv-module/ngx_rtmp_variables.c.o
[100%] Linking C executable nginx_http_flv
[100%] Built target nginx_http_flv
nginx 编译参数:
./configure --prefix=/usr/local/nginx --with-threads --with-file-aio --add-module=../nginx-http-flv-module --with-http_ssl_module --with-http_flv_module --with-pcre=/path/to/pcre --with-zlib=/path/to/zlib --with-openssl=/path/to/openssl --with-ld-opt="-static" --with-http_dav_module --with-http_degradation_module --with-http_realip_module --with-http_stub_status_module
--prefix=PATH 指向安装目录
--sbin-path=PATH 指向(执行)程序文件
--conf-path=PATH 指向配置文件(nginx.conf)
--error-log-path=PATH 指向错误日志目录
--pid-path=PATH 指向pid文件(nginx.pid)
--lock-path=PATH 指向lock文件(nginx.lock)(安装文件锁定,防止安装文件被别人利用,或自己误操作。)
--user=USER 指定程序运行时的非特权用户
--group=GROUP 指定程序运行时的非特权用户组
--builddir=DIR 指向编译目录
--with-select_module 启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module
--without-select_module 禁用:--without-select_module
--with-poll_module 启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)
--without-poll_module 禁用:--without-select_module
--with-threads 启用线程池支持
--with-file-aio 启用file aio支持(一种APL文件传输格式)
--with-ipv6 启用ipv6支持
--with-http_ssl_module 启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
--with-http_v2_module
--with-http_realip_module 启用ngx_http_realip_module支持(这个模块允许从请求标头更改客户端的IP地址值,默认为关)
--with-http_addition_module 启用ngx_http_addition_module支持(作为一个输出过滤器,支持不完全缓冲,分部分响应请求)
--with-http_xslt_module 启用ngx_http_xslt_module支持(过滤转换XML请求)
--with-http_image_filter_module 启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用。gd库要用到)
--with-http_geoip_module 启用ngx_http_geoip_module支持(该模块创建基于与MaxMind GeoIP二进制文件相配的客户端IP地址的ngx_http_geoip_module变量)
--with-http_sub_module 启用ngx_http_sub_module支持(允许用一些其他文本替换nginx响应中的一些文本)
--with-http_dav_module 启用ngx_http_dav_module支持(增加PUT,DELETE,MKCOL:创建集合,COPY和MOVE方法)默认情况下为关闭,需编译开启
--with-http_flv_module 启用ngx_http_flv_module支持(提供寻求内存使用基于时间的偏移量文件)
--with-http_mp4_module
--with-http_gunzip_module
--with-http_gzip_static_module 启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
--with-http_auth_request_module
--with-http_random_index_module 启用ngx_http_random_index_module支持(从目录中随机挑选一个目录索引)
--with-http_secure_link_module 启用ngx_http_secure_link_module支持(计算和检查要求所需的安全链接网址)
--with-http_degradation_module 启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)
--with-http_slice_module
--with-http_stub_status_module 启用ngx_http_stub_status_module支持(获取nginx自上次启动以来的工作状态)
--without-http_charset_module 禁用ngx_http_charset_module支持(重新编码web页面,但只能是一个方向--服务器端到客户端,并且只有一个字节的编码可以被重新编码)
--without-http_gzip_module 禁用ngx_http_gzip_module支持(该模块同-with-http_gzip_static_module功能一样)
--without-http_ssi_module 禁用ngx_http_ssi_module支持(该模块提供了一个在输入端处理处理服务器包含文件(SSI)的过滤器,目前支持SSI命令的列表是不完整的)
--without-http_userid_module 禁用ngx_http_userid_module支持(该模块用来处理用来确定客户端后续请求的cookies)
--without-http_access_module 禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制。允许/拒绝基于ip地址)
--without-http_auth_basic_module 禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法来保护你的站点或其部分内容)
--without-http_autoindex_module 禁用disable ngx_http_autoindex_module支持(该模块用于自动生成目录列表,只在ngx_http_index_module模块未找到索引文件时发出请求。)
--without-http_geo_module 禁用ngx_http_geo_module支持(创建一些变量,其值依赖于客户端的IP地址)
--without-http_map_module 禁用ngx_http_map_module支持(使用任意的键/值对设置配置变量)
--without-http_split_clients_module 禁用ngx_http_split_clients_module支持(该模块用来基于某些条件划分用户。条件如:ip地址、报头、cookies等等)
--without-http_referer_module 禁用disable ngx_http_referer_module支持(该模块用来过滤请求,拒绝报头中Referer值不正确的请求)
--without-http_rewrite_module 禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URI,并且根据变量来转向以及选择配置。
如果在server级别设置该选项,那么他们将在 location之前生效。如果在location还有更进一步的重写规则,location部分的规则依然会被执行。
如果这个URI重写是因为location部分的规则造成的,那么 location部分会再次被执行作为新的URI。 这个循环会执行10次,然后Nginx会返回一个500错误。)
--without-http_proxy_module 禁用ngx_http_proxy_module支持(有关代理服务器)
--without-http_fastcgi_module 禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。 )FastCGI一个常驻型的公共网关接口。
--without-http_uwsgi_module 禁用ngx_http_uwsgi_module支持(该模块用来医用uwsgi协议,uWSGI服务器相关)
--without-http_scgi_module 禁用ngx_http_scgi_module支持(该模块用来启用SCGI协议支持,SCGI协议是CGI协议的替代。它是一种应用程序与HTTP服务接口标准。它有些像FastCGI但他的设计 更容易实现。)
--without-http_memcached_module 禁用ngx_http_memcached_module支持(该模块用来提供简单的缓存,以提高系统效率)
--without-http_limit_conn_module 禁用ngx_http_limit_zone_module支持(该模块可以针对条件,进行会话的并发连接数控制)
--without-http_limit_req_module 禁用ngx_http_limit_req_module支持(该模块允许你对于一个地址进行请求数量的限制用一个给定的session或一个特定的事件)
--without-http_empty_gif_module 禁用ngx_http_empty_gif_module支持(该模块在内存中常驻了一个1*1的透明GIF图像,可以被非常快速的调用)
--without-http_browser_module 禁用ngx_http_browser_module支持(该模块用来创建依赖于请求报头的值。如果浏览器为modern ,则$modern_browser等于modern_browser_value指令分配的值;
如 果浏览器为old,则$ancient_browser等于 ancient_browser_value指令分配的值;如果浏览器为 MSIE中的任意版本,则 $msie等于1)
--without-http_upstream_hash_module
--without-http_upstream_ip_hash_module 禁用ngx_http_upstream_ip_hash_module支持(该模块用于简单的负载均衡)
--without-http_upstream_least_conn_module
--without-http_upstream_keepalive_module
--without-http_upstream_zone_module
--with-http_perl_module 启用ngx_http_perl_module支持(该模块使nginx可以直接使用perl或通过ssi调用perl)
--with-perl_modules_path=PATH 设定perl模块路径
--with-perl=PATH 设定perl库文件路径
--http-log-path=PATH 设定access log路径
--http-client-body-temp-path=PATH 设定http客户端请求临时文件路径
--http-proxy-temp-path=PATH 设定http代理临时文件路径
--http-fastcgi-temp-path=PATH 设定http fastcgi临时文件路径
--http-uwsgi-temp-path=PATH 设定http uwsgi临时文件路径
--http-scgi-temp-path=PATH 设定http scgi临时文件路径
--without-http 禁用http server功能
--without-http-cache 禁用http cache功能
--with-mail 启用POP3/IMAP4/SMTP代理模块支持
--with-mail_ssl_module 启用ngx_mail_ssl_module支持
--without-mail_pop3_module 禁用pop3协议
--without-mail_imap_module 禁用imap协议
--without-mail_smtp_module 禁用smtp协议
--with-stream
--with-stream_ssl_module
--without-stream_limit_conn_module
--without-stream_access_module
--without-stream_upstream_hash_module
--without-stream_upstream_least_conn_module
--without-stream_upstream_zone_module
--with-google_perftools_module 启用ngx_google_perftools_module支持(调试用,剖析程序性能瓶颈)
--with-cpp_test_module 启用ngx_cpp_test_module支持
--add-module=PATH 启用外部模块支持
--with-cc=PATH 指向C编译器路径
--with-cpp=PATH 指向C预处理路径
--with-cc-opt=OPTIONS 设置C编译器参数
--with-ld-opt=OPTIONS 设置连接文件参数
--with-cpu-opt=CPU 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
--without-pcre 禁用pcre库
--with-pcre 启用pcre库
--with-pcre=DIR 指向pcre库文件目录
--with-pcre-opt=OPTIONS 在编译时为pcre库设置附加参数
--with-pcre-jit
--with-md5=DIR 指向md5库文件目录
--with-md5-opt=OPTIONS 在编译时为md5库设置附加参数
--with-md5-asm 使用md5汇编源
--with-sha1=DIR 指向sha1库目录(数字签名算法,主要用于数字签名)
--with-sha1-opt=OPTIONS 在编译时为sha1库设置附加参数
--with-sha1-asm 使用sha1汇编源
--with-zlib=DIR 指向zlib库目录
--with-zlib-opt=OPTIONS 在编译时为zlib设置附加参数
--with-zlib-asm=CPU 为指定的CPU使用zlib汇编源进行优化,CPU类型为pentium, pentiumpro
--with-libatomic 为原子内存的更新操作的实现提供一个架构
--with-libatomic=DIR 指向libatomic_ops安装目录
--with-openssl=DIR 指向openssl安装目录
--with-openssl-opt=OPTIONS 在编译时为openssl设置附加参数
--with-debug 启用debug日志
CMakelist.txt:
cmake_minimum_required(VERSION 3.10.2)
project(nginx)
# -------------------------------version---------------------------------------------- #
set(main_version 1)
set(mdl_version 1)
set(sub_version 6)
set(version ${main_version}.${mdl_version}.${sub_version})
MESSAGE("CT: ${CT}")
if(NOT CT)
set(CT "lp")
MESSAGE("CT: ${CT}")
endif()
MESSAGE("ODIR: ${ODIR}")
if(NOT ODIR)
set(ODIR ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_${version}/)
MESSAGE("ODIR: ${ODIR}")
else()
set(ODIR ${ODIR}/${PROJECT_NAME})
MESSAGE("ODIR: ${ODIR}")
endif()
# 设置源码路径 CMakeFiles/nginx.dir/nginx-1.18.0
set(NGINX_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/nginx-1.18.0")
set(FLV_MODULE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/nginx-http-flv-module")
set(CMAKE_SYSROOT /opt/bstos/linux-23/sysroots/aarch64-bst-linux)
# -------------------------------compile flag---------------------------------------------- #
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${CMAKE_SYSROOT} -O0 -std=c++17 -s -lcrypt")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${CMAKE_SYSROOT} -I${OPENSSL_INCLUDE_DIR} -O2 -Wall -Werror -g -lcrypt")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${CMAKE_SYSROOT} -static")
# Specify the cross compiler
#set(CMAKE_C_COMPILER /opt/bstos/linux-23/sysroots/x86_64-bstsdk-linux/usr/bin/aarch64-bst-linux/aarch64-bst-linux-gcc)
#set(CMAKE_C_COMPILER /usr/local/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-gcc)
#set(CMAKE_CXX_COMPILER /opt/bstos/linux-23/sysroots/x86_64-bstsdk-linux/usr/bin/aarch64-bst-linux/aarch64-bst-linux-g++)
# Add extra compiler flags
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --sysroot=${CMAKE_SYSROOT}")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --sysroot=${CMAKE_SYSROOT}")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --sysroot=${CMAKE_SYSROOT}")
#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${OPENSSL_INCLUDE_DIR}")
find_program(CONFIGURE_EXECUTABLE configure PATHS "${NGINX_SRC_DIR}")
execute_process(
COMMAND ${CONFIGURE_EXECUTABLE} --prefix=/usr/local/nginx --with-threads --with-file-aio --with-ld-opt=-static --add-module=../nginx-http-flv-module --with-http_ssl_module --with-http_flv_module --with-pcre=/path/to/pcre --with-zlib=/path/to/zlib --with-openssl=/path/to/openssl --with-http_dav_module --with-http_degradation_module --with-http_realip_module --with-http_stub_status_module
WORKING_DIRECTORY ${NGINX_SRC_DIR}
)
# -------------------------------opencv---------------------------------------------- #
find_package(OpenCV REQUIRED)
IF(OpenCV_FOUND)
MESSAGE("OpenCV_VERSION:${OpenCV_VERSION}")
MESSAGE("OpenCV_LIBS:${OpenCV_LIBS}")
MESSAGE("OpenCV_INCLUDE_DIRS:${OpenCV_INCLUDE_DIRS}")
ENDIF()
# -------------------------------include heard files---------------------------------------------- #
# 包含头文件路径
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/nginx-http-flv-module
${CMAKE_CURRENT_SOURCE_DIR}/nginx-http-flv-module/hls
${NGINX_SRC_DIR}/src/core
${NGINX_SRC_DIR}/src/event
${NGINX_SRC_DIR}/src/event/modules
${NGINX_SRC_DIR}/src/http
${NGINX_SRC_DIR}/src/http/v2
${NGINX_SRC_DIR}/src/http/modules
${NGINX_SRC_DIR}/src/http/modules/perl
${NGINX_SRC_DIR}/src/mail
${NGINX_SRC_DIR}/src/os/unix
${NGINX_SRC_DIR}/src/stream
${NGINX_SRC_DIR}/objs
${FLV_MODULE_DIR}
${FLV_MODULE_DIR}/dash
${FLV_MODULE_DIR}/hls
${OPENSSL_INCLUDE_DIR}/opt/bstos/linux-23/sysroots/aarch64-bst-linux/usr/include
)
# Nginx core source files
file(GLOB_RECURSE NGINX_SOURCES
"${NGINX_SRC_DIR}/src/core/*.c"
"${NGINX_SRC_DIR}/src/event/*.c"
# 只使用 epoll 模块,不使用其他事件模块
"${NGINX_SRC_DIR}/src/event/modules/ngx_epoll_module.c"
"${NGINX_SRC_DIR}/src/os/unix/*.c"
"${NGINX_SRC_DIR}/src/http/*.c"
"${NGINX_SRC_DIR}/src/http/modules/*.c"
"${NGINX_SRC_DIR}/objs/src/http/modules/ngx_http_config_module.c"
"${NGINX_SRC_DIR}/objs/ngx_modules.c"
)
# 显式排除不需要的特定平台模块
list(REMOVE_ITEM NGINX_SOURCES
"${NGINX_SRC_DIR}/src/event/modules/ngx_eventport_module.c"
"${NGINX_SRC_DIR}/src/event/modules/ngx_kqueue_module.c"
"${NGINX_SRC_DIR}/src/event/modules/ngx_devpoll_module.c" #Solaris
"${NGINX_SRC_DIR}/src/event/modules/ngx_poll_module.c" #启用poll模块支持(功能与select相同,与select特性相同,为一种轮询模式,不推荐在高载环境下使用)
"${NGINX_SRC_DIR}/src/event/modules/ngx_select_module.c" #启用select模块支持(一种轮询模式,不推荐在高载环境下使用)
"${NGINX_SRC_DIR}/src/event/modules/ngx_win32_select_module.c"
"${NGINX_SRC_DIR}/src/event/modules/ngx_win32_iocp_module.c"
"${NGINX_SRC_DIR}/src/event/modules/ngx_win32_poll_module.c"
"${NGINX_SRC_DIR}/src/http/modules/ngx_http_geoip_module.c"
"${NGINX_SRC_DIR}/src/http/modules/ngx_http_image_filter_module.c"
"${NGINX_SRC_DIR}/src/http/modules/ngx_http_xslt_filter_module.c"
"${NGINX_SRC_DIR}/src/http/modules/perl/ngx_http_perl_module.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_darwin_init.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_darwin_sendfile_chain.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_file_aio_read.c" #FreeBSD file AIO features and quirks
"${NGINX_SRC_DIR}/src/os/unix/ngx_freebsd_init.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_freebsd_sendfile_chain.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_solaris_init.c"
"${NGINX_SRC_DIR}/src/os/unix/ngx_solaris_sendfilev_chain.c"
)
# 使用生成的ngx_modules.c而不是Nginx源码中的
#list(REMOVE_ITEM NGINX_SOURCES "${NGINX_SRC_DIR}/objs/ngx_modules.c")
#list(APPEND NGINX_SOURCES "${CMAKE_BINARY_DIR}/ngx_modules.c")
# 定义必要的宏(根据Nginx配置生成)
# Add necessary compile definitions
add_definitions(
-DNGX_PREFIX="${CMAKE_INSTALL_PREFIX}"
-DNGX_CONF_PREFIX="${CMAKE_INSTALL_PREFIX}/conf"
-DNGX_SBIN_PATH="${CMAKE_INSTALL_PREFIX}/sbin/nginx"
-DNGX_CONF_PATH="${CMAKE_INSTALL_PREFIX}/conf/nginx.conf"
-DNGX_PID_PATH="${CMAKE_INSTALL_PREFIX}/logs/nginx.pid"
-DNGX_LOCK_PATH="${CMAKE_INSTALL_PREFIX}/logs/nginx.lock"
-DNGX_ERROR_LOG_PATH="${CMAKE_INSTALL_PREFIX}/logs/error.log"
-DNGX_HTTP_LOG_PATH="${CMAKE_INSTALL_PREFIX}/logs/access.log"
-DNGX_HTTP_CLIENT_TEMP_PATH="${CMAKE_INSTALL_PREFIX}/client_body_temp"
-DNGX_HTTP_PROXY_TEMP_PATH="${CMAKE_INSTALL_PREFIX}/proxy_temp"
-DNGX_HTTP_FASTCGI_TEMP_PATH="${CMAKE_INSTALL_PREFIX}/fastcgi_temp"
-DNGX_HTTP_UWSGI_TEMP_PATH="${CMAKE_INSTALL_PREFIX}/uwsgi_temp"
-DNGX_HTTP_SCGI_TEMP_PATH="${CMAKE_INSTALL_PREFIX}/scgi_temp"
-D_GNU_SOURCE
-D_FILE_OFFSET_BITS=64
-DNGX_HAVE_UNISTD_H
-DNGX_OFF_T_LEN=20
# 添加缺失的定义
-DNGX_USER="nobody"
-DNGX_GROUP="nogroup"
-DNGX_HAVE_INET6=1
-DNGX_HAVE_PREAD=1
-DNGX_HAVE_PWRITE=1
-DNGX_HAVE_SENDFILE=1
-DNGX_HAVE_SENDFILE64=1
-DNGX_HAVE_PR_SET_DUMPABLE=1
-DNGX_HAVE_SCHED_SETAFFINITY=1
-DNGX_HAVE_GNU_CRYPT_R=1
-DNGX_HAVE_NONALIGNED=1
-DNGX_CPU_CACHE_LINE=64
-DNGX_HTTP_CACHE=1
-DNGX_HTTP_GZIP=1
-DNGX_HTTP_SSI=1
-DNGX_HTTP_V2=1
-DNGX_CRYPT=1
-DNGX_COMPAT=1
-DNGX_HTTP_HEADERS=1
-DNGX_HAVE_TIMER_EVENT=1
-DNGX_SIZE_T_LEN=20 # 添加缺失的 NGX_SIZE_T_LEN 定义
# 添加新缺失的宏定义
-DNGX_MAX_SIZE_T_VALUE=9223372036854775807UL # 64位系统下size_t最大值
-DNGX_MAX_OFF_T_VALUE=9223372036854775807LL # 64位系统下off_t最大值
# 添加 epoll 相关的编译定义
-DNGX_HAVE_EPOLL=1
-DNGX_HAVE_EPOLL_EVENT=1
-DNGX_HAVE_CLEAR_EVENT=1
-DNGX_LINUX=1
-DNGX_HTTP_FLV_MODULE
)
# 添加FLV模块源码
file(GLOB FLV_MODULE_SOURCES
${FLV_MODULE_DIR}/*.c
${FLV_MODULE_DIR}/hls/*.c
${FLV_MODULE_DIR}/dash/*.c)
list(APPEND NGINX_SOURCES ${FLV_MODULE_SOURCES})
# 查找依赖库(configure时,需提前静态编译)
find_library(PCRE_LIB pcre HINTS /path/to/pcre-arm/lib REQUIRED)
find_library(SSL_LIB ssl HINTS /path/to/openssl-arm/lib REQUIRED)
find_library(CRYPTO_LIB crypto HINTS /path/to/openssl-arm/lib REQUIRED)
find_library(ZLIB_LIB z HINTS /path/to/zlib-arm/lib REQUIRED)
ADD_EXECUTABLE(${PROJECT_NAME} ${NGINX_SOURCES})
# 链接依赖库
target_link_libraries(${PROJECT_NAME}
${PCRE_LIB}
${SSL_LIB}
${CRYPTO_LIB}
${ZLIB_LIB}
-ldl -lpthread
)
相关文章:
RTMP推流服务器nginx在linux上的编译部署
RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等&…...
Matlab教程001:软件介绍和界面使用
1.1 软件介绍 1.1.1 Matlab的介绍 MATLAB(MATrix LABoratory)是一款由 MathWorks 公司开发的高级编程语言和交互式环境,广泛用于 科学计算、数据分析、机器学习、工程建模、仿真和信号处理 等领域。 1.1.2 主要应用领域 数据分析与可视化…...
【SQL Server数据库备份详细教程】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
Java设计模式之解释器模式
概念 解释器模式是一种行为型设计模式,用于定义一种语言的语法规则,并提供解释器来解释该语言中的表达式。 作用 其核心作用是将复杂的语法分解为简单的语法单元,通过递归组合的方式构建抽象语法树(AST),…...
el-date-picker时间范围 编辑回显后不能修改问题
el-date-picker daterange时间范围 编辑回显后不能修改 <el-form-item:label"LABELS.gplanRecordDateLabel"prop"gplanRecordDate"><el-date-pickerstyle"width: 300px"v-model"formData.gplanRecordDate"type"daterang…...
vue复习1~45
1.关于vue 要理解记忆规则,可以到官网上去找 vue的两种使用方式 vue核心包开发 场景:局部模块改造vue核心包 & vue插件 工程化开发 场景:整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...
Servlet开发与生命周期详解-2
一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多,其中目前使用比较多的是: IntelliJ IDEA(这个居多,IDEA在提示功能方面要强于Eclipse,也就是说IDEA使用起来比Eclipse更加智能,更好用。JetBrai…...
vue2项目eslint提示<template v-for> key should be placed on the <template> tag
在template标签上使用v-for时,vue2会提示key不可放在template标签上,必须放在子元素上。vue3会提示key必须放在template标签上。这时候可能我们怎么写都会触发eslint校验提醒。不影响使用,但看着难受。 我们可以在根目录上新建jsconfig.json…...
老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比
Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…...
关于跨域问题(本地前端访问服务器端接口跨域出错)
问题来源: 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…...
Jackson相关问题
1、json转dto的时候,dto不能定义isActive这种带有is的前缀,如果使用Lombok的Getter/Setter的话,json {"isActive": true},这样,将无法正确赋值。此时的dto再次转为json之后,得到的是active:false…...
【C++】互斥锁(Mutex)和原子操作(Atomics)
详细探讨 C 中的并发、多线程、互斥锁(Mutex)和原子操作(Atomics)的概念及其区别,并附带代码示例。 1. C 并发与多线程 (Concurrency vs. Multithreading) 并发 (Concurrency):指系统能够处理多个任务的能…...
Linux--命令行操作
一、Linux的作用 1.简单的文件操作 2.编程 3.支持系统和网络 二、多账号管理 1、我们需要在root账号下进行,可以用whoami来查询账号身份 2、adduser 你要创建的账号名 就可以创建一个账号 3、ls /home可以查看账号是否创立 4、使用passwd 创建账号名字的来设…...
具身系列——Diffusion Policy算法实现CartPole游戏
代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型(Diffusion Model)的强化学习策略网络。扩散模型通过逐步去噪过程生成动作,核心思想是: • 前向过程:通过T步逐渐将专家动作添加高斯噪声,最终变成…...
4.用 Excel 录入数据
一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据(横着一条条录入数据)。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键:向右移动一个单元格。 tab 键…...
nginx配置跳转设置Host有误导致报404问题
我们有个项目,前端调用了第三方接口。为了避免跨域,所以使用nginx进行转发。一直正常工作,相安无事。近日第三方调整了安全策略,http转换成https,原本使用ip,现在也改成使用域名,所以nginx这里我…...
接口/UI自动化面试题
一、UI自动化 1.1、接口和UI自动化有多少用例? 回答策略:根据接口设定用例,100个接口,自动化case在1500-2000左右。结合自身的项目,回答覆盖的主功能流程。 示例: 接口自动化的测试case一般需要根据接口数…...
Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项
以下是 Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项: 1. 常见语言模型 API 选择 (1) OpenAI API 特点:支持 GPT-3、GPT-3.5、GPT-4 等模型&a…...
搜广推校招面经六十
soul推荐算法 一、word2vec原理 参考一篇文章入门Word2Vec 二、word2vec正负采样怎么做的、word2vec采用的loss和原理 见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】 不太理解为啥问这么多word2vec,索性直接整理一遍。 三、多路召回融合…...
红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式
红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 工厂模式和原型模式解析 一、工厂模式:像订外卖一样创建对象 工厂模…...
Flutter完整开发实战详解(一、Dart语言和Flutter基础)
前言 在如今的 Flutter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧,并针对…...
Kafka 偏移量
在 Apache Kafka 中,偏移量(Offset)是一个非常重要的概念。它不仅用于标识消息的位置,还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…...
手撕LRU缓存Java版(带输入输出)
由于面试手撕lru没撕出来,导致心态炸裂,今天特地练习了lru输入输出 手撕版,在每个函数里手动加上输出 public class LC146 {static class LRUCache{class Node{int key, value;Node prev, next;Node(int key, int value){this.key key;thi…...
Android 12系统源码_系统启动(二)Zygote进程
前言 Zygote(意为“受精卵”)是 Android 系统中的一个核心进程,负责 孵化(fork)应用进程,以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程,后续所有…...
python之并发编程
并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义:进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源(如内存、文件句柄等)。特点: 进程是资源分配的基本单位…...
极速全场景 MPP数据库starrocks介绍
目录 一、引子 二、起源 (一)前身 (二)定位 三、特点 (一)高性能架构 (二)实时分析 (三)高并发与扩展性 (四)兼容性与生态 …...
MySQL 表连接(内连接与外连接)
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 1、表连接的核心概念 1.1 为什么需要表连接? 2、内连接&a…...
重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?
快速失败(fail-fast) 和 安全失败(fail-safe) 是两种不同的迭代器设计策略,主要用于处理集合(如 List、Map)在遍历过程中被修改的场景。 它们的核心区别在于对并发修改的容忍度和实现机制。 1…...
Redis 集群配置
在币圈交易所,Redis 集群的节点数量和内存大小通常根据交易所的规模、访问量、并发需求等因素来决定。一般来说,可以按照以下标准配置: Redis 集群节点数量 小型交易所(日活 < 10万,QPS < 10k)&…...
容器C++
string容器 string构造函数 #include<iostream> using namespace std; #include<string.h> void test01() {string s1;//默认构造const char* str "hello world";string s2(str);//传入char*cout << "s2" << s2 << endl;s…...
Git 基础入门:从概念到实践的版本控制指南
一、Git 核心概念解析 1. 仓库(Repository) Git 的核心存储单元,包含项目所有文件及其完整历史记录。分为本地仓库(开发者本地副本)和远程仓库(如 GitHub、GitLab 等云端存储),支持…...
蓝桥杯真题_小蓝和小桥的讨论
小蓝和小桥的讨论 问题描述 小蓝和小桥是一所高中的好朋友,他们正在讨论下一次的课程。这节课需要讨论 nn 个主题,第 ii 个主题对老师来说有 aia**i 的趣味度,对学生来说有 bib**i 的趣味度。 小蓝认为,如果一个主题对老师来说…...
【C++游戏引擎开发】《线性代数》(2):矩阵加减法与SIMD集成
一、矩阵加减法数学原理 1.1 定义 逐元素操作:运算仅针对相同位置的元素,不涉及矩阵乘法或行列变换。交换律与结合律: 加法满足交换律(A + B = B + A)和结合律( ( A + B ) + C = A + ( B + C ) )。 减法不满足交换律(A − B ≠ B − A)。1.2 公式 C i j = …...
HTML应用指南:利用POST请求获取全国小鹏汽车的充电桩位置信息
在新能源汽车快速发展的背景下,充电桩的分布和可用性成为影响用户体验的关键因素之一。随着全球对环境保护意识的增强以及政府对新能源政策的支持,越来越多的消费者倾向于选择电动汽车作为日常出行工具。然而,充电设施是否完备、便捷直接影响…...
工具介绍《WireShark》
Wireshark 过滤命令中符号含义详解 一、比较运算符 Wireshark 支持两种比较运算符语法:英文缩写(如 eq)和 C语言风格符号(如 ),两者功能等价。 符号(英文缩写)C语言风格符号含义示…...
深入理解 Linux 中磁盘空间驱动的编写:从原理到实践
在编写 Linux 内核中的磁盘空间驱动时,理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类:采用 MTD(Memory Technology Device)模式的原始闪存设备(如 NAND、NOR Flash)&…...
flutter android端抓包工具
flutter做的android app,使用fiddler抓不了包,现介绍一款能支持flutter的抓包工具Reqable,使用方法如下: 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk…...
知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图
目录 前言 折线图 散点图 柱状图 直方图 组合图:柱状图和折线图 1. 导入库 2. 定义组合图函数 3. 设置中文字体和样式 4. 创建画布和子图 5. 绘制柱状图 6. 绘制折线图 7. 美化图表 8. 保存和显示图表 9. 调用函数 总结 前言 matplotlib 是 Python…...
Ribbon负载均衡的深度解析与应用
在微服务架构中,服务之间的调用频繁且复杂,因此负载均衡显得尤为重要。Spring Cloud生态系统中,Ribbon作为一个客户端负载均衡器,扮演着关键的角色。它不仅能提高系统的响应速度,还能确保系统的稳定性和可用性。接下来…...
Neo4j GDS-06-neo4j GDS 库中社区检测算法介绍
neo4j apoc 系列 Neo4j APOC-01-图数据库 apoc 插件介绍 Neo4j APOC-01-图数据库 apoc 插件安装 neo4j on windows10 Neo4j APOC-03-图数据库 apoc 实战使用使用 Neo4j APOC-04-图数据库 apoc 实战使用使用 apoc.path.spanningTree 最小生成树 Neo4j APOC-05-图数据库 apo…...
Android 删除aar中的一个类 aar包冲突 aar类冲突 删除aar中的一个包
Duplicate class com.xxxa.naviauto.sdk.listener.OnChangeListener found in modules jetified-xxxa-sdk-v1.1.2-release-runtime (:xxx-sdk-v1.1.2-release:) and jetified-xxxb-sdk-1.1.3-runtime (:xxxb-sdk-1.1.3:) A.aar B.aar 有类冲突; 使用 exclude 排除本…...
【老电脑翻新】华硕A456U(换电池+换固态+光驱换机械+重装系统+重装系统后开始菜单失灵问题解决)
前言 电脑华硕A456U买来快10年了,倒是还能用,就是比较卡,cpu占比总是100%,之前已经加过内存条了。想要不换个固态看看。 省流:没太大效果。 记录一下拆机&换固态的过程 准备 西部数据固态硬盘480G WD Green S…...
Unity 简单使用Addressables加载SpriteAtlas图集资源
思路很简单,传入图集名和资源名,利用Addressables提供的异步加载方式从ab包中加载。加载完成后存储进缓存字典里,以供后续使用。 添加引用计数,防止多个地方使用同一图集时,不会提前释放 using UnityEngine; using U…...
stable diffusion本地安装
1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境: conda create -n sd python3.10 一定要指定用3.10,过高的版本会提示错误: 激活启用环境: conda activate sd 设置pip国内镜像源: pip conf…...
MQ 如何保证数据一致性?
大家好,我是苏三,又跟大家见面了。 前言 上个月,我们有个电商系统出了个灵异事件:用户支付成功了,但订单状态死活不改成“已发货”。 折腾了半天才定位到问题:订单服务的MQ消息,像人间蒸发一…...
spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例
代码结构 依赖注入 在Spring IoC容器的概念中,主要是使用依赖注入来实现Bean之间的依赖关系的 举例 例如,人类(Person)有时候会利用动物(Animal)来完成一些事情,狗(Dog࿰…...
Ubuntu 系统上完全卸载 Docker
以下是在 Ubuntu 系统上完全卸载 Docker 的分步指南 一.卸载验证 二.卸载步骤 1.停止 Docker 服务 sudo systemctl stop docker.socket sudo systemctl stop docker.service2.卸载 Docker 软件包 # 移除 Docker 核心组件 sudo apt-get purge -y \docker-ce \docker-ce-cli …...
国际机构Gartner发布2025年网络安全趋势
转自:中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称,网络安全和风险管理在2025年“面临挑战与机遇并存的局面”,“实现转型和提高弹性”对确保企业在快速变化的数字世界中,实现安全且可持续的创新至关…...
设计秒杀系统(高并发的分布式系统)
学海无涯,志当存远。燃心砺志,奋进不辍。 愿诸君得此鸡汤,如沐春风,事业有成。 若觉此言甚善,烦请赐赞一枚,共励学途,同铸辉煌! 思路 处理高并发 流量削峰:限流…...
C# 打印模板设计-ACTIVEX打印控件-多模板加载
一、启动软件 using System; using System.Collections.Generic; using System.Windows.Forms; using System.Data;namespace Print {static class Program{/// <summary>/// 应用程序的主入口点。/// </summary>[STAThread]static void Main(){//使用模板前必须…...