ZLMediaKit源码分析(一)启动

本文详细介绍了流媒体服务启动过程,包括命令行参数解析、线程池配置、TCP及UDP服务器启动、各种协议的支持(如RTSP、RTMP、HTTP等)、会话管理和定时器实现。同时探讨了线程池的初始化、子线程级别的设定以及为每个Event Loop设置epoll_ctl的具体步骤。

启动位置

server/main.c -> start_main

解析命令行

daemon :守护进程
level:日志级别
config:配置文件路径
ssl:ssl密钥路径
threads: 线程锁数量
max_day :日志最多保存天数

CMD_main cmd_main;
try {
   
   
    cmd_main.operator()(argc, argv);
} catch (ExitException &) {
   
   
    return 0;
} catch (std::exception &ex) {
   
   
    cout << ex.what() << endl;
    return -1;
}

bool bDaemon = cmd_main.hasKey("daemon");
LogLevel logLevel = (LogLevel) cmd_main["level"].as<int>();
logLevel = MIN(MAX(logLevel, LTrace), LError);
g_ini_file = cmd_main["config"];
string ssl_file = cmd_main["ssl"];
int threads = cmd_main["threads"];

//.....
fileChannel->setMaxDay(cmd_main["max_day"]);

启动流媒体服务

首先会设置线程池的大小,线程池大小默认是std::thread::hardware_concurrency() cup最大的数量*2,接着调用TcpServer或者UdpServer的start方法。

 EventPollerPool::setPoolSize(threads);
	 //.....
        try {
   
   
            //rtsp服务器,端口默认554
            if (rtspPort) {
   
    rtspSrv->start<RtspSession>(rtspPort); }
            //rtsps服务器,端口默认322
            if (rtspsPort) {
   
    rtspSSLSrv->start<RtspSessionWithSSL>(rtspsPort); }

            //rtmp服务器,端口默认1935
            if (rtmpPort) {
   
    rtmpSrv->start<RtmpSession>(rtmpPort); }
            //rtmps服务器,端口默认19350
            if (rtmpsPort) {
   
    rtmpsSrv->start<RtmpSessionWithSSL>(rtmpsPort); }

            //http服务器,端口默认80
            if (httpPort) {
   
    httpSrv->
<think>我们正在处理用户关于在Linux系统中配置完ZLMediaKit后访问127.0.0.1被拒绝连接的问题。 根据引用内容,我们得知该项目使用了ZLMediaKit作为流媒体服务,因此我们需要检查ZLMediaKit服务是否正确启动以及配置是否正确。 以下步骤将帮助用户诊断和解决问题: 1. **检查ZLMediaKit服务状态**: 首先,确保ZLMediaKit服务已经成功启动。可以通过查看进程或日志来确认。 2. **检查端口监听情况**: 使用netstat或ss命令检查ZLMediaKit配置的端口(默认为80或443等)是否处于监听状态,且监听地址是否为0.0.0.0(表示监听所有接口)或127.0.0.1。 3. **检查防火墙设置**: Linux系统的防火墙可能会阻止访问。检查iptables或firewalld设置,确保目标端口是开放的。 4. **检查ZLMediaKit配置**: 查看ZLMediaKit的配置文件(通常是config.ini),确认http服务的监听端口和地址(address)设置。确保监听地址为0.0.0.0(所有接口)或127.0.0.1(本地环回)。 5. **测试本地访问**: 使用curl命令在本地尝试访问服务,例如:`curl http://127.0.0.1:端口`(如果配置了非80端口,请替换端口号)。 6. **查看错误日志**: 查看ZLMediaKit的日志文件,通常日志会记录启动状态和错误信息,帮助我们定位问题。 具体步骤如下: **步骤1:检查ZLMediaKit进程** 使用命令:`ps -ef | grep ZLMediaKit` 或 `ps -ef | grep MediaServer`(根据实际进程名)查看进程是否存在。 **步骤2:检查端口监听** 使用命令:`netstat -tunlp | grep <端口号>` 或 `ss -tunlp | grep <端口号>`,如果不知道端口号,可以先查看配置文件中的端口。 如果配置文件中未指定端口,默认HTTP端口为80(需要root权限)或8080(非root)。注意:非root用户无法使用1024以下端口。 **步骤3:检查防火墙** 如果使用的是iptables: `sudo iptables -L -n` 查看规则,确保有允许目标端口的规则。 如果使用的是firewalld: `sudo firewall-cmd --list-all` 查看开放的端口和服务。 如果需要开放端口(以8080为例): iptables: `sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT` firewalld: `sudo firewall-cmd --add-port=8080/tcp --permanent` 然后 `sudo firewall-cmd --reload` **步骤4:检查配置文件** 打开ZLMediaKit的配置文件(如位于`config.ini`),查找[http]或[api](如果是API端口)部分,确保配置类似: [http] port=80 # 或你设置的端口 # 确保address=0.0.0.0(监听所有接口)或address=127.0.0.1(只监听本地) address=0.0.0.0 注意:如果address设置为127.0.0.1,那么只能从本机访问;如果设置为0.0.0.0,则可以从任何地址访问。 **步骤5:使用curl测试** 在终端执行:`curl -v http://127.0.0.1:端口` 如果看到HTTP响应,说明服务正常;如果连接被拒绝,说明服务未监听或端口不对。 **步骤6:查看日志** 日志文件的位置通常在程序运行目录或配置文件中指定。查看日志以获取启动时的错误信息。 常见问题: - 端口被占用:检查端口是否被其他程序占用(使用`lsof -i:端口号`或`netstat -tunlp | grep 端口号`)。 - 权限不足:如果使用1024以下端口,需要root权限运行。或者改为使用1024以上的端口(如8080)并以普通用户运行。 - 配置错误:检查配置文件是否有语法错误,特别是端口和地址设置。 如果按照以上步骤仍然无法解决,可以尝试重启ZLMediaKit服务,并注意查看启动时的控制台输出。 注意:用户提到的是访问127.0.0.1被拒绝,所以我们重点关注服务是否在本地环回接口上监听。 最后,建议用户提供更多信息,例如ZLMediaKit启动日志和配置文件内容,以便进步分析。 相关问题: 1. ZLMediaKit默认的HTTP端口是什么? 2. 如何配置ZLMediaKit的HTTPS服务? 3. 如何以非root用户运行ZLMediaKit并监听80端口? </think>针对 Linux 系统中配置 ZLMediaKit 后访问 `127.0.0.1` 被拒绝连接的问题,以下是系统化的解决方案: --- ### 、检查服务启动状态 1. **确认服务进程** ```bash ps -ef | grep -i zlmediakit ``` - ✅ 正常情况:应显示 `MediaServer` 进程(如 `/usr/local/ZLMediaKit/release/linux/Debug/MediaServer -d`) - ❌ 若无进程:需手动启动 ```bash cd /usr/local/ZLMediaKit/release/linux/Debug/ ./MediaServer -d # -d 表示后台运行 ``` 2. **检查监听端口** ```bash netstat -tunlp | grep MediaServer ``` - 默认 HTTP 端口为 `80`(需 root 权限)或 `8080`(非 root)。 - 若端口未监听(无输出): - 检查端口冲突:`lsof -i:80` 或 `lsof -i:8080` - 修改端口:编辑配置文件 `config.ini` 中的 `[http]` 部分: --- ### 二、排查配置文件问题 1. **关键配置项** 编辑 `config.ini` 文件(路径通常为 `/usr/local/ZLMediaKit/release/linux/Debug/config.ini`): ```ini [http] port=80 # 确保端口未被占用 sslPort=443 # HTTPS 端口 allow_cross_domains=1 # 需启用跨域 rootPath=./www # 静态文件目录(确认路径存在) ``` 2. **验证配置** ```bash ./MediaServer -c /path/to/config.ini # 指定配置文件测试 ``` - 观察控制台输出是否报错(如配置文件语法错误)。 --- ### 三、防火墙与权限控制 1. **关闭防火墙(测试环境)** ```bash sudo systemctl stop firewalld # CentOS sudo ufw disable # Ubuntu ``` 2. **开放端口(生产环境)** ```bash sudo firewall-cmd --add-port=80/tcp --permanent # 开放 HTTP sudo firewall-cmd --reload ``` 3. **SELinux 策略** ```bash sudo setenforce 0 # 临时禁用 sudo vim /etc/selinux/config # 永久禁用:SELINUX=disabled ``` --- ### 四、诊断网络访问 1. **本地 CURL 测试** ```bash curl -v http://127.0.0.1:80 ``` - ✅ 成功:返回 HTML 或 `200 OK` - ❌ 失败:提示 `Connection refused` - 检查服务是否启动 - 检查配置文件端口是否匹配 2. **查看服务日志** ```bash tail -f /usr/local/ZLMediaKit/release/linux/Debug/logs/log.log ``` - 关键错误示例: - `bind port failed` → 端口被占用 - `cannot open ./www` → 静态文件路径错误 --- ### 五、完整解决流程 ```mermaid graph TD A[访问 127.0.0.1 被拒绝] --> B{服务进程是否存在?} B -->|否| C[启动服务 ./MediaServer -d] B -->|是| D{端口是否监听?} D -->|否| E[检查端口冲突/修改端口] D -->|是| F[检查防火墙/SELinux] F --> G[curl 测试] G -->|失败| H[检查配置文件与日志] H --> I[成功访问] ``` --- ### 常见问题总结 | 现象 | 解决方案 | |---------------------|---------------------------------| | 无进程 | 启动服务时检查路径权限(需 `chmod +x MediaServer`) | | 端口占用 | 修改 `config.ini` 端口或结束冲突进程(如 Nginx) | | 静态资源加载失败 | 确认 `rootPath` 目录存在且可读 | | HTTPS 访问失败 | 检查 SSL 证书路径配置(`[http]>sslCert/sslKey`) | > **提示**:若问题持续,尝试从源码重新编译: > ```bash > cd ZLMediaKit/ > ./build.sh -d # 编译 Debug 版本 > ``` --- **相关问题** 1. ZLMediaKit 如何配置 HTTPS 加密传输? 2. 如何将 ZLMediaKit 设置为系统服务(Systemd)实现开机自启? 3. ZLMediaKit 推流成功后客户端无法播放的可能原因有哪些? [^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值