อะไรคือประเพณีที่แตกต่างกันสำหรับเว็บไซต์ที่สามารถใช้ได้กับไดเรกทอรี conf.d สำหรับ nginx


98

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

ฉันใช้ apt-get เพื่อติดตั้ง nginx และทุกอย่างดูดี

ฉันมีคำถามสองสามข้อ

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

โฟลเดอร์ที่เปิดใช้งานไซต์มีไว้เพื่ออะไร ฉันจะใช้มันได้อย่างไร

การกำหนดค่าเริ่มต้นอ้างอิงผู้ใช้ www-data หรือไม่ ฉันต้องสร้างผู้ใช้รายนั้นหรือไม่? ฉันจะให้สิทธิ์ที่ดีที่สุดแก่ผู้ใช้สำหรับการเรียกใช้ nginx ได้อย่างไร


พยายามหลีกเลี่ยงการคืบขอบเขตเมื่อถามคำถาม www-dataเป็นหัวข้อแยกต่างหาก ระบบปฏิบัติการส่วนใหญ่กำหนดผู้ใช้แยกต่างหากด้วยสิทธิ์ที่ต่ำกว่าซึ่งกระบวนการสามารถทำงานได้หลังจากผูกกับพอร์ต 80 ในฐานะรูท มันกำหนดไว้ในไฟล์ปรับแต่ง ใช้แนวทางปฏิบัติด้านความปลอดภัยขั้นพื้นฐานจากที่นั่น อย่าให้ผู้ใช้เขียนสิ่งใดก็ตามที่เว็บเซิร์ฟเวอร์ไม่จำเป็นต้องเขียนลงไปอย่าให้ผู้ใช้คนอื่นเขียนไฟล์เว้นแต่ว่าจะมีเจตนา
Andrew B

คำตอบ:


93

โฟลเดอร์ * sites- มีการจัดการโดยและnginx_ensite nginx_dissiteสำหรับผู้ใช้ Apache httpd ที่พบนี้กับการค้นหาและรายการเทียบเท่าคือ/a2ensitea2dissite

sites-availableโฟลเดอร์สำหรับการจัดเก็บทั้งหมดของการกำหนดค่า vhost ของคุณหรือไม่ว่าพวกเขากำลังเปิดใช้งานอยู่

sites-enabledโฟลเดอร์มี symlinks ไปยังไฟล์ในโฟลเดอร์เว็บไซต์ที่มีอยู่ วิธีนี้ช่วยให้คุณสามารถเลือกปิดการใช้งาน vhost ได้โดยลบ symlink

conf.dทำงานได้ แต่คุณต้องย้ายบางสิ่งออกจากโฟลเดอร์ลบหรือเปลี่ยนแปลงเมื่อคุณต้องการปิดใช้งานบางอย่าง Abstraction ของโฟลเดอร์ sites- * ทำให้การจัดระเบียบเป็นเรื่องเล็ก ๆ น้อย ๆ และช่วยให้คุณจัดการได้ด้วยสคริปต์สนับสนุนแยกต่างหาก

(นอกเสียจากว่าคุณจะชอบฉันและเป็นหนึ่งในผู้ดูแลระบบเดเบียนหลายคนที่จัดการ symlink โดยตรงโดยไม่ทราบเกี่ยวกับสคริปต์ ... )


12
ฉันทำอะไรผิดหรือเปล่า? ไม่เข้าใจการลงคะแนน
Andrew B

1
ฉันอยากรู้อยากเห็นคือสิ่งนี้สร้างขึ้นใน nginx? ฉันติดตั้งด้วยตนเองgithub.com/perusio/nginx_ensite
lfender6445

18
สิ่งสำคัญที่ควรทราบsites-available|sites-enabledคือ Debian-ism และไม่ใช่สิ่งที่ nginx หรือ Apache ทำ มันอาจจะมีประโยชน์มากในอดีต แต่ยูทิลิตี้ของมันค่อนข้าง จำกัด ในยุคของการจัดการการกำหนดค่าและคอนเทนเนอร์
Michael Hampton

คุณสามารถแสดงความคิดเห็นว่าการจัดการการกำหนดค่าและคอนเทนเนอร์ จำกัด ยูทิลิตี้ของไซต์ที่มีอยู่ | เปิดใช้งานไซต์ได้หรือไม่
karthik vee

1
@karthikvee ประเด็นก็คือเซิร์ฟเวอร์ในปัจจุบันมักจะปรากฏว่าเป็นภาชนะบรรจุแบบชั่วคราวที่ให้บริการเพียงเว็บไซต์ / บริการเดียวดังนั้นสิ่งนี้จึงรวมอยู่ในnginx.confโดยไม่สูญเสียความสามารถในการอ่าน ตรงข้ามกับวิธีการเมื่อสองสามปีก่อนเมื่อเซิร์ฟเวอร์มักจะเก็บเว็บไซต์หลายสิบเว็บไซต์
adamczi

