การทำความเข้าใจตัวอธิบายไฟล์สูงสุดสำหรับ linux และ nginx และค่าที่ดีที่สุดสำหรับ worker_rlimit_nofile


10

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

  • ระบบปฏิบัติการมีขีด จำกัด ตัวอธิบายไฟล์ทั้งหมดของตัวเอง (ในระบบของฉันcat /proc/sys/fs/file-maxเอาต์พุต "100678")
  • ผู้ใช้แต่ละคนสามารถมีขีด จำกัด ของตนเองเช่นกัน (แต่ในระบบของฉันทำงานulimitเป็นผู้ใช้ส่งออก "ไม่ จำกัด " ดูการปรับปรุงที่ด้านล่างพร้อมรายละเอียดเพิ่มเติม )
  • มีไม่กี่คนที่พูดอะไรบางอย่างตามสายของสิ่งที่บุคคลนี้พูดว่า: 'Directive worker_rlimit_nofile ไม่ได้ระบุ "จำนวน" มันเป็นขีด จำกัด ของระบบปฏิบัติการ Directive worker_rlimit_nofile อนุญาตเพียงวิธีที่รวดเร็วและสกปรกเพื่อขยายขีด จำกัด นี้หากยังไม่เพียงพอ ' ดังนั้นฉันเดาว่าความหมายของมันคือ "ดีกว่า" เพื่อกำหนดขีด จำกัด สำหรับผู้ใช้ nginx OS แทนที่จะเป็น config

ฉันสามารถโยนมูลค่าของ _ ผู้ปฏิบัติงานมากกว่าจำนวนการเชื่อมต่อต่อคนงานและเรียกมันว่าวัน แต่ฉันรู้สึกว่าฉันไม่รู้จริง ๆ ว่าเกิดอะไรขึ้นที่นี่

  • ทำไมขีด จำกัด ต่อผู้ปฏิบัติงานจึงน้อยกว่าขีด จำกัด ของระบบปฏิบัติการ
  • ฉันจะรู้ได้อย่างไรว่าขีด จำกัด ของฉันตอนนี้คืออะไร?

อัพเดต : สำหรับทั้งผู้ใช้รูทและผู้ใช้ปกติ ulimit เอาต์พุต "unlimited", BUT ulimit -Hnและulimit -Snเอาต์พุตทั้ง 1024

คำตอบ:


10

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

ครั้งแรกสิ่งที่ใช้อธิบายไฟล์ของคุณคืออะไร?

  1. แต่ละการเชื่อมต่อที่ใช้งานกับลูกค้า
  2. ใช้ proxy_pass หรือไม่ ที่จะเปิดซ็อกเก็ตไปยังโฮสต์: พอร์ตจัดการคำขอเหล่านี้
  3. ใช้ proxy_pass กับพอร์ตในตัวหรือไม่ นั่นคือซ็อกเก็ตเปิดอีกอันหนึ่ง (สำหรับเจ้าของกระบวนการนั้น)
  4. ไฟล์สแตติกที่ให้บริการโดย nginx

ทำไมขีด จำกัด ต่อผู้ปฏิบัติงานจึงน้อยกว่าขีด จำกัด ของระบบปฏิบัติการ

สิ่งนี้ถูกควบคุมโดยระบบปฏิบัติการเพราะคนงานไม่ได้เป็นเพียงกระบวนการเดียวที่ทำงานบนเครื่อง หากต้องการเปลี่ยนให้กับผู้ใช้ที่ใช้งาน nginx ดูด้านล่าง มันจะแย่มากถ้าคนงานของคุณใช้ตัวอธิบายไฟล์ทั้งหมดในทุกโพรเซสไม่ต้องตั้งค่าขีด จำกัด ของคุณเพื่อให้เป็นไปได้

#/etc/sysctl.conf
#This sets the value you see when running cat  /proc/sys/fs/file-max
fs.file-max = 65536"


#/etc/security/limits.conf
#this sets the defaults for all users
* soft nofile 4096
* hard nofile 4096

#This overrides the default for user `usernamehere`
usernamehere soft nofile 10240
usernamehere hard nofile 10240

หลังจากการเปลี่ยนแปลงเหล่านั้นขีด จำกัด ของการรักษาความปลอดภัยฉันเชื่อว่าฉันยังคงมีการเพิ่ม softlimit ulimitสำหรับผู้ใช้ที่ใช้

ฉันจะรู้ได้อย่างไรว่าขีด จำกัด ของฉันตอนนี้คืออะไร?

ulimit -a จะแสดงข้อ จำกัด ทั้งหมดที่เกี่ยวข้องกับผู้ใช้ที่คุณเรียกใช้เป็น


1
ขอบคุณ - ตอนนี้ฉันได้เพิ่มขีด จำกัด ตัวอธิบายไฟล์แล้วฉันก็ขาดการเชื่อมต่อ บางทีคุณสามารถช่วยฉันได้เช่นกัน :) serverfault.com/questions/209014/…
John Bachir

1
หมายเหตุสำหรับผู้ใช้ CentOS / Fedora หากคุณเปิดใช้งาน SELinux คุณจะต้องเรียกใช้setsebool -P httpd_setrlimit 1เพื่อให้ nginx มีสิทธิ์ตั้ง rlimit
Jarrett

2

ต้องตรวจสอบแหล่งที่จะซื่อสัตย์ แต่มันค่อนข้างต่ำ

ฉันใช้worker_rlimit_nofile 15000;และไม่มีปัญหาคุณสามารถเพิ่มได้อย่างปลอดภัยแม้ว่าโอกาสที่จะหมด descriptors ไฟล์เป็นจิ๋ว

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