恢复当前站点 - 可用文件

ant*_*ifs 3 nginx

我的团队正在尝试更新nginx配置,sites-available/mysite.com当他试图突然保存它时,由于磁盘大小问题而导致文件无法保存,现在文件为空(大小为0).有没有办法根据当前的nginx conf创建一个新的配置文件?由于文件被编辑,nginx服务器还没有重新启动,因此,它仍然正常工作,我们没有最新的sites-available/mysite.com文件备份,因此我更喜欢恢复存在于内存中的当前配置.

谢谢.

Tar*_*ani 10

首先,在尝试此操作之前,请确保您的服务器上有足够的空间,并且您还需要具有sudo权限.

找到主要的nginx进程

您需要的第一件事是找到nginx的主要过程

$ ps aux | grep nginx
root      3890  0.0  0.1 124972  1424 ?        Ss   06:06   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  3891  0.0  0.3 125332  3128 ?        S    06:06   0:00 nginx: worker process
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我的主要nginx进程是3890pid.

查找内存映射 接下来,我们需要检查进程使用的内存映射

$ sudo cat /proc/3890/maps
55698ed20000-55698ee2e000 r-xp 00000000 fc:00 414469                     /usr/sbin/nginx
55698f02e000-55698f030000 r--p 0010e000 fc:00 414469                     /usr/sbin/nginx
55698f030000-55698f04c000 rw-p 00110000 fc:00 414469                     /usr/sbin/nginx
55698f04c000-55698f06c000 rw-p 00000000 00:00 0
556990d72000-556990dd5000 rw-p 00000000 00:00 0                          [heap]
7f4cfa551000-7f4cfa55c000 r-xp 00000000 fc:00 1314482                    ....
7f4d01f70000-7f4d01f71000 rw-p 00000000 00:00 0
7ffde6f5e000-7ffde6f7f000 rw-p 00000000 00:00 0                          [stack]
7ffde6f9a000-7ffde6f9c000 r--p 00000000 00:00 0                          [vvar]
7ffde6f9c000-7ffde6f9e000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Run Code Online (Sandbox Code Playgroud)

现在会有很多输出,但不要担心我们主要对该[heap]部分感兴趣.内存位于556990d72000-556990dd5000.

倾倒堆

现在你需要转储堆.确保已gdb安装.使用连接到流程

$ sudo gdb -p 3890
Run Code Online (Sandbox Code Playgroud)

你会得到一个(gdb)提示.现在在此提示符下使用我们之前提到的地址

(gdb) dump memory /tmp/nginx-memory 0x556990d72000 0x556990dd5000
Run Code Online (Sandbox Code Playgroud)

从转储中获取字符串数据

现在我们的转储可用/tmp/nginx-memory,现在我们需要从中获取字符串数据

$ sudo strings  /tmp/nginx-memory > /tmp/nginx-memory.str
Run Code Online (Sandbox Code Playgroud)

找到Nginx配置

现在你有一个内存转储.大多数配置都有一条http {线,现在你可以测试你/tmp/nginx-memory.str的相同

$ grep -A 20 "http {" /tmp/nginx-memory.str
http {
    # Basic Settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    # SSL Settings
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # Gzip Settings
    gzip on;
    gzip_disable "msie6";
--
http {
    # Basic Settings
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;
    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    # SSL Settings
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    # Logging Settings
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    # Gzip Settings
    gzip on;
    gzip_disable "msie6";
Run Code Online (Sandbox Code Playgroud)

因此,请仔细查看此文件并恢复配置并创建一个新配置

  • 谢谢这节省了我很多时间!它也感觉非常像黑客,这很有趣。 (3认同)