Đường dẫn gốc tên miền nginx động dựa trên tên máy chủ?


11

Tôi đang cố gắng thiết lập máy chủ nginx / PHP phát triển của mình với cấu hình vhost master / Catch-all cơ bản để tôi có thể tạo ___.framework.loccác miền không giới hạn khi cần.

server {
        listen 80;
        index index.html index.htm index.php;

        # Test 1
        server_name ~^(.+)\.frameworks\.loc$;
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;

        include /etc/nginx/php.conf;
}

Tuy nhiên, nginx phản hồi với lỗi 404 cho thiết lập này. Tôi biết nginx và PHP đang hoạt động và được phép vì localhostcấu hình tôi đang sử dụng hoạt động tốt.

server {
        listen 80 default;
        server_name localhost;
        root /var/www/localhost;
        index index.html index.htm index.php;

        include /etc/nginx/php.conf;
}

Tôi nên kiểm tra những gì để tìm ra vấn đề? Đây là một bản sao của php.conf mà cả hai đang tải.

location / {
        try_files $uri $uri/ /index.php$is_args$args;
}

location ~ \.php$ {

        try_files $uri =404;

        include fastcgi_params;
        fastcgi_index index.php;

        # Keep these parameters for compatibility with old PHP scripts using them.
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # Some default config
        fastcgi_connect_timeout        20;
        fastcgi_send_timeout          180;
        fastcgi_read_timeout          180;
        fastcgi_buffer_size          128k;
        fastcgi_buffers            4 256k;
        fastcgi_busy_buffers_size    256k;
        fastcgi_temp_file_write_size 256k;
        fastcgi_intercept_errors    on;
        fastcgi_ignore_client_abort off;
        fastcgi_pass 127.0.0.1:9000;

}

Câu trả lời:


12

Tại sao không chỉ sử dụng:

server_name *.frameworks.loc;
root /var/www/frameworks/$http_host/public;

Đây chỉ là những gì tôi đang tìm kiếm!
Xeoncross

13

Nginx config không phải là một chương trình, nó là một tuyên bố. Khi bạn đang sử dụng cấu hình như thế này:

server {
        server_name ~^(.+)\.frameworks\.loc$;
        ...
        set $file_path $1;
        root    /var/www/frameworks/$file_path/public;
}

Không có cách nào để đảm bảo rằng lệnh của bạn setsẽ thực hiện trước đó root.

Nhưng có một mẹo với mapchỉ thị tôi muốn sử dụng. Nó dựa trên thực tế mapđược đánh giá trướclocation

http {
  map $http_host $rootpath {
    ~^(.?<mypath>+)\.frameworks\.loc$  $mypath;
    default                            /      ;
  }
  ....
  root /var/www/frameworks/$rootpath
}

Điều này có vẻ vui, tôi dự định chơi nhiều hơn với bản đồ bây giờ. Tôi cũng không biết rằng các tệp cấu hình không được xử lý theo kiểu tuyến tính.
Xeoncross

Điểm của $mypathđây là gì? Nó không được sử dụng ở bất cứ đâu.
kodeart

@kodeart $mypathlà nhóm kết quả cho regex ~^(.?<mypath>+)\.frameworks\.loc$$rootpathlà kết quả cho toàn bộ thủ thuật bản đồ.
Fabio Montefuscolo

4

Ngoài câu trả lời tuyệt vời của DukeLion , tôi cần thay đổi dòng

~^(.?<mypath>+)\.frameworks\.loc$ $mypath;

đến

~^(?P<mypath>.+)\.frameworks\.loc$ $mypath;

trong /etc/nginx/nginx.conftập tin của tôi như đề nghị ở đây .

Thêm

root /var/www/frameworks/$rootpath

trong /etc/nginx/sites-available/defaulthoạt động tốt sau đó.


0

Có lẽ bạn cũng có thể nhìn vào lighttpd. Nó đã được xây dựng để hỗ trợ cho chính xác những gì bạn đang yêu cầu ở đây. Đó là cuộc gọi mod_evhost .

Kích hoạt evhost

Thêm các dòng sau vào lighttpd.conf của bạn. Nếu bạn đang sử dụng phân phối cơ sở Debian / Ubuntu, chỉ cần liên kết mềm hoặc sao chép từ /etc/lighttpd/conf-available/10-evhost.confsang /etc/lighttpd/conf-enabled/.

    # http://redmine.lighttpd.net/wiki/1/Docs:ModEVhost
    server.modules + = ("mod_evhost")
    evhost.path-pattern = "/ home / www /% _"

Các %_(wildcard) trong phương tiện evhost.path-Patten sử dụng tên miền đầy đủ (ví dụ. Www.example.com). Một yêu cầu cho www.example.com sẽ tự động chuyển trực tiếp đến tài liệu gốc /home/www/www.example.com/.

Thêm trang web bổ sung cũng dễ như tạo một thư mục khác /home/wwwvới tên miền đầy đủ. Không thay đổi tập tin cấu hình Lighttpd.

Có các ký tự đại diện khác và có thể được sử dụng để xây dựng cấu trúc thư mục. Họ là như sau

    %% =>% ký
    % 0 => tên miền + tld
    % 1 => tld
    % 2 => tên miền không có tld
    % 3 => tên miền phụ 1 tên
    % 4 => tên miền phụ 2 tên
    % _ => tên miền đầy đủ

Thông tin chi tiết có tại đây .

PS: Kích hoạt PHP cũng dễ dàng nếu bạn đang sử dụng nền tảng debian / ubfox. Chỉ cần kích hoạt 10-fastcgi.conf15-fastcgi-php.conf.


0

NGINX sử dụng thư viện biểu thức chính quy PCRE.
Kể từ server_namechỉ thị NGINX v0.8.25 cho phép chụp có tên .

Các ảnh chụp được đặt tên trong các biểu thức chính quy tạo ra các biến ( 0.8.25 ) mà sau này có thể được sử dụng trong các chỉ thị khác Trong khi sử dụng dấu ngoặc đơn có tên, NGINX tự động đặt một biến cho mỗi dấu ngoặc đơn có tên, trong quá trình đánh giá tên máy chủ (tôi đoán).

Tôi sử dụng đoạn mã sau để "rào cản" môi trường của nhà phát triển. «Người dùng» đề cập đến tên người dùng của họ và «proj» dự án họ làm việc:

# ...
server_name ~^(?<user>[^.]+)\.(?<proj>[^.]+).dev.local-server.com;
root /home/$user/www/$proj;
# ...

Lưu ý rằng cấu hình nginx là khai báo và do đó, khai báo tĩnh có thể luôn nhanh hơn so với các giá trị và biến được tính toán trong thời gian chạy. Đánh giá biểu thức thông thường là tương đối tốn kém, tôi đoán nó phải được sử dụng với phân tích cú pháp trong môi trường (sản xuất) tải nặng.

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.