คุณจะรวมไฟล์ไว้ใน Nginx vhost แบบมีเงื่อนไขได้อย่างไร


12

ในบรรทัดด้านล่างฉันอาจมีไฟล์กำหนดค่าเฉพาะไซต์ที่มีfastcgi_paramsเพิ่มเติมที่ไม่ซ้ำกับไซต์นั้น หากไฟล์นี้มีอยู่ฉันต้องการโหลด

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;


                if (-f /path/www/$host/nginx.conf) {
                        include /path/www/$host/nginx.conf;
                }
        }
}

อย่างไรก็ตามสิ่งนี้ไม่ได้ผลและข้อผิดพลาดที่ฉันได้รับคือ:

nginx: [ฉุกเฉิน] "รวม" ไม่อนุญาตให้สั่งที่นี่ใน ...

ปรับปรุง

ฉันคิดว่าแทนที่จะตรวจสอบแยกฉันสามารถให้รวมถึงการตรวจสอบสำหรับฉัน

server {
        listen 80 default;
        server_name _;
        root /path/www/$host;

        # Pass PHP scripts to php-fastcgi listening on port 9000
        location ~ \.php {
                include fastcgi_params;
                fastcgi_pass 127.0.0.1:9000;

                include /path/www/$host/*.nginx;
        }
}

อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ทำงาน


คุณพบวิธีแก้ไขปัญหานี้หรือไม่? ฉันอยู่ในเรือลำเดียวกันและฉันสงสัยว่าคุณทำสิ่งนี้ได้อย่างไร
jackweirdy

ขออภัยฉันคิดว่าในที่สุดฉันก็จะแก้ไขสิ่งที่ปัญหานั้นแตกต่างไป
Xeoncross

คำตอบ:


8

includeทำสิ่งนี้ในระหว่างการเริ่มต้นเซิร์ฟเวอร์ - ตัวแปรรันไทม์อย่าง$hostไม่สามารถใช้งานได้และไม่สามารถใช้ในifบริบทได้ตามที่คุณค้นพบ

คุณจะต้องแบ่งserverบล็อกสำหรับโฮสต์ที่แตกต่างกัน ขออภัย!


31

นี่มันค่อนข้างเก่า แต่อย่างไรก็ตามฉันพบวิธีแก้ไข

ฉันมีการตั้งค่าด้วย vhosts ที่กำหนดค่าในสไตล์นี้:

/etc/nginx/sites-enabled/site.com.conf

แทนที่จะตรวจสอบว่ามีไฟล์อยู่หรือไม่ (ซึ่งเป็นไปไม่ได้) ฉันก็:

include /etc/nginx/sites-customizations/site.com.*.conf

วิธีนี้ฉันสามารถสร้างไฟล์ในsites-customizations-folder ซึ่งตามแบบแผนของฉันมีชื่อเหมือนกับการตั้งค่าหลัก การ*ทำงานคล้ายกับ if เนื่องจากไม่แตกถ้าไม่มีไฟล์การกำหนดค่าเพิ่มเติม หากคุณต้องการสิ่งนี้ยังช่วยให้คุณสามารถเพิ่มการกำหนดค่าเพิ่มเติมหลายรายการในไฟล์แยกต่างหาก


5

ฉันรู้ว่ามันเก่า แต่วิธีแก้ปัญหาอาจช่วยให้ใครบางคนมองหาคำตอบเหมือนฉัน

ฉันมีการเปลี่ยนเส้นทางหลายอย่างที่ฉันจำเป็นต้องรวมสำหรับโฮสต์ที่ระบุเท่านั้นและในขณะที่includeไม่ได้รับอนุญาตในifคำสั่งฉันสิ้นสุดการเพิ่มifภายในไฟล์ที่ฉันรวมอยู่ด้วย ...

ดังนั้นฉันมีinclude /etc/nginx/conf.d/redirectsและภายในไฟล์ที่ฉันมี:

if ($host = "www.example.com") {
    # Some conf or redirects for this site only.
}

5

ฉันใช้ประโยชน์จากการglob()ขยายรูปแบบฟังก์ชั่นซึ่งใช้โดย nginx ในincludeคำสั่งและทำงานได้ดีบนเซิร์ฟเวอร์ Debian ของฉัน

ในกรณีของคุณลองแทนที่บรรทัดนี้:

include /path/www/$host/nginx.conf;

ด้วยอันนี้:

include /path/www/<hostname>/nginx[.]conf;

มันเป็นไฟล์มาส์กที่ตรงกับไฟล์เดียวเท่านั้นและจะไม่ทำให้ nginx บ่นหากไฟล์นั้นไม่มีอยู่ <hostname>อย่างไรก็ตามตัวแปรที่ไม่ได้รับอนุญาตในการรวมคำสั่งดังนั้นคุณจะต้องจัดหาค่าคงที่ใน เราต้องสร้างสคริปต์ที่สร้างไฟล์. config แต่ละไฟล์ (หนึ่งไฟล์ต่อ vhost)

แก้ไข

ดังที่เจอรัลด์ชไนเดอร์ชี้ให้เห็นฉันแนะนำให้$hostเปลี่ยนใหม่ซึ่งไม่ได้รับอนุญาต ฉันเปลี่ยนคำแนะนำด้านบนแล้ว


1
ตัวแปร$hostยังคงไม่ทำงานที่นี่
เจอรัลด์ชไนเดอร์

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