当你不小心误删或者错误操作导致nginx.conf
文件丢失,而且nginx处于在住运行的状态
,在这种情况下我们就可以在内存中获取配置文件
1.获取nginx 进程pid
执行
ps aux | grep nginx
你会得到如下输出,找到master
的pid
[root@VM-8-3-centos /]# ps aux | grep nginx
root 6958 0.0 0.0 112812 968 pts/0 R+ 09:10 0:00 grep --color=auto nginx
root 19193 0.0 0.3 109440 6360 ? Ss Jun08 0:00 nginx: master process nginx
root 22326 0.0 0.3 112200 7412 ? S 01:47 0:01 nginx: worker process
如上所示,nginx的主要进程pid为19193
2.查找内存映射
接下来我们需要检查进程正在使用哪些内存映射
sudo cat /proc/19193/maps | grep heap
[root@VM-8-3-centos /]# sudo cat /proc/19193/maps | grep heap
5581bf774000-5581bf8b7000 rw-p 00000000 00:00 0 [heap]
5581bf8b7000-5581bfa50000 rw-p 00000000 00:00 0 [heap]
可以看到有2处地方,我们只需要关注heap
部分。内存位于5581bf774000
-5581bf8b7000
和5581bf8b7000
-5581bfa50000
之间。
3.转储堆
然后需要转储堆。确保已gdb安装。使用连接到进程
sudo gdb -p 19193
你会得到一个(gdb)提示。现在在这个提示下使用我们之前记下的地址,地址前需要加0x
(gdb) dump memory /tmp/nginx-memory 0x5581bf774000 0x5581bf8b7000
4.从转储中获取字符串数据
现在我们的转储可用/tmp/nginx-memory
,现在我们需要从中获取字符串数据
sudo strings /tmp/nginx-memory > /tmp/nginx-memory.str
5.查找 Nginx 配置
现在有了内存转储。大多数配置都会有http {
一行,现在可以测试下/tmp/nginx-memory.str
grep -A 20 "http {" /tmp/nginx-memory.str
[root@VM-8-3-centos /]# grep -A 20 "http {" /tmp/nginx-memory.str
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
gzip on;
#
gzip
gzip_min_length 1k;
# gzip
1-10
gzip_comp_level 6;
#
javascript
#
mime.types
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
#
http header
Vary: Accept-Encoding
gzip_vary on;
#
自己修改下格式之类的,就OK了
6.把 /tmp/nginx-memory.str
下载到本地
放进编辑器查看,会找到之前的配置,同样也是注意下格式
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。