38

ฉันต้องการที่จะเพิ่มคำตอบก่อนหน้านี้ที่สำคัญที่สุดคือไม่ว่าคุณจะเรียกไดเรกทอรีที่ (คิดว่าคือการประชุมที่มีประโยชน์มาก) nginx.confแต่สิ่งที่คุณใส่จริงใน ตัวอย่างการกำหนดค่า:

http {
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*.conf;
    include /etc/nginx/sites-enabled/my_own_conf;
...
}

สั่งเพียงใช้ที่นี่เป็นรวมจึงไม่มีความแตกต่างภายในระหว่างเช่นและconf.d/sites-enabled/

จากเอกสารข้างต้น:

Syntax:     include file | mask;
Default:    —
Context:    any

Includes another file, or files matching the specified mask, 
into configuration. Included files should consist of 
syntactically correct directives and blocks.

ดังนั้นเพื่อตอบคำถามเดิม: ไม่มีความแตกต่างภายในและคุณอาจใช้ในวิธีที่ดีที่สุดเท่าที่จะทำได้โดยจดจำคำแนะนำจากคำตอบอื่น ๆ และโปรดอย่าลืมเลือกคำตอบ 'ถูกต้อง'


1
ใช่sites-enabledถูกประดิษฐ์ขึ้นมาบ้างโดยการแบ่งส่วนบางอย่างทำให้เกิดความสับสนในระดับกลางที่น่ารำคาญ ไปคว้า nginx จากแหล่งที่มาอย่างเป็นทางการ : คุณจะได้รับผลิตภัณฑ์ที่ทันสมัยรวมถึงกำจัดการกำหนดค่าอึ / นรกนี้
Bernard Rosset

2
สิ่งนี้อธิบายว่าทำไมไม่มีการอ้างอิงแบบแผนเดียวของชื่อนี้ในเอกสารทางการของ Nginx มันเป็นโครงการของบุคคลที่สาม! github.com/perusio/nginx_ensite
AxeEffect

30

โดยทั่วไปแล้วsites-enabledโฟลเดอร์จะใช้สำหรับการกำหนดโฮสต์เสมือนในขณะที่conf.dใช้สำหรับการกำหนดค่าเซิร์ฟเวอร์ทั่วโลก หากคุณสนับสนุนเว็บไซต์หลายแห่งเช่นโฮสต์เสมือนแต่ละเว็บไซต์จะได้รับไฟล์ของตัวเองดังนั้นคุณสามารถเปิดใช้งานและปิดการใช้งานได้ง่ายมากโดยการย้ายไฟล์เข้าและออกsites-enabled(หรือการสร้างและลบ symlink ซึ่งอาจเป็นไปได้ว่า ความคิดที่ดีกว่า)

ใช้conf.dสำหรับสิ่งต่าง ๆ เช่นการโหลดโมดูลไฟล์บันทึกและสิ่งอื่น ๆ ที่ไม่เฉพาะเจาะจงกับโฮสต์เสมือนเดียว

การกำหนดค่าเริ่มต้นอ้างอิงผู้ใช้ www-data หรือไม่ ฉันต้องสร้างผู้ใช้รายนั้นหรือไม่?

คุณควรให้ nginx ทำงานในฐานะผู้ใช้ที่ไม่ใช่รูท นี่คือในบางกรณีชื่อwww-dataแต่คุณสามารถตั้งชื่อมันทุกอย่างที่คุณต้องการ

ฉันจะให้สิทธิ์ที่ดีที่สุดแก่ผู้ใช้สำหรับการเรียกใช้ nginx ได้อย่างไร

ฉันไม่ค่อยมั่นใจในคำตอบสำหรับคำถามนี้ (ฉันไม่ได้ใช้งาน nginx ในตอนนี้) แต่ถ้ามันเป็นอะไรอย่าง Apache คำตอบก็คือwww-dataผู้ใช้ต้องการเพียงสิทธิ์ในการอ่านไฟล์สแตติก (และอ่าน + ดำเนินการในไดเรกทอรี) ) ที่คุณกำลังให้บริการหรืออ่าน / ดำเนินการอนุญาตในสิ่งต่าง ๆ เช่นสคริปต์ CGI และไม่มีสิทธิ์อื่นใด


