当前位置: 首页 > news >正文

RTMP推流服务器nginx在linux上的编译部署

RTMP(Real-Time Messaging Protocol)推流确实需要服务器支持‌。RTMP推流服务器的主要功能是接收来自推流客户端的数据流,对其进行处理和转发。服务器会根据RTMP协议与客户端建立连接,处理推流数据(如转码、录制等),然后将处理后的数据流发送给观看客户端。RTMP推流服务器的好处在于支持高性能、低延迟的实时数据传输,广泛应用于在线直播、视频会议、实时监控等场景‌1。

RTMP推流服务器的具体作用和好处

  1. 接收和处理推流数据‌:RTMP推流服务器接收来自推流客户端的音视频数据流,对其进行处理和转发。服务器可以对推流数据进行转码、录制等操作,确保数据的稳定传输‌1。
  2. 低延迟和高性能传输‌:RTMP协议支持高性能、低延迟的实时数据传输,能够满足高并发、低延迟的实时数据传输需求,提供稳定可靠的服务‌1。
  3. 多种推流客户端支持‌: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)&#xff0c…...

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 要理解记忆规则&#xff0c;可以到官网上去找 vue的两种使用方式 vue核心包开发 场景&#xff1a;局部模块改造vue核心包 & vue插件 工程化开发 场景&#xff1a;整站开发 2.创建vue实例 构建用户页面->创建vue实例初始化渲染 学习阶段用开发版本 3.插值…...

Servlet开发与生命周期详解-2

一、在集成开发环境当中开发Servlet程序 1.集成开发工具很多&#xff0c;其中目前使用比较多的是&#xff1a; IntelliJ IDEA&#xff08;这个居多&#xff0c;IDEA在提示功能方面要强于Eclipse&#xff0c;也就是说IDEA使用起来比Eclipse更加智能&#xff0c;更好用。JetBrai…...

vue2项目eslint提示<template v-for> key should be placed on the <template> tag

在template标签上使用v-for时&#xff0c;vue2会提示key不可放在template标签上&#xff0c;必须放在子元素上。vue3会提示key必须放在template标签上。这时候可能我们怎么写都会触发eslint校验提醒。不影响使用&#xff0c;但看着难受。 我们可以在根目录上新建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"…...

关于跨域问题(本地前端访问服务器端接口跨域出错)

问题来源&#xff1a; 当服务器封装了接口但是本地电脑端前端访问出现跨域问题。 解决方案&#xff1b; 1、使用ipconfig 查看本地电脑的ip地址 ipconfig 2、在后端接口处配置如下代码 allow_origins["http://本地ip地址:3001", # 局域网内其他设备访问的本地…...

Jackson相关问题

1、json转dto的时候&#xff0c;dto不能定义isActive这种带有is的前缀&#xff0c;如果使用Lombok的Getter/Setter的话&#xff0c;json {"isActive": true}&#xff0c;这样&#xff0c;将无法正确赋值。此时的dto再次转为json之后&#xff0c;得到的是active:false…...

【C++】互斥锁(Mutex)和原子操作(Atomics)

详细探讨 C 中的并发、多线程、互斥锁&#xff08;Mutex&#xff09;和原子操作&#xff08;Atomics&#xff09;的概念及其区别&#xff0c;并附带代码示例。 1. C 并发与多线程 (Concurrency vs. Multithreading) 并发 (Concurrency)&#xff1a;指系统能够处理多个任务的能…...

Linux--命令行操作

一、Linux的作用 1.简单的文件操作 2.编程 3.支持系统和网络 二、多账号管理 1、我们需要在root账号下进行&#xff0c;可以用whoami来查询账号身份 2、adduser 你要创建的账号名 就可以创建一个账号 3、ls /home可以查看账号是否创立 4、使用passwd 创建账号名字的来设…...

具身系列——Diffusion Policy算法实现CartPole游戏

