ดัมพ์ nginx config จากกระบวนการรันอยู่?


42

เห็นได้ชัดว่าฉันไม่ควรใช้เวลากลางคืนโดยไม่ต้องนอนหลับเพื่อพยายามแก้ไขข้อบกพร่องของแอปพลิเคชัน ฉันต้องการรีสตาร์ท nginx ของฉันและค้นพบว่าไฟล์กำหนดค่าของมันว่างเปล่า ฉันจำไม่ได้ว่าตัดทอนมัน แต่นิ้วอ้วนและความสนใจที่ลดลงอาจเป็นส่วนหนึ่งของพวกเขา

ฉันไม่มีข้อมูลสำรองของไฟล์กำหนดค่านั้น ฉันรู้ว่าฉันควรจะทำมัน

ดีสำหรับฉันปัจจุบัน nginx daemon ยังคงทำงานอยู่ มีวิธีถ่ายโอนข้อมูลการกำหนดค่าไปยังไฟล์กำหนดค่าที่จะเข้าใจในภายหลังหรือไม่

คำตอบ:


53

คุณต้องติดตั้ง gdb เพื่อถ่ายโอนข้อมูลขอบเขตหน่วยความจำของกระบวนการทำงาน

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

คุณควรได้รับเช่น "ไฟล์ไบนารี mem_086cb000 ตรงกัน" เปิดไฟล์นี้ในโปรแกรมแก้ไขค้นหาคำสั่ง config (เช่นคำสั่ง "worker_connections") คัดลอกและวาง กำไร!

อัปเดต: วิธีนี้ไม่น่าเชื่อถือทั้งหมด มันขึ้นอยู่กับสมมติฐานที่ว่ากระบวนการ nginx จะอ่านการกำหนดค่าและไม่เขียนทับ / นำพื้นที่หน่วยความจำนี้มาใช้ใหม่ในภายหลัง กระบวนการ Master nginx ทำให้เรามีโอกาสที่ดีที่สุดสำหรับที่ฉันเดา


2
ขอบคุณ แต่นี่มันง่ายเกินไปสำหรับฉัน ฉันจะเขียนไฟล์กำหนดค่าใหม่ตั้งแต่เริ่มต้น :)
Sergio Tulentsev

1
ไฟล์ mmap'd หมายถึง ope filehandle ดูวิธีกู้คืนที่ง่ายกว่า: serverfault.com/questions/45237/link-to-a-specific-inode
Jeff Ferland

@JeffFerland nginx ไม่เปิด fd สำหรับไฟล์การกำหนดค่า
kupson

ใช่แอปพลิเคชันส่วนใหญ่ไม่ได้ ... คิดว่าฉันจะแก้ไขความคิดเห็นของฉันหลังจากรวมการพูดถึง อุ่ย
Jeff Ferland

1
รู้สึกแบบนี้ไม่ยอมใครง่ายๆ! ตอนนี้ฉันเป็นแฮ็คเกอร์อย่างเป็นทางการแล้ว อ่านหน่วยความจำเพื่อค้นหาการกำหนดค่าของคุณกลับมา ขอบคุณที่อธิบาย @kupson
adriaan

12

สิ่งนี้จะไม่ช่วยในคำขอนี้ แต่อาจช่วยให้ผู้อื่นเข้าถึงที่นี่ด้วยเหตุผลเดียวกัน เวอร์ชัน nginx ที่ใหม่กว่ามีตัวเลือก -T เพื่อดัมพ์การกำหนดค่า nginx ที่อ่านจากไฟล์กำหนดค่า nginx ทั้งหมดไม่ใช่จากหน่วยความจำ:

nginx -T

สิ่งนี้มีประโยชน์ในการยืนยันว่ากำลังอ่านไฟล์กำหนดค่าเพื่อเปรียบเทียบกับเซิร์ฟเวอร์อื่นหรือค้นหาการกำหนดค่า

อีกครั้งนี้จะไม่ถ่ายโอนข้อมูลการกำหนดค่าจากกระบวนการทำงานเฉพาะสิ่งที่กระบวนการใหม่จะโหลด


2

ngx_conf_t เป็นประเภทของโครงสร้างที่ใช้สำหรับการแยกวิเคราะห์การกำหนดค่า มีอยู่ระหว่างการวิเคราะห์การกำหนดค่าและแน่นอนว่าคุณไม่สามารถเข้าถึงได้หลังจากการแยกวิเคราะห์การกำหนดค่าเสร็จสมบูรณ์


2
มัน 'ชัดเจน' ไม่สามารถเข้าถึงได้เพราะเห็นได้ชัดว่าไม่มีสิ่งอำนวยความสะดวกดังกล่าวใน nginx; โปรแกรมอื่น ๆ มีสิ่งอำนวยความสะดวกเช่นpostconf -nPostfix หรือexim -bPExim หรือ (ชื่อไม่ดี) testparm -vสำหรับ Samba และอื่น ๆ
Josip Rodin

0

วิธีที่เหมาะสมที่สุดคือการมองหาngx_conf_tstruct จากอิมเมจกระบวนการ nginx

มันถูกกำหนดไว้ที่นี่

http://trac.nginx.org/nginx/browser/nginx/trunk/src/core/ngx_conf_file.h#L166

C & gdb ของฉันแย่จังเพื่อให้คนอื่นกลับบ้านด้วยวิธีแก้ปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.