Konfigurace nginx - volitelné subdomény rubrika: Administrace: Hardware

10 fprochazka
položil/-a 11.5.2012
 
upravil/-a 11.5.2012

Zdravím, mám následující konfiguraci nginxe

server {
        listen          80;
        server_name     ~^(.*?\.)?(?<domain>[^.]+\.[^.]+)$;
        index           index.php index.html;
 
        root            /var/www/hosts/$domain;
        try_files       $uri $uri/ /index.php;
 
        location ~ \.php$ { # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            include        fastcgi_params;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }

Správně, automatické domény, stačí vytvořit složku /var/www/hosts/example.com/ a všechny example.com i *.example.com se na ní budou směřovat. Tohle funguje bezvadně.

Teď ale potřebuji, aby když existuje složka /var/www/hosts/abc.example.com/, aby doména abc.example.com směřovala na ni, ale všechno ostatní na /var/www/hosts/example.com/.

Skončil jsem u tohohle, chová se předvídatelně a statické soubory servíruje správně, až na to, že nejedou PHP scripty.

server {
        listen          80;
        server_name     ~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$;
        index           index.php index.html;
 
        location / {
                root            /var/www/hosts/$second.$domain;
                try_files       $uri $uri/ /index.php @fallback;
        }
 
        location @fallback {
                root            /var/www/hosts/$domain;
                try_files       $uri $uri/ /index.php;
        }
 
        location ~ \.php$ { # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
            include        fastcgi_params;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }

access.log na požadavky example.com, www.example.com, abc.example.com

127.0.0.1 - - [11/May/2012:12:34:48 +0200] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"
127.0.0.1 - - [11/May/2012:12:34:49 +0200] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"
127.0.0.1 - - [11/May/2012:12:34:51 +0200] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"

v pohodě vrátí statické soubory, error.log prázdný. Vyměním index.html za index.php a pošlu požadavek

127.0.0.1 - - [11/May/2012:12:35:54 +0200] "GET / HTTP/1.1" 404 27 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"
127.0.0.1 - - [11/May/2012:12:35:55 +0200] "GET / HTTP/1.1" 404 27 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.83 Safari/535.11"

Když si zapnu debug logování, tak mě zaujmou tyhle řádky

2012/05/11 13:18:42 [debug] 29519#0: *60 http script copy: "SCRIPT_FILENAME"
2012/05/11 13:18:42 [debug] 29519#0: *60 http script var: "/usr/local/nginx/html"
2012/05/11 13:18:42 [debug] 29519#0: *60 http script var: "/index.php"
2012/05/11 13:18:42 [debug] 29519#0: *60 fastcgi param: "SCRIPT_FILENAME: /usr/local/nginx/html/index.php"
2012/05/11 13:18:42 [debug] 29519#0: *60 fastcgi param: "HTTP_USER_AGENT: curl/7.21.3 (x86_64-pc-linux-gnu) libcurl/7.21.3 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.18"
2012/05/11 13:18:42 [debug] 29519#0: *60 fastcgi param: "HTTP_HOST: xxxxx.example.com"

Díky za jakékoliv postrčení.

odkaz
10 fprochazka
odpověděl/-a 11.5.2012
 
upravil/-a 17.5.2012

Já si teda odpovím sám :)

server {
        listen          80;
        server_name     ~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$;
        index           index.php index.html;
 
        location / {
                set             $try_dir $domain;
                if (-d /var/www/hosts/$second.$domain) {
                        set     $try_dir $second.$domain;
                }
 
                root            /var/www/hosts/$try_dir;
                try_files       $uri $uri/ /index.php;
        }
 
        keepalive_timeout  0;
        send_timeout    9999999;
        fastcgi_read_timeout    999999;
        client_max_body_size    200M;  
 
        location ~ \.php$ { # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
                set             $try_dir $domain;
                if (-d /var/www/hosts/$second.$domain) {
                        set     $try_dir $second.$domain;
                }
 
                root            /var/www/hosts/$try_dir;
                include         fastcgi_params; 
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.php;
 
                fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
                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;
 
                try_files $uri $uri/ =404;
        }
 
 
        #location ~ \.(js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ { }
        location ~ /\.ht { # deny access to .htaccess files, if Apache's document root concurs with nginx's one
            deny  all;
        }
 
        location = /robots.txt  { access_log off; log_not_found off; }
        location = /favicon.ico { access_log off; log_not_found off; }
    }

Komentáře

  • Anonym : To se bude hodit. :-) Ještě jsem pátral po něčem jako je u apache suexec/mpm-itk, čím by se dal skript spustit pod konkrétním uživatelem. Nevíš o něčem? 11.5.2012
  • fprochazka : Ještě tam byla chybka, ale už to funguje bezvadně. Kdyby někdo věděl, jak to napsat bez ifů, bylo by to ještě víc cool ;) 16.5.2012
  • Filip Halaxa : @Fanda: PHP-FPM. Je to manažer php fastcgi procesů. Umí i dynamicky spouštět procesy při větší zátěži. Dá se mu nastavit uživatel, skupina i úprava php.ini pro každý vitruální server (tzv. pool). 19.5.2012

Pro zobrazení všech 2 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.