เส้นทางรูทโดเมน nginx แบบไดนามิกตามชื่อโฮสต์หรือไม่


11

ฉันกำลังพยายามตั้งค่าเซิร์ฟเวอร์พัฒนา nginx / PHP ของฉันด้วยการกำหนดค่า vhost หลัก / catch-all vhost เพื่อให้ฉันสามารถสร้าง___.framework.locโดเมนไม่ จำกัด ได้ตามต้องการ

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

อย่างไรก็ตาม nginx ตอบกลับด้วยข้อผิดพลาด 404 สำหรับการตั้งค่านี้ ฉันรู้ว่า nginx และ PHP ทำงานได้และได้รับอนุญาตเนื่องจากการกำหนดค่าที่localhostฉันใช้งานได้ดี

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

        include /etc/nginx/php.conf;
}

ฉันควรตรวจสอบอะไรเพื่อค้นหาปัญหา นี่คือสำเนาของ php.conf ที่ทั้งคู่กำลังโหลด

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;

}

คำตอบ:



13

การกำหนดค่า Nginx ไม่ใช่โปรแกรม แต่เป็นการประกาศ เมื่อคุณใช้ config เช่นนี้:

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

ไม่มีทางที่จะให้แน่ใจว่าคุณไม่ได้สั่งจะดำเนินการก่อนsetroot

แต่มีเคล็ดลับที่mapฉันต้องการใช้ ขึ้นอยู่กับข้อเท็จจริงที่mapประเมินมาก่อนlocation

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

ดูเหมือนว่าจะสนุกฉันวางแผนที่จะเล่นมากขึ้นด้วยแผนที่ตอนนี้ ฉันยังไม่ทราบว่าไฟล์การกำหนดค่านั้นไม่ได้รับการประมวลผลในลักษณะเชิงเส้น
Xeoncross

ประเด็นของ$mypathที่นี่คืออะไร? มันไม่ได้ใช้ทุกที่
kodeart

@kodeart $mypathเป็นกลุ่มผลลัพธ์สำหรับ regex ~^(.?<mypath>+)\.frameworks\.loc$และ$rootpathเป็นผลลัพธ์สำหรับเคล็ดลับแผนที่ทั้งหมด
Fabio Montefuscolo

4

นอกจากคำตอบของ DukeLionที่ยอดเยี่ยมแล้วฉันต้องเปลี่ยนไลน์

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

ถึง

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

ในของฉัน/etc/nginx/nginx.confแฟ้มตามที่แนะนำที่นี่

เพิ่ม

root /var/www/frameworks/$rootpath

ในการ/etc/nginx/sites-available/defaultทำงานได้ดีหลังจากนั้น


0

บางทีคุณสามารถดู lighttpd ด้วย มันมีส่วนสนับสนุนในสิ่งที่คุณขออย่างแน่นอน มันเป็นโทรmod_evhost

เปิดใช้งาน evhost

เพิ่มบรรทัดต่อไปนี้ลงใน lighttpd.conf ของคุณ หากคุณกำลังใช้ Debian / Ubuntu กระจายฐานเพียงแค่การเชื่อมโยงที่อ่อนนุ่มหรือคัดลอกมาจากการ/etc/lighttpd/conf-available/10-evhost.conf/etc/lighttpd/conf-enabled/

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

%_(ตัวแทน) หมายถึง evhost.path-เสื้อใช้ชื่อโดเมนแบบเต็ม (เช่น. www.example.com) ขอ www.example.com /home/www/www.example.com/โดยอัตโนมัติจะนำเอกสารราก

การเพิ่มไซต์เพิ่มเติมนั้นง่ายเหมือนกับการสร้างไดเรกทอรีอื่นภายใต้/home/wwwชื่อโดเมนแบบเต็ม ไม่มีการเปลี่ยนแปลงไฟล์การกำหนดค่าของ Lighttpd

มีอักขระตัวแทนอื่น ๆ และสามารถใช้เพื่อสร้างโครงสร้างไดเรกทอรี พวกเขามีดังนี้

    %% =>% เครื่องหมาย
    % 0 => ชื่อโดเมน + tld
    % 1 => tld
    % 2 => ชื่อโดเมนที่ไม่มี tld
    % 3 => ชื่อโดเมนย่อย 1
    % 4 => ชื่อโดเมนย่อย 2
    % _ => ชื่อโดเมนแบบเต็ม

ข้อมูลรายละเอียดที่นี่

PS:การเปิดใช้งาน PHP นั้นง่ายหากคุณใช้แพลตฟอร์มเดเบียน / Ubuntu เพียงแค่เปิดใช้และ10-fastcgi.conf15-fastcgi-php.conf


0

NGINX ใช้ไลบรารีการแสดงออกปกติของ PCRE
ในฐานะของ NGINX v0.8.25 server_nameสั่งอนุญาตให้จับชื่อ

การจับภาพที่มีชื่อในนิพจน์ปกติจะสร้างตัวแปร ( 0.8.25 ) ที่สามารถใช้ในคำสั่งอื่น ๆ ได้ในภายหลังในขณะที่ใช้วงเล็บที่มีชื่อ NGINX จะตั้งค่าตัวแปรสำหรับวงเล็บที่มีชื่อแต่ละชื่อโดยอัตโนมัติในระหว่างการประเมินชื่อเซิร์ฟเวอร์

ฉันใช้ตัวอย่างต่อไปนี้เพื่อพัฒนาสภาพแวดล้อม "รั้ว" «ผู้ใช้»หมายถึงชื่อผู้ใช้และ« proj »โครงการที่พวกเขาทำงาน:

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

โปรดทราบว่าการกำหนดค่า nginx เป็นการประกาศและดังนั้นการประกาศแบบคงที่อาจเร็วกว่าเสมอเมื่อเปรียบเทียบกับค่าและตัวแปรที่คำนวณในขณะใช้งาน การประเมินนิพจน์ทั่วไปนั้นค่อนข้างแพงฉันคิดว่ามันต้องใช้กับ parsimony ในสภาพแวดล้อมที่มีการโหลดจำนวนมาก (การผลิต)

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