Nginx配置信息损毁又无备份时如何恢复

欢迎访问陈同学博客原文

本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息。

问题背景

假设 /etc/nginx/site-available 下有 a.example.com.conf、b.example.com.conf 两个配置文件,用于对两个域名做代理。

当不小心拷贝了以下数据,粘贴后习惯性的敲了回车键,由于命令中包含了重定向命令 “->”,会直接覆盖文件,从而导致数据全部丢失。

下面做个简单测试,创建文件test;

执行命令 a.example.com.conf -> test

由于普通文本中带有 -> test,虽然报了命令没找到,但 -> test 还是执行了,导致 test 文件数据被清空。

[root@centos]echo hello > test

[root@centos]# a.example.com.conf -> test
-bash: a.example.com.conf: 未找到命令

恢复配置

恢复思路是看Nginx进程的内存中有没有存储配置信息,如果有那能不能dump出来。一搜还真有,文章 Dump Current Nginx Config 提供了个小脚本 dump.sh,这个脚本需要 GDB: The GNU Project Debugger 工具的支持。

yum install gdb 安装gdb之后,找到Nginx master的进程ID,然后执行下面命令即可。

# Set pid of nginx master process here
pid=339

# generate gdb commands from the process's memory mappings using awk
cat /proc/$pid/maps | awk '$6 !~ "^/" {split ($1,addrs,"-"); print "dump memory mem_" addrs[1] " 0x" addrs[1] " 0x" addrs[2] ;}END{print "quit"}' > gdb-commands

# use gdb with the -x option to dump these memory regions to mem_* files
gdb -p $pid -x gdb-commands

# look for some (any) nginx.conf text
grep worker_connections mem_*
grep server_name mem_*

/proc/$pid/maps 文件包含了当前进程内存映射区域和访问权限信息,下面是部分样例数据。

最后 grep server_name mem_* 命令输出了包含 server_name 的文件。

[root@centos]# grep server_name mem_*
匹配到二进制文件 mem_558f03f58000
匹配到二进制文件 mem_558f0416f000

下载文件之后,用 Visual Studio Code (由于是二进制文件,不要用sublime之类的打开,会是乱码)打开,全局检索一下,以我的博客为例,就能看到熟悉的配置信息了。

将配置拷贝出来恢复nginx即可。

小结

本文介绍了一种利用Nginx的内存恢复数据的方式,虽然代理层问题不像DB数据问题那样致命,但影响也非常大。因此,除了关注数据安全之外,对于配置类的信息也要做好备份和版本管理。


欢迎关注公众号 [陈一乐],一起学习,一起成长

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在nginx配置中记录rtmp流的长和流量,需要进行以下操作: 1. 在nginx配置文件中添加rtmplog模块。可以在http段或者rtmp段添加如下指令:`rtmp { log_format custom '$remote_addr - $app/$stream $time_local $bytes_sent $duration'; }`。 2. 确保nginx的日志记录功能已启用。通过在nginx配置文件中找到并确认有类似如下的指令:`access_log /var/log/nginx/access.log combined;`,确保日志记录已开启。 3. 使用自定义指令来记录rtmp流的长和流量。可以在rtmp段的server段中使用类似如下指令:`Application demo { live on; on_publish http://localhost/publish; record all; }`。 4. 在record指令中指定存储流长和流量的文件路径。可以使用类似如下指令来指定记录文件的路径:`record /path/to/recordings/$app/$name.flv meta on;`。这样会将流的长和流量记录到相应的文件中。 5. 配置日志的输出格式。可以在http段的log_format指令中添加自定义的输出格式,包含需要记录的信息。例如:`log_format combined '$remote_addr - $app/$stream $time_local $bytes_sent $duration';`。 6. 重启nginx服务,使配置生效。可以使用类似如下指令来重新启动nginx服务:`sudo systemctl restart nginx`。 通过以上步骤,你就可以在nginx的日志中记录rtmp流的长和流量了。根据你的配置,日志文件会包含源地址、应用程序、流名称、访问间、发送的字节数以及流的长等信息。可以根据需要自定义日志的输出格式,并将其记录到指定的文件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值