代码原理分析 1. 核心思想 该代码实现了一个基于扩散模型&#xff08;Diffusion Model&#xff09;的强化学习策略网络。扩散模型通过逐步去噪过程生成动作&#xff0c;核心思想是&#xff1a; • 前向过程&#xff1a;通过T步逐渐将专家动作添加高斯噪声&#xff0c;最终变成…...

4.用 Excel 录入数据

一 用 Excel 录入数据的两种方式 用鼠标键盘录入数据和从网上爬取数据。 二 用鼠标键盘录入数据 1.录入数据的规范 横着录入数据&#xff08;横着一条条录入数据&#xff09;。 2.使用快捷键进行数据录入 tab 键和 enter 键。 tab 键&#xff1a;向右移动一个单元格。 tab 键…...

nginx配置跳转设置Host有误导致报404问题

我们有个项目&#xff0c;前端调用了第三方接口。为了避免跨域&#xff0c;所以使用nginx进行转发。一直正常工作&#xff0c;相安无事。近日第三方调整了安全策略&#xff0c;http转换成https&#xff0c;原本使用ip&#xff0c;现在也改成使用域名&#xff0c;所以nginx这里我…...

接口/UI自动化面试题

一、UI自动化 1.1、接口和UI自动化有多少用例&#xff1f; 回答策略&#xff1a;根据接口设定用例&#xff0c;100个接口&#xff0c;自动化case在1500-2000左右。结合自身的项目&#xff0c;回答覆盖的主功能流程。 示例&#xff1a; 接口自动化的测试case一般需要根据接口数…...

Java 中调用语言模型(如 OpenAI、阿里云通义千问、Hugging Face 等)API 的详细步骤和示例代码,涵盖常见场景及注意事项

以下是 Java 中调用语言模型&#xff08;如 OpenAI、阿里云通义千问、Hugging Face 等&#xff09;API 的详细步骤和示例代码&#xff0c;涵盖常见场景及注意事项&#xff1a; 1. 常见语言模型 API 选择 (1) OpenAI API 特点&#xff1a;支持 GPT-3、GPT-3.5、GPT-4 等模型&a…...

搜广推校招面经六十

soul推荐算法 一、word2vec原理 参考一篇文章入门Word2Vec 二、word2vec正负采样怎么做的、word2vec采用的loss和原理 见【搜广推校招面经四、搜广推校招面经五十二、搜广推校招面经五十七】 不太理解为啥问这么多word2vec&#xff0c;索性直接整理一遍。 三、多路召回融合…...

红宝书第十二讲:详解JavaScript中的工厂模式与原型模式等各种设计模式

红宝书第十二讲&#xff1a;详解JavaScript中的工厂模式与原型模式等各种设计模式 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 工厂模式和原型模式解析 一、工厂模式&#xff1a;像订外卖一样创建对象 工厂模…...

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Flutter 大潮下&#xff0c;本系列是让你看完会安心的文章。本系列将完整讲述&#xff1a;如何快速从0开发一个完整的 Flutter APP&#xff0c;配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些 Flutter 的开发细节技巧&#xff0c;并针对…...

Kafka 偏移量

在 Apache Kafka 中&#xff0c;偏移量&#xff08;Offset&#xff09;是一个非常重要的概念。它不仅用于标识消息的位置&#xff0c;还在多种场景中发挥关键作用。本文将详细介绍 Kafka 偏移量的核心概念及其使用场景。 一、偏移量的核心概念 1. 定义 偏移量是一个非负整数…...

手撕LRU缓存Java版(带输入输出)

由于面试手撕lru没撕出来&#xff0c;导致心态炸裂&#xff0c;今天特地练习了lru输入输出 手撕版&#xff0c;在每个函数里手动加上输出 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&#xff08;意为“受精卵”&#xff09;是 Android 系统中的一个核心进程&#xff0c;负责 孵化&#xff08;fork&#xff09;应用进程&#xff0c;以优化应用启动速度和内存占用。它是 Android 系统启动后第一个由 init 进程启动的 Java 进程&#xff0c;后续所有…...

