Làm thế nào để bạn có điều kiện bao gồm các tập tin trong Nginx vhost?


12

Trong các dòng bên dưới, tôi có thể có tệp cấu hình dành riêng cho trang web có chứa fastcgi_params bổ sung duy nhất cho trang web đó. Nếu tập tin này tồn tại tôi muốn tải nó.

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

Tuy nhiên, điều này không hoạt động và lỗi tôi nhận được là:

nginx: [nổi lên] "bao gồm" chỉ thị không được phép ở đây trong ...

Cập nhật

Tôi nghĩ rằng thay vì kiểm tra riêng rẽ, tôi có thể bao gồm kiểm tra cho tôi.

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

Tuy nhiên, điều này dường như không hoạt động.


Bạn đã tìm thấy một giải pháp cho vấn đề này? Tôi đang ở trong cùng một chiếc thuyền, và tôi tự hỏi làm thế nào bạn làm điều này?
kỳ lạ

Xin lỗi, tôi nghĩ rằng cuối cùng tôi đã giải quyết bất cứ vấn đề gì là một cách khác.
Xeoncross

Câu trả lời:


8

includethực hiện điều đó trong khi máy chủ khởi động - các biến thời gian chạy như $hostkhông thể được sử dụng, cũng như không thể sử dụng nó trong ifngữ cảnh, như bạn đã tìm ra.

Bạn cần tách các serverkhối cho các máy chủ khác nhau. Lấy làm tiếc!


31

Chà, cái này khá cũ, nhưng dù sao, tôi đã tìm thấy một cách giải quyết.

Tôi có một thiết lập với vhost được cấu hình theo phong cách này:

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

Thay vì kiểm tra xem tập tin có tồn tại (không thể thực hiện được), tôi chỉ cần làm:

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

Bằng cách này, tôi có thể chỉ cần tạo một tệp trong sites-customizations-folder, theo quy ước của tôi, được đặt tên giống như cấu hình chính. Các *hoạt động khá giống như nếu, vì nó không bị hỏng nếu không có tệp cấu hình bổ sung. Nếu bạn thích, điều này cũng cho phép bạn thêm nhiều cấu hình bổ sung trong các tệp riêng biệt.


5

Tôi biết điều này đã cũ nhưng giải pháp có thể giúp ai đó tìm kiếm câu trả lời như tôi đã làm.

Tôi đã có một loạt các chuyển hướng mà tôi cần bao gồm chỉ cho một máy chủ lưu trữ cụ thể và trong khi includekhông được phép trong ifchỉ thị, cuối cùng tôi đã thêm vào ifbên trong tệp mà tôi đang đưa vào ...

Vì vậy, tôi có một include /etc/nginx/conf.d/redirectsvà bên trong tập tin đó tôi có:

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

5

Tôi tận dụng việc glob()mở rộng mẫu chức năng, được nginx sử dụng trong includechỉ thị và hoạt động tốt trên các máy chủ Debian của tôi.

Trong trường hợp của bạn, hãy thử thay thế dòng này:

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

với cái này

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

đó là mặt nạ tệp chỉ khớp với một tệp và sẽ không khiến nginx phàn nàn nếu tệp không tồn tại. Tuy nhiên, các biến không được phép bao gồm các chỉ thị, vì vậy bạn phải cung cấp một giá trị cố định trong <hostname>. Chúng tôi đã phải tạo một tập lệnh tạo các tệp .conf riêng lẻ (một cho mỗi vhost).

Biên tập

Như Gerald Schneider đã chỉ ra, tôi đã đề nghị tiếp tục $hostthay thế, điều không được phép. Tôi đã thay đổi đề xuất ở trên.


1
biến $hostvẫn không hoạt động ở đây.
Gerald Schneider

Xin lỗi, bạn đã đúng, các biến không được phép bao gồm các chỉ thị. Chúng tôi sử dụng một tập lệnh python tạo một .conf duy nhất cho mỗi vhost trong danh sách, nhưng chúng tôi sử dụng rộng rãi các độ lệch per-vhost bổ sung "tùy chỉnh" so với tiêu chuẩn.
Alberto Pastore
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.