Dump nginx config từ quá trình chạy?


42

Rõ ràng, tôi không nên trải qua đêm mất ngủ khi cố gắng gỡ lỗi một ứng dụng. Tôi muốn khởi động lại nginx của mình và phát hiện ra rằng tệp cấu hình của nó trống. Tôi không nhớ đã cắt nó, nhưng những ngón tay mập và giảm sự chú ý có lẽ đã đóng vai trò của họ.

Tôi không có bản sao lưu của tập tin cấu hình đó. Tôi biết tôi nên đã làm nó.

Tốt cho tôi, hiện tại nginx daemon vẫn đang chạy. Có cách nào để chuyển cấu hình của nó sang tệp cấu hình mà nó sẽ hiểu sau này không?

Câu trả lời:


53

Bạn cần cài đặt gdb để kết xuất các vùng bộ nhớ của quá trình đang chạy.

# Set pid of nginx master process here
pid=8192

# 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_*

Bạn sẽ nhận được một cái gì đó như "Tập tin nhị phân mem_086cb000 phù hợp". Mở tệp này trong trình chỉnh sửa, tìm kiếm cấu hình (ví dụ: chỉ thị "worker_connections"), sao chép và dán. Lợi nhuận!

Cập nhật: Phương pháp này không hoàn toàn đáng tin cậy. Dựa trên giả định rằng quá trình nginx sẽ đọc cấu hình và không ghi đè / sử dụng lại vùng nhớ này sau. Tôi đoán quá trình nginx cho chúng tôi cơ hội tốt nhất cho điều đó tôi đoán.


2
Cảm ơn, nhưng điều này là quá khó đối với tôi. Tôi sẽ viết lại tập tin cấu hình từ đầu :)
Sergio Tulentsev

1
Một tập tin mmap'd ngụ ý một tập tin ope. Xem để biết cách dễ dàng hơn để khôi phục một: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx không tiếp tục mở fd cho tệp cấu hình.
kupson

Vâng, hầu hết các ứng dụng không ... nghĩ rằng tôi đã chỉnh sửa nhận xét của mình sau khi đưa vào đề cập. Úi.
Jeff Ferland

1
Cảm giác này thật khó! Bây giờ tôi chính thức là một hacker. Đọc ra bộ nhớ để tìm lại cấu hình của bạn. Cảm ơn đã giải thích @kupson
adriaan

12

Điều này sẽ không giúp ích cho yêu cầu này, nhưng có thể giúp những người khác đến đây vì lý do tương tự. Các phiên bản nginx mới hơn có tùy chọn -T để loại bỏ cấu hình nginx đọc từ tất cả các tệp cấu hình nginx , không phải từ bộ nhớ:

nginx -T

Điều này có thể hữu ích để xác nhận rằng tệp cấu hình đang được đọc, để so sánh với máy chủ khác hoặc tìm kiếm cấu hình.

Một lần nữa, điều này sẽ không kết xuất cấu hình từ quá trình đang chạy , chỉ những gì một quy trình mới sẽ tải.


2

Ngx_conf_t là một loại cấu trúc được sử dụng để phân tích cấu hình. Nó chỉ tồn tại trong quá trình phân tích cấu hình và rõ ràng bạn không thể truy cập nó sau khi phân tích cấu hình hoàn tất.


2
Đó là 'rõ ràng' không thể truy cập chỉ vì rõ ràng không có cơ sở như vậy được thực hiện trong nginx; các chương trình khác có các phương tiện như vậy, chẳng hạn như postconf -nPostfix hoặc exim -bPExim hoặc (tên xấu) testparm -vcho Samba, v.v.
Josip Rodin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.