python之并发编程

并发编程介绍 串行、并行与并发的区别 进程、线程、协程的区别 1. 进程 (Process) 定义&#xff1a;进程是操作系统为运行中的程序分配的基本单位。每个进程都有独立的地址空间和资源&#xff08;如内存、文件句柄等&#xff09;。特点&#xff1a; 进程是资源分配的基本单位…...

极速全场景 MPP数据库starrocks介绍

目录 一、引子 二、起源 &#xff08;一&#xff09;前身 &#xff08;二&#xff09;定位 三、特点 &#xff08;一&#xff09;高性能架构 &#xff08;二&#xff09;实时分析 &#xff08;三&#xff09;高并发与扩展性 &#xff08;四&#xff09;兼容性与生态 …...

MySQL 表连接(内连接与外连接)

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 1、表连接的核心概念 1.1 为什么需要表连接&#xff1f; 2、内连接&a…...

重学Java基础篇—什么是快速失败(fail-fast)和安全失败(fail-safe)?

快速失败&#xff08;fail-fast&#xff09; 和 安全失败&#xff08;fail-safe&#xff09; 是两种不同的迭代器设计策略&#xff0c;主要用于处理集合&#xff08;如 List、Map&#xff09;在遍历过程中被修改的场景。 它们的核心区别在于对并发修改的容忍度和实现机制。 1…...

Redis 集群配置

在币圈交易所&#xff0c;Redis 集群的节点数量和内存大小通常根据交易所的规模、访问量、并发需求等因素来决定。一般来说&#xff0c;可以按照以下标准配置&#xff1a; Redis 集群节点数量 小型交易所&#xff08;日活 < 10万&#xff0c;QPS < 10k&#xff09;&…...

容器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. 仓库&#xff08;Repository&#xff09; Git 的核心存储单元&#xff0c;包含项目所有文件及其完整历史记录。分为本地仓库&#xff08;开发者本地副本&#xff09;和远程仓库&#xff08;如 GitHub、GitLab 等云端存储&#xff09;&#xff0c;支持…...

蓝桥杯真题_小蓝和小桥的讨论

小蓝和小桥的讨论 问题描述 小蓝和小桥是一所高中的好朋友&#xff0c;他们正在讨论下一次的课程。这节课需要讨论 nn 个主题&#xff0c;第 ii 个主题对老师来说有 aia**i 的趣味度&#xff0c;对学生来说有 bib**i 的趣味度。 小蓝认为&#xff0c;如果一个主题对老师来说…...

【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请求获取全国小鹏汽车的充电桩位置信息

在新能源汽车快速发展的背景下&#xff0c;充电桩的分布和可用性成为影响用户体验的关键因素之一。随着全球对环境保护意识的增强以及政府对新能源政策的支持&#xff0c;越来越多的消费者倾向于选择电动汽车作为日常出行工具。然而&#xff0c;充电设施是否完备、便捷直接影响…...

工具介绍《WireShark》

Wireshark 过滤命令中符号含义详解 一、比较运算符 Wireshark 支持两种比较运算符语法&#xff1a;英文缩写&#xff08;如 eq&#xff09;和 C语言风格符号&#xff08;如 &#xff09;&#xff0c;两者功能等价。 符号&#xff08;英文缩写&#xff09;C语言风格符号含义示…...

深入理解 Linux 中磁盘空间驱动的编写:从原理到实践

在编写 Linux 内核中的磁盘空间驱动时&#xff0c;理解不同类型的存储设备及其在内核中的工作模式至关重要。常见的存储设备主要分为两类&#xff1a;采用 MTD&#xff08;Memory Technology Device&#xff09;模式的原始闪存设备&#xff08;如 NAND、NOR Flash&#xff09;&…...

flutter android端抓包工具

flutter做的android app&#xff0c;使用fiddler抓不了包&#xff0c;现介绍一款能支持flutter的抓包工具Reqable&#xff0c;使用方法如下&#xff1a; 1、下载电脑端安装包 下载地址为【https://reqable.com/zh-CN/download/】 2、还是在上述地址下载 android 端apk&#xf…...

知识周汇 | 用 matplotlib 轻松绘制折线图、散点图、柱状图、直方图

目录 前言 折线图 散点图 柱状图 直方图 组合图&#xff1a;柱状图和折线图 1. 导入库 2. 定义组合图函数 3. 设置中文字体和样式 4. 创建画布和子图 5. 绘制柱状图 6. 绘制折线图 7. 美化图表 8. 保存和显示图表 9. 调用函数 总结 前言 matplotlib 是 Python…...

Ribbon负载均衡的深度解析与应用

在微服务架构中&#xff0c;服务之间的调用频繁且复杂&#xff0c;因此负载均衡显得尤为重要。Spring Cloud生态系统中&#xff0c;Ribbon作为一个客户端负载均衡器&#xff0c;扮演着关键的角色。它不仅能提高系统的响应速度&#xff0c;还能确保系统的稳定性和可用性。接下来…...

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 有类冲突&#xff1b; 使用 exclude 排除本…...

【老电脑翻新】华硕A456U(换电池+换固态+光驱换机械+重装系统+重装系统后开始菜单失灵问题解决)

前言 电脑华硕A456U买来快10年了&#xff0c;倒是还能用&#xff0c;就是比较卡&#xff0c;cpu占比总是100%&#xff0c;之前已经加过内存条了。想要不换个固态看看。 省流&#xff1a;没太大效果。 记录一下拆机&换固态的过程 准备 西部数据固态硬盘480G WD Green S…...

Unity 简单使用Addressables加载SpriteAtlas图集资源

思路很简单&#xff0c;传入图集名和资源名&#xff0c;利用Addressables提供的异步加载方式从ab包中加载。加载完成后存储进缓存字典里&#xff0c;以供后续使用。 添加引用计数&#xff0c;防止多个地方使用同一图集时&#xff0c;不会提前释放 using UnityEngine; using U…...

stable diffusion本地安装

1. 基本环境准备 安装conda 环境 pytorch基础学习-CSDN博客 创建虚拟环境&#xff1a; conda create -n sd python3.10 一定要指定用3.10&#xff0c;过高的版本会提示错误&#xff1a; 激活启用环境&#xff1a; conda activate sd 设置pip国内镜像源&#xff1a; pip conf…...

MQ 如何保证数据一致性?

大家好&#xff0c;我是苏三&#xff0c;又跟大家见面了。 前言 上个月&#xff0c;我们有个电商系统出了个灵异事件&#xff1a;用户支付成功了&#xff0c;但订单状态死活不改成“已发货”。 折腾了半天才定位到问题&#xff1a;订单服务的MQ消息&#xff0c;像人间蒸发一…...

spring @Autowired对属性、set方法,构造器的分别使用,以及配合 @Autowired 和 @Qualifier避免歧义性的综合使用案例

代码结构 依赖注入 在Spring IoC容器的概念中&#xff0c;主要是使用依赖注入来实现Bean之间的依赖关系的 举例 例如&#xff0c;人类&#xff08;Person&#xff09;有时候会利用动物&#xff08;Animal&#xff09;来完成一些事情&#xff0c;狗&#xff08;Dog&#xff0…...

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年网络安全趋势

转自&#xff1a;中国新闻网 中新网北京3月14日电 国际机构高德纳(Gartner)14日发布的消息称&#xff0c;网络安全和风险管理在2025年“面临挑战与机遇并存的局面”&#xff0c;“实现转型和提高弹性”对确保企业在快速变化的数字世界中&#xff0c;实现安全且可持续的创新至关…...

设计秒杀系统(高并发的分布式系统)

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。 愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;事业有成。 若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌&#xff01; 思路 处理高并发 流量削峰&#xff1a;限流&#xf…...

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(){//使用模板前必须…...