эмуляция if/else

pavel at pronskiy.ru pavel at pronskiy.ru
Wed Apr 23 20:45:31 MSD 2008


Вариации на тему виртуалдокрут->nginx+apache.
http://trash.pronskiy.ru/nginx.conf

server {
	listen  80 default rcvbuf=8k  sndbuf=32k;
	server_name _;

	error_page	502	 /502.shtml;
	error_page      403      /403.html;
	error_page      404      /404.html;

	#errors pages
	location /403.html { root /etc/nginx/errors;}
	location /404.html { root /etc/nginx/errors;}
	location /502.shtml { root /etc/nginx/errors;ssi on;}
	include /etc/nginx/deny.conf;

	#default directory
	set $defloc /home/default-site/www/;

	#set $stat                  '<script src="/webstat/?js" type="text/javascript"></script>';
	#apache dynamic delivery
	location / {
	    #set $stat                  '<script src="/webstat/?js" type="text/javascript"></script>';
	    #sub_filter 		'</html>' '</html>\n$stat\n';
	    #sub_filter_once   		on;
	    open_file_cache		max=2000 		inactive=60s;
	    open_file_cache_valid	120s;
	    open_file_cache_errors	on;
	    client_body_temp_path	/tmp/tmp-body-nginx;
    	    proxy_set_header 		Host 			$host;
    	    proxy_set_header 		X-Real-IP       $remote_addr;
    	    proxy_set_header 		X-Forwarded-For $proxy_add_x_forwarded_for;
    	    send_timeout            	60m;
    	    proxy_pass 			http://127.0.0.1:8000/;
	    proxy_temp_path            /tmp/tmp-nginx;

	}

	#munin graphic status
	location /nginx_status {stub_status on;}
	
	#apache icons fancyindexing
	location ^~ /.icons/ {alias /etc/apache2/icons/;}

	#empty gif & 0 gif
	location ~ (0\.gif|empty\.gif|blank\.gif) {empty_gif;}
	
	#static delivery images and files
	location ~* ^.+\.(swf|gif|jpg|jpeg|png|ico|js|css|xsl|txt|doc|rtf|pdf|rar|zip|gz|tgz|xls)$ {

    	    if (!-f $request_filename) {proxy_pass http://127.0.0.1:8000;}
	    if ($http_host ~ ^([^.]+)\.([^.]+)\.([^.]+)$) { set $root /home/$2/$1.$2.$3/www; }
    	    if ($http_host ~ ^www\.([^.]+)$) { set $root /home/$1/$1.$2/www; }
    	    if ($http_host ~ ^([^.]+)\.([^.]+)$) { set $root /home/$1/www.$1.$2/www; }
	    if ($http_host ~ ^mail\.(.*)$) { set $root /var/www/webmail/www; }
    	    if ($http_host ~ ^mysql\.(.*)$) { set $root /var/www/phpmyadmin/www; }
    	    if ($http_host ~ ^mailadmin\.(.*)$) { set $root /var/www/mailadmin/www; }

    	    proxy_set_header            Host                    $host;
    	    proxy_set_header            X-Real-IP       $remote_addr;
            proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
            send_timeout                60m;


    
	    root $root;expires 1d;

	}

	#if robots in user location?
	location = /robots.txt {
		if ($http_host ~ ^([^.]+)\.([^.]+)\.([^.]+)$) { set $root /home/$2/$1.$2.$3/www; }
		if ($http_host ~ ^www\.([^.]+)$) { set $root /home/$1/$1.$2/www; }
		if ($http_host ~ ^([^.]+)\.([^.]+)$) { set $root /home/$1/www.$1.$2/www; }
		if (!-f $request_filename) {break;root $defloc;}
		root $root;
	}

	#if favicon in user location?
	location = /favicon.ico {
		if ($http_host ~ ^([^.]+)\.([^.]+)\.([^.]+)$) { set $root /home/$2/$1.$2.$3/www; }
		if ($http_host ~ ^www\.([^.]+)$) { set $root /home/$1/$1.$2/www; }
		if ($http_host ~ ^([^.]+)\.([^.]+)$) { set $root /home/$1/www.$1.$2/www; }
		if (!-f $request_filename) {break;root $defloc;}
		root $root;
	}



	#stat
	location ^~ /webstat/ {
		proxy_pass   http://127.0.0.1:8000/webstat/;
		alias $defloc/webstat/;
		autoindex off;
		index index.php;

	}
}


При запросе к статике получаем докрут для любого домена привязанного к 
этому ip
Путь к клиентской статике для нжинкс: /home/domain.tld/www.domain.tld/www/
Если путь к статике динамически сгенерирован - отдаём  апачу.

    if (!-f $request_filename) {proxy_pass http://127.0.0.1:8000;}


Sergej Kandyla пишет:
> Roxis wrote:
>> On Wednesday 23 April 2008, Sergey Shepelev wrote:
>>  
>>> Всегда были не совсем ясны сходство и различия break;, rewrite break и
>>> rewrite last.
>>>
>>> Обычная задача. Существующие файлы отдавать статикой, несуществующие
>>> проксировать. Сейчас написано два if: -f и !-f.
>>>
>>> Как это написать более правильно?
>>>
>>> Может так? Есть комментарии по поводу этого куска?
>>>
>>> location / {
>>>     if (-f $request_filename) {
>>>         break;
>>>         root html;
>>>     }
>>>     proxy_pass http://127.0.0.1:1234;
>>> }
>>>     
>>
>> более правильно не использовать if вообще:
>>
>> location / {
>>     root html;
>>     error_page 404 = @backend;
>> }
>>
>> location @backend {
>>     proxy_pass ...;
>> }
>>   
>
> Подскажите,  насколько больший оверхеад дают использование if по 
> сравнению с неиспользованием?
>
> мне нравится реализация автоматических субдоменов
>
> server {
>    listen 80;
>    server_name example.com *.example.com;
>    root /var/www/example.com/$subdomain;
>    set $subdomain "";
>    if ($host ~* ^([a-z0-9-\.]+)\.example.com$) {
>        set $subdomain $1;
>    }
>    if ($host ~* ^www.example.com$) {
>        set $subdomain "";
>    }
> }
>
> но, судя по настроениям рассылки, это плохая практика...
>


-- 
icq: 99699699






More information about the nginx-ru mailing list