Bagaimana Anda memasukkan file dengan kondisional dalam Nginx vhost?


12

Pada baris di bawah ini, saya mungkin memiliki file konfigurasi khusus situs yang berisi fastcgi_params tambahan yang unik untuk situs itu. Jika file ini ada, saya ingin memuatnya.

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;
                }
        }
}

Namun, ini tidak berhasil dan kesalahan yang saya dapatkan adalah:

nginx: [emerg] "include" arahan tidak diizinkan di sini di ...

Memperbarui

Saya berpikir bahwa daripada memeriksa secara terpisah, saya bisa membiarkan menyertakan memeriksa untuk saya.

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;
        }
}

Namun, ini sepertinya tidak berhasil.


Apakah Anda menemukan solusi untuk masalah ini? Saya di kapal yang sama, dan saya bertanya-tanya bagaimana Anda melakukan ini?
jackweirdy

Maaf, saya pikir saya akhirnya menyelesaikan apa pun masalahnya dengan cara yang berbeda.
Xeoncross

Jawaban:


8

includemelakukan hal selama server mulai - variabel runtime seperti $hosttidak dapat digunakan, juga tidak dapat digunakan dalam ifkonteks, seperti yang Anda temukan.

Anda harus membagi serverblok untuk host yang berbeda. Maaf!


31

Yah, ini agak tua, tapi bagaimanapun, saya menemukan jalan keluar.

Saya memiliki pengaturan dengan vhosts yang dikonfigurasi dalam gaya ini:

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

Alih-alih memeriksa apakah file itu ada (yang tidak mungkin), saya cukup melakukan:

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

Dengan cara ini saya cukup membuat file di sites-customizations-folder, yang menurut konvensi saya, dinamai sama dengan konfigurasi utama. The *karya cukup banyak seperti jika, karena tidak pecah jika tidak ada file konfigurasi tambahan. Jika Anda suka, ini juga memungkinkan Anda untuk menambahkan beberapa konfigurasi tambahan dalam file terpisah.


5

Saya tahu ini sudah tua tetapi solusi mungkin dapat membantu seseorang mencari jawaban seperti saya.

Saya memiliki banyak arahan ulang yang perlu saya sertakan untuk host tertentu saja dan sementara includetidak diizinkan dalam ifarahan, saya akhirnya menambahkan bagian ifdalam file yang saya sertakan ...

Jadi saya punya include /etc/nginx/conf.d/redirectsdan di dalam file itu saya punya:

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

5

Saya mengambil keuntungan dari glob()perluasan pola fungsi, yang digunakan oleh nginx dalam includearahan, dan bekerja dengan baik di server Debian saya.

Dalam kasus Anda, cobalah untuk mengganti baris ini:

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

dengan yang ini:

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

itu adalah file mask yang hanya cocok dengan satu file, dan tidak akan membuat nginx mengeluh jika file tersebut tidak ada. Namun variabel tidak diperbolehkan dalam sertakan arahan, jadi Anda harus memberikan nilai tetap pada <hostname>. Kami harus membuat skrip yang menghasilkan file .conf individual (satu per vhost).

Edit

Seperti yang ditunjukkan oleh Gerald Schneider , saya menyarankan untuk tetap $hostmenggunakan penggantinya, yang tidak diperbolehkan. Saya sudah mengubah saran di atas.


1
variabelnya $hostmasih tidak akan bekerja di sini.
Gerald Schneider

Maaf, Anda benar, variabel tidak diizinkan dalam sertakan arahan. Kami menggunakan skrip python yang membuat .conf tunggal untuk setiap vhost dari daftar, tetapi kami menggunakan secara luas penyimpangan tambahan "khusus" tambahan per-vhost dari standar.
Alberto Pastore
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.