1
การมีผู้ใช้เฉพาะสำหรับการเรียกใช้เว็บเซิร์ฟเวอร์ก็เป็นสิ่งสำคัญเช่นกันเนื่องจากการปิดใช้งานความสามารถในการเข้าสู่ระบบสำหรับผู้ใช้รายนี้โดยการลบบันทึกเชลล์ที่ถูกต้อง
DukeLion

> 'คุณควรให้ nginx ทำงานเป็นผู้ใช้ที่ไม่ใช่รูท' - คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ไหม?
lfender6445

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

14

เกิดอะไรขึ้น?

คุณต้องใช้ Debian หรืออูบุนตูตั้งแต่ชั่วร้าย sites-available / sites-enabledตรรกะไม่ได้ถูกใช้โดยบรรจุภัณฑ์ต้นน้ำของ Nginxจากhttp://nginx.org/packages/

ในทั้งสองกรณีทั้งสองจะถูกนำมาใช้เป็นที่ประชุมกำหนดค่าด้วยความช่วยเหลือของมาตรฐานสั่งในinclude/etc/nginx/nginx.conf

นี่เป็นตัวอย่างข้อมูล/etc/nginx/nginx.confจากแพ็คเกจต้นน้ำอย่างเป็นทางการของ nginx จาก nginx.org:

http {
    …
    include /etc/nginx/conf.d/*.conf;
}

นี่เป็นตัวอย่างข้อมูล/etc/nginx/nginx.confจาก Debian / Ubuntu :

http {
    …
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

ดังนั้นจากมุมมองของ NGINX ที่แตกต่างกันเท่านั้นที่จะเป็นไปได้ว่าไฟล์จากconf.dได้รับการประมวลผลเร็วและเป็นเช่นถ้าคุณมีการกำหนดค่าที่เงียบขัดแย้งกับแต่ละอื่น ๆ แล้วผู้ที่มาจากอาจจะมีความสำคัญมากกว่าผู้ที่อยู่ในconf.dsites-enabled


conf.dปฏิบัติที่ดีที่สุดคือ

คุณควรใช้/etc/nginx/conf.dเนื่องจากเป็นแบบแผนมาตรฐานและควรทำงานได้ทุกที่

หากคุณต้องการปิดการใช้งานเว็บไซต์เพียงแค่เปลี่ยนชื่อไฟล์ให้ไม่มี.confส่วนต่อท้ายง่ายตรงไปตรงมาและป้องกันข้อผิดพลาด:

sudo mv -i /etc/nginx/conf.d/default.conf{,.off}

หรือตรงกันข้ามเพื่อเปิดใช้งานไซต์:

sudo mv -i /etc/nginx/conf.d/example.com.conf{.disabled,}


หลีกเลี่ยงsites-available& sites-enabledค่าใช้จ่ายทั้งหมด

ฉันเห็นว่าไม่มีเหตุผลที่จะใช้sites-available/ sites-enabled:

  • บางคนได้กล่าวถึงnginx_ensiteและnginx_dissiteสคริปต์ - ชื่อของสคริปต์เหล่านี้เลวร้ายยิ่งกว่าส่วนที่เหลือของความล้มเหลวนี้ - แต่สคริปต์เหล่านี้ก็ไม่มีที่จะพบ - พวกเขากำลังขาดจากnginxแพคเกจแม้ใน Debian (และอาจเป็นใน Ubuntu) และไม่ปรากฏอยู่ในแพ็คเกจของพวกเขาเองรวมทั้งคุณต้องการสคริปต์ของบุคคลที่สามที่ไม่ได้มาตรฐานทั้งหมดเพื่อย้ายและ / หรือเชื่อมโยงไฟล์ระหว่างสองไดเรกทอรีหรือไม่!

  • และหากคุณไม่ได้ใช้สคริปต์ (ซึ่งอันที่จริงแล้วเป็นตัวเลือกที่ฉลาดตามข้างบน) แล้วคุณจะจัดการกับปัญหาได้อย่างไร:

    • คุณสร้างลิงก์สัญลักษณ์จากsites-availableถึงsites-enabledหรือไม่
    • คัดลอกไฟล์หรือไม่
    • ย้ายไฟล์หรือไม่
    • แก้ไขไฟล์ที่อยู่ในsites-enabled?

ด้านบนอาจดูเหมือนว่ามีปัญหาเล็กน้อยที่จะแก้ไขจนกระทั่งหลายคนเริ่มจัดการระบบหรือจนกว่าคุณจะตัดสินใจได้อย่างรวดเร็วเพียงลืมเรื่องนี้ไปหลายเดือนหรือหลายปี ...

ซึ่งนำเราไปยัง:

  • จะปลอดภัยที่จะลบไฟล์จากsites-enabled? มันเป็นลิงค์อ่อนหรือไม่? ลิงค์ยาก? หรือเฉพาะการกำหนดค่าเท่านั้น ตัวอย่างสำคัญของการกำหนดค่านรก

  • ไซต์ใดถูกปิดใช้งาน (ด้วยconf.d, เพียงแค่ทำการค้นหาไฟล์ที่ไม่ลงท้ายด้วย.conf- find /etc/nginx/conf.d -not -name "*.conf"หรือใช้grep -v.)

ไม่เพียง แต่ทั้งหมดข้างต้น แต่ยังทราบเฉพาะincludeคำสั่งที่ใช้โดย Debian / Ubuntu - /etc/nginx/sites-enabled/*- ไม่มีคำต่อท้ายชื่อไฟล์ที่ระบุไว้สำหรับแตกต่างสำหรับsites-enabledconf.d

  • สิ่งนี้หมายความว่าถ้าวันหนึ่งคุณตัดสินใจที่จะแก้ไขไฟล์หนึ่งหรือสองไฟล์อย่างรวดเร็ว/etc/nginx/sites-enabledและคุณemacsสร้างไฟล์สำรองอย่างdefault~ทันทีทันใดคุณมีทั้งสองอย่างdefaultและdefault~รวมเป็นการตั้งค่าที่ใช้งานซึ่งขึ้นอยู่กับคำสั่งที่ใช้ คำเตือนใด ๆ และทำให้เซสชันการดีบักเป็นเวลานานขึ้น (ใช่มันเกิดขึ้นกับฉันมันเป็นช่วงแฮ็คฮ็อตและฉันงงเลยว่าทำไมความลับของฉันถึงไม่ทำงาน)

ดังนั้นฉันมั่นใจว่าsites-enabledเป็นความชั่วร้ายที่บริสุทธิ์!


นอกเหนือจากที่กล่าวมาทั้งหมดมันเป็นเรื่องธรรมดามากที่จะสร้าง symlink ที่ไม่ถูกต้อง! stackoverflow.com/a/14107803/1122270 ในกรณีที่คุณคิดว่าไม่ดีsites-enabledพอ!
cnst

หรือบางครั้งมันอาจเกิดขึ้นเมื่อมีคนตัดสินใจที่จะแก้ไขไฟล์ในsites-enabledแต่แล้วคนอื่นตัดสินใจที่จะปิดการใช้งานโดยการลบมันอาจจะคิดว่ามันเป็นเพียง symlink ที่ต้องใช้หน่วยความจำที่ตามมาstackoverflow.com/q/45852224/1122270
cnst

ฉันต้องไม่เห็นด้วยกับการยืนยันเกี่ยวกับsites-availableและsites-enabled; เป็นสิ่งสำคัญที่จะต้องสามารถเตรียมไฟล์กำหนดค่าภายนอกไดเรกทอรีการรับส่งข้อมูล 'สด' เช่นถ้า nginx ถูกโหลดใหม่หรือรีสตาร์ทว่าจะไม่รับไฟล์ปรับแต่งบางส่วน นอกจากนี้ยังมีประโยชน์ในการเก็บไฟล์กำหนดค่าที่ไม่ได้ใช้งานอีกต่อไป การสร้าง symlink ไม่ใช่เรื่องยากโดยเฉพาะถ้าคุณมีประสบการณ์เพียงพอในการจัดการ nginx ตั้งแต่แรก IMO
BE77Y

@ BE77Y คุณใช้แนวทางที่ซับซ้อนกว่านี้ ในการเขียนโปรแกรมถือว่าเป็นแนวปฏิบัติที่ดีที่สุดในการลบรหัสที่ไม่ได้ใช้อย่างสมบูรณ์ไม่ใช่แค่ปิดใช้งานหรือแสดงความคิดเห็น ฉันไม่เห็นเหตุผลว่าทำไม DevOps ควรจะแตกต่างกัน - ถ้าไม่ต้องการตั้งค่าอีกต่อไปให้ลบออก (ควรจะยังคงอยู่ใน VCS ของคุณ) เช่นเดียวกับไฟล์ conf บางส่วน - ทำไมคุณเปิดใช้งานการแก้ไขและให้โหลด nginx ไว้ด้านหลัง? ( USR1ซึ่งเปิดบันทึกใหม่ไม่ได้โหลดใหม่อีกครั้ง) ฉันพบความคิดเห็น symlink ของคุณ "ประสบการณ์" ในทางที่ผิด - ปัญหานี้เป็นเรื่องของความมั่นคงซึ่งมีส่วนเกี่ยวข้องกับประสบการณ์เพียงเล็กน้อย
cnst

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