Nette a nginx – jak na routování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Tomáš Votruba
Moderator | 1114
+
+1
-

Nedaří se mi rozjet routování pod nginx.

Četl jsem Honzův návod, přidal jsem direktivu try_files zmíněnou v dokumentaci, ale bez úspěchu.

Máte s ním někdo zkušenosti?

Milo
Nette Core | 1283
+
0
-

Používám

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

location ~ /\. {
	access_log off;
	log_not_found off;
	deny all;
}

location ~ \.php$ {
	try_files $uri =404;

	fastcgi_split_path_info ^(.+\.php)(/.+)$;

	fastcgi_pass unix:/var/run/php5-fpm.sock;
	fastcgi_index index.php;

	include fastcgi_params;
}
David Kudera
Člen | 455
+
0
-

Na linuxu mi to funguje takhle:

server {
    listen 80;

    server_name website.cz;
    root /var/www/website/www;
    index index.php;

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

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location ~/\.ht {
        deny all;
    }
}

Editoval sakren (27. 4. 2014 20:52)

Tomáš Votruba
Moderator | 1114
+
0
-

Nějak jsem to spojil a jede. Paráda. Děkuji oběma :)

Filip Procházka
Moderator | 4668
+
+1
-

Lépe takto, hlavně ten blok pro phpko je důležitý mít tak jak ho mám já, je tam nějakej fígl s bezpečností, už se nepamatuju, přišel na to Honza Tvrdík a je to i kdesi v dokumentaci kdyby tě to zajímalo.

server {
        listen          80;
        server_name     ~^(:?(?<second>.+)\.)?(?<domain>[^.]+\.[^.]+)$;
        index           index.php index.html;

        set             $try_dir $domain;
        if (-d /var/www/hosts/$second.$domain) {
                set     $try_dir $second.$domain;
        }
        root            /var/www/hosts/$try_dir;

        access_log      /var/log/nginx/access.$try_dir.log;
        error_log       /var/log/nginx/error.log;

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

        sendfile on;
        send_timeout 1024s;

        location ~ [^/]\.php(/|$) {
                fastcgi_split_path_info ^(.+?\.php)(/.*)$;

                include         fastcgi_params;
                fastcgi_pass    127.0.0.1:9000;
                fastcgi_index   index.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 =404;
        }

        location ~ /\.(ht|gitignore) { # deny access to .htaccess files, if Apache's document root concurs with nginx's one
            deny all;
        }

        location ~ \.(neon|ini|log|yml)$ { # deny access to configuration files
            deny all;
        }

        location = /robots.txt  { access_log off; log_not_found off; }
        location = /favicon.ico { access_log off; log_not_found off; }
    }

Btw, díky tomu reguláru v server name mám dynamické virtualhosty.

# prvně se hledá subdoména
www.kdyby.org -> /var/www/hosts/www.kdyby.org

# když neexistuje tak bez subdomény
www.kdyby.org -> /var/www/hosts/kdyby.org

# a tohle se chová předvídatelně
kdyby.org -> /var/www/hosts/kdyby.org

Díky tomu se mi defaultně všechny subdomény směrují na kdyby.org složku, ale když subdoména existuje, ta se pustí tato aplikace. Potom stačí jenom dělat symlinky z projektů do www/hosts podle libosti :)

Komu by se chtělo psát 100 vhostů, když může mít jeden ;)

one-two
Člen | 80
+
0
-

přesně tohle jsem řešil před 14ti dnama, nešlo by to někam připíchnout nebo hodit na planette?

Tomáš Votruba
Moderator | 1114
+
+1
-

Řešení pro localhost + vhosts

Nápomocný může být tento článek

1. Do virtual host

$ sudo nano /etc/vhosts

přidáme

127.0.0.1	techambition.local

2. Upravíme nginx default

$ sudo nano /etc/nginx/sites-available/default

Filipem zmíněným nastavením a změníme:

server_name     ~(:?(?<second>.+)\.)?(?<domain>[^\.]*)\.(?<tld>[^\.]*)$;

set			$try_dir $domain;
if (-d /var/www/hosts/$second.$domain) {
			set	$try_dir $second.$domain;
}
root		/var/www/hosts/$try_dir/www;

a je to.

# subdoména
www.techambition.local -> /var/www/hosts/www.techambition/www/

# když neexistuje tak bez subdomény
www.techambition.local -> /var/www/hosts/techambition/www/

# toto se chová předvídatelně
techambition.local -> /var/www/hosts/techambition/www/

Při přidání dalších lokálních domén stačí pouze přidat řádek do /etc/vhosts.

Editoval Tomáš Votruba (2. 6. 2014 14:58)

zimmi
Člen | 94
+
0
-

Ahoj kucí,
už dvě hodiny to zprovozňuju, a stále neúspěšně. Používám konfiguraci od @Filip Procházka, ale ve Firefoxu pořád dostávám Chyba spojení.

Nemáte někdo nějaký nápad, jak to debugovat? Logy mám prázdné i při nastavení na úroveň debug (jako by ten request prostě nedoběhl ani k nginxu).

v etc/hosts mám nastavenou smyčku na localhost, nginx nepadá na konfiguraci ani php5-fpm nehlásí žádnou chybu. Jakýkoliv nápad vítán.

Jan Tvrdík
Nette guru | 2595
+
0
-

Jsi si jist, že nginx vůbec běží? Jinak zkus Start menu → zobrazit protokoly událostí

norbe
Backer | 405
+
0
-

Neběží ti to náhodou na portu 8080 místo 80?

zimmi
Člen | 94
+
0
-

@JanTvrdík linux, běží
@norbe mám ho puštěný na 8000, testování i s 80, pořád to samé.

Nicméně pomohl reinstal, už jsem aspoň na 502 bad gateway.

Dostal jsem se ke 404 s Filipovým nastavením, nicméně dál už nevím kudy. Struktura projektu je výchozí dle sandboxu.

Přikládám debugovací log:

2014/08/11 13:23:50 [debug] 15062#0: *1 http process request header line
2014/08/11 13:23:50 [debug] 15062#0: *1 http regex set $domain to "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http regex set $second to ""
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Host: app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0 FirePHP/0.7.4"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Accept-Language: cs,en-us;q=0.7,en;q=0.3"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Accept-Encoding: gzip, deflate"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "DNT: 1"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Cookie: PHPSESSID=fg1s1l4n20f6ob9pt69rss1tb5; nette-browser=wwycvb7crx"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "X-FireLogger: 1.3"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "x-insight: activate"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Connection: keep-alive"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header: "Cache-Control: max-age=0"
2014/08/11 13:23:50 [debug] 15062#0: *1 http header done
2014/08/11 13:23:50 [debug] 15062#0: *1 event timer del: 12: 1407756290419
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 0
2014/08/11 13:23:50 [debug] 15062#0: *1 rewrite phase: 1
2014/08/11 13:23:50 [debug] 15062#0: *1 http script complex value
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script set $try_dir
2014/08/11 13:23:50 [debug] 15062#0: *1 http script complex value
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "/home/michal/www/"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: ""
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "."
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "NUL"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script file op 0000000000000002 "/home/michal/www/.app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script file op false
2014/08/11 13:23:50 [debug] 15062#0: *1 http script if
2014/08/11 13:23:50 [debug] 15062#0: *1 http script if: false
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "/"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "robots.txt"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "favicon.ico"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: ~ "[^/]\.php(/|$)"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: ~ "/\.(ht|gitignore)"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: ~ "\.(neon|ini|log|yml)$"
2014/08/11 13:23:50 [debug] 15062#0: *1 using configuration "/"
2014/08/11 13:23:50 [debug] 15062#0: *1 http cl:-1 max:1048576
2014/08/11 13:23:50 [debug] 15062#0: *1 rewrite phase: 3
2014/08/11 13:23:50 [debug] 15062#0: *1 post rewrite phase: 4
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 5
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 6
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 7
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 8
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 9
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 10
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 11
2014/08/11 13:23:50 [debug] 15062#0: *1 post access phase: 12
2014/08/11 13:23:50 [debug] 15062#0: *1 try files phase: 13
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "/home/michal/www/"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "/front/homepage/default"
2014/08/11 13:23:50 [debug] 15062#0: *1 trying to use file: "/front/homepage/default" "/home/michal/www/app.local/front/homepage/default"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "/front/homepage/default"
2014/08/11 13:23:50 [debug] 15062#0: *1 trying to use dir: "/front/homepage/default" "/home/michal/www/app.local/front/homepage/default"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "/index.php?"
2014/08/11 13:23:50 [debug] 15062#0: *1 trying to use file: "/index.php?" "/home/michal/www/app.local/index.php?"
2014/08/11 13:23:50 [debug] 15062#0: *1 internal redirect: "/index.php?"
2014/08/11 13:23:50 [debug] 15062#0: *1 rewrite phase: 1
2014/08/11 13:23:50 [debug] 15062#0: *1 http script complex value
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script set $try_dir
2014/08/11 13:23:50 [debug] 15062#0: *1 http script complex value
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "/home/michal/www/"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: ""
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "."
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "NUL"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script file op 0000000000000002 "/home/michal/www/.app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script file op false
2014/08/11 13:23:50 [debug] 15062#0: *1 http script if
2014/08/11 13:23:50 [debug] 15062#0: *1 http script if: false
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "/"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "robots.txt"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: "favicon.ico"
2014/08/11 13:23:50 [debug] 15062#0: *1 test location: ~ "[^/]\.php(/|$)"
2014/08/11 13:23:50 [debug] 15062#0: *1 using configuration "[^/]\.php(/|$)"
2014/08/11 13:23:50 [debug] 15062#0: *1 http cl:-1 max:1048576
2014/08/11 13:23:50 [debug] 15062#0: *1 rewrite phase: 3
2014/08/11 13:23:50 [debug] 15062#0: *1 post rewrite phase: 4
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 5
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 6
2014/08/11 13:23:50 [debug] 15062#0: *1 generic phase: 7
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 8
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 9
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 10
2014/08/11 13:23:50 [debug] 15062#0: *1 access phase: 11
2014/08/11 13:23:50 [debug] 15062#0: *1 post access phase: 12
2014/08/11 13:23:50 [debug] 15062#0: *1 try files phase: 13
2014/08/11 13:23:50 [debug] 15062#0: *1 http script copy: "/home/michal/www/"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "app.local"
2014/08/11 13:23:50 [debug] 15062#0: *1 http script var: "/index.php"
2014/08/11 13:23:50 [debug] 15062#0: *1 trying to use file: "/index.php" "/home/michal/www/app.local/index.php"
2014/08/11 13:23:50 [debug] 15062#0: *1 trying to use file: "=404" "/home/michal/www/app.local=404"
2014/08/11 13:23:50 [debug] 15062#0: *1 http finalize request: 404, "/index.php?" a:1, c:2
2014/08/11 13:23:50 [debug] 15062#0: *1 http special response: 404, "/index.php?"
2014/08/11 13:23:50 [debug] 15062#0: *1 http set discard body
2014/08/11 13:23:50 [debug] 15062#0: *1 xslt filter header
2014/08/11 13:23:50 [debug] 15062#0: *1 HTTP/1.1 404 Not Found
Server: nginx/1.6.0
Date: Mon, 11 Aug 2014 11:23:50 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Content-Encoding: gzip

Tak po přistoupení k doméně s www na začátku mi nginx vypsal, že nemá permissiony do temp a log, jejichž nastavení nakonec celý problém vyřešilo.

Editoval zimmi (11. 8. 2014 14:08)