होस्टनाम के आधार पर डायनामिक नगनेक्स डोमेन रूट पथ?


11

मैं अपने विकास nginx / PHP सर्वर को एक मूल मास्टर / कैच-ऑल 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;
}

यह सुनिश्चित करने का कोई तरीका नहीं है कि आपका setनिर्देश पहले निष्पादित होगा root

लेकिन mapनिर्देश के साथ एक चाल है जिसका मैं उपयोग करना चाहता हूं। यह इस तथ्य पर निर्भर करता है कि mapपहले मूल्यांकन किया गया हैlocation

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

यह मज़ेदार लगता है, मैं अब नक्शे के साथ अधिक खेलने की योजना बना रहा हूं। मुझे यह भी पता नहीं था कि कॉन्फ़िगरेशन फ़ाइलों को एक रैखिक फैशन में संसाधित नहीं किया गया था।
Xeoncross

यहाँ क्या बात $mypathहै? इसका कहीं भी इस्तेमाल नहीं होता है।
kodeart

@kodeart $mypathregex के लिए परिणाम समूह है ~^(.?<mypath>+)\.frameworks\.loc$और $rootpathपूरे मानचित्र चाल के लिए परिणाम है।
फेबियो मोंटेफुस्कोलो

4

महान ड्यूकियन के जवाब के अलावा , मुझे लाइन बदलने की जरूरत थी

~^(.?<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- पैटर्न = "/ होम / www /% _"

%_Evhost.path-पैटन साधन (वाइल्डकार्ड) पूर्ण डोमेन नाम (उदाहरण के लिए। Www.example.com) का उपयोग करें। Www.example.com के लिए एक अनुरोध स्वचालित रूप से दस्तावेज़-रूट पर निर्देशित होगा /home/www/www.example.com/

अतिरिक्त साइट को जोड़ना /home/wwwपूर्ण डोमेन नाम के साथ एक और निर्देशिका बनाने के रूप में आसान है । Lighttpd config फाइल में कोई बदलाव नहीं।

अन्य वाइल्डकार्ड हैं और निर्देशिका संरचना का निर्माण करने के लिए उपयोग किया जा सकता है। वे इस प्रकार हैं

    %% =>% संकेत
    % 0 => डोमेन नाम + tld
    % 1 => tld
    % 2 => बिना tld के डोमेन नाम
    % 3 => उपडोमेन 1 नाम
    % 4 => उपडोमेन 2 नाम
    % _ => पूर्ण डोमेन नाम

विस्तार से जानकारी यहाँ है

PS: यदि आप डेबियन / ubuntu प्लेटफॉर्म पर हैं तो PHP को सक्षम करना भी आसान है। बस सक्षम 10-fastcgi.confऔर 15-fastcgi-php.conf


0

NGINX PCRE नियमित अभिव्यक्ति लाइब्रेरी का उपयोग करता है।
NGINX v0.8.25 के server_nameनिर्देश के अनुसार कैप्शन नाम दिया गया है

नियमित अभिव्यक्तियों में नामित कैप्चर चर ( 0.8.25 ) बनाते हैं जिन्हें बाद में अन्य निर्देशों में उपयोग किया जा सकता है नामांकित कोष्ठक का उपयोग करते समय, NGINX सर्वर नाम मूल्यांकन (मुझे लगता है) के दौरान स्वचालित रूप से प्रत्येक नामित कोष्ठक के लिए एक चर सेट करता है।

मैं निम्नलिखित स्निपेट का उपयोग "बाड़" डेवलपर्स के वातावरण में करता हूं। «उपयोगकर्ता» उनके उपयोगकर्ता नाम और «परियोजना» पर काम करते हैं:

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

ध्यान दें कि nginx कॉन्फ़िगरेशन घोषणात्मक है, और इस तरह, स्थैतिक समय-गणना की गई मानों और चर की तुलना में स्थैतिक घोषणाएं हमेशा तेज हो सकती हैं। नियमित अभिव्यक्ति मूल्यांकन अपेक्षाकृत महंगा है, मुझे लगता है कि इसका उपयोग भारी भार (उत्पादन) वातावरण में पार्सिमनी के साथ किया जाना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.