nginx: автоматическое добавление слеша для директорий

pachanga

Новичок
nginx: автоматическое добавление слеша для директорий

Народ, никто не посоветует, как настроить nginx таким образом, чтобы он "понимал", что запрос был адресован к директории, если на конце запроса не было слеша (т.е дописывал бы этот самый слеш)?

Apache с этим справляется замечательно, а вот nginx настроить что-то не получается...
 

fixxxer

К.О.
Партнер клуба
какая версия, есть ли реврайты?
Код:
> mkdir ~/www/tmp
> telnet HOST 80
Trying 83.222.XXXXX...
Connected to HOST.
Escape character is '^]'.
GET /tmp HTTP/1.1
Host: HOST
Connection: close

HTTP/1.1 301 Moved Permanently
Server: nginx/0.3.23
Date: Tue, 30 May 2006 09:10:51 GMT
Content-Type: text/html; charset=iso-8859-1
Connection: close
Location: [url]http://HOST/tmp/[/url]
 

fixxxer

К.О.
Партнер клуба
если директории физически не существует, не будет и редиректа. (вроде бы, и в апаче так же).
в принципе, это решается дополнительным rewrite правилом.
если я верно понял вопрос. :) если неправильно - покажи кусок конфига
 

pachanga

Новичок
Я так понимаю, необходимо как-то проанализировать, что запрос мапится на директорию, и если это так, то дописать нехватающий слеш и не отдавать обработку тяжелому Апачу....

Кусок конфига:

Код:
http {
	include		/etc/nginx/mime.types;
	default_type	application/octet-stream;
  
	log_format main
		'$remote_addr - $remote_user [$time_local] '
        	'"$request" $status $bytes_sent '
		'"$http_referer" "$http_user_agent" '
		'"$gzip_ratio"';
									       
	client_header_timeout	10m;
	client_body_timeout	10m;
	send_timeout		10m;

	connection_pool_size		256;
	client_header_buffer_size	1k;
	large_client_header_buffers	4 2k;
	request_pool_size		4k;

	gzip on;
	gzip_min_length	1100;
	gzip_buffers	4 8k;
	gzip_types	text/plain;

	output_buffers	1 32k;
	postpone_output	1460;

	sendfile	on;
	tcp_nopush	on;
	tcp_nodelay	on;

	keepalive_timeout	75 20;

	ignore_invalid_headers	on;

	index index.html index.php;

  access_log  /var/log/nginx/localhost.access_log main;
  error_log /var/log/nginx/localhost.error_log;

  # by default all requests are proxied to original apache
  server {
          listen 80;
          include /etc/nginx/proxy.conf;
  }

  server {
          listen 80;
          server_name     ...;
          include /etc/nginx/proxy.conf;

          location ~* ^.+.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js)$ {
              root /var/...;
          }
  }
 

si

Administrator
а где в server 2 location для не "jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js" ?
 

pachanga

Новичок
Если нет совпадения то идет отработка /etc/nginx/proxy.conf:

Код:
location / {
    proxy_pass         http://xxxx:8080/;
    proxy_redirect     default;

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

    client_max_body_size       10m;
    client_body_buffer_size    128k;

    proxy_connect_timeout      90;
    proxy_send_timeout         90;
    proxy_read_timeout         90;

    proxy_buffer_size          4k;
    proxy_buffers              4 32k;
    proxy_busy_buffers_size    64k;
    proxy_temp_file_write_size 64k;
}
Виртуальных хостов много поэтому вынес этот кусок в отдельный файл.
 

Alexandre

PHPПенсионер
вопрос чуточку не в тему, но рядом ;)
хотелось бы увидеть куски конфига, как настроить связку ngnix - apache или где почитать об этом.

особенность в том, что существует несколько виртуальных хостов,
как организовать связку ngnix - apache в этом случае
 

si

Administrator
т.е ты хочешь сказать что обработка пойдет в server 1 ?

Alexandre
в офих доке вполне достаточно инфы.
 

pachanga

Новичок
Автор оригинала: si
т.е ты хочешь сказать что обработка пойдет в server 1 ?
Стоп, давай по порядку: server 1 указан для всех виртуальных хостов, которые явно не прописаны ниже, т.е это сервер по умолчанию - он просто сразу же отдает управление Apache. server 2, 3, n - виртуальные хосты, которые надо проксить с частными правилами.

Все работает просто замечательно, если бы не проблема с директориями без слеша: nginx не знает, что с ними делать и передает управление Апачу, т.е http://host/dir => http://host:8080/dir/
 

pachanga

Новичок
Данная проблема поднималась в почтовой рассылке nginx - http://www.lexa.ru/nginx-ru/msg05226.html . Однако у меня все прописано как раз так, как это советует сделать автор nginx...

М-да, придется писать письмо в рассылку, наверное. Хотя...мне кажется надо просто заменить:

Код:
location ~* ^.+.(jpg|jpeg|...)$
на что-то более гибкое, типа:

Код:
    if (!-f $request_filename) {        
        proxy_pass  [url]http://...;[/url]
        break;
    }
Буду копаться...
 

Alexandre

PHPПенсионер
pachanga я прочитал статью, все понятно - я где-то так и предполагал, что апач вешаем на порт типа 8080 используя прокси,
только у меня следующая особенность
- несколько виртуальных хостов
- апач использует модуль реврайт

как в этом случае конфигурить nginx
- использовать виртуальные хосты nginx, а апача?

где использовать модреврайт (думаю на nginx)

если я буду использовать мод_прокси, смогу ли я отловить REMOTE_ADDR

у меня живые проекты,
есть какая-то методика - незаметно для пользователя переползти на двухуровневую архитектуру.
 

pachanga

Новичок
fixxxer: Да, слеш потярял, но проблему это не решает :(

-~{}~ 30.05.06 16:04:

Alexandre: не мог бы, плиз, сделать новый тред по своей теме?
 

fixxxer

К.О.
Партнер клуба
честно пытался добиться такого поведения на 0.1.43 и 0.3.23, не получилось :) либо баг в новых версиях, либо что-то у тебя там в конфиге еще интересное.
 

pachanga

Новичок
У тебя используется 0.3.23? Может ее поставить? Сейчас попробую....

-~{}~ 30.05.06 16:12:

Кстати, если не сложно, не приведешь свой конфиг?
 

fixxxer

К.О.
Партнер клуба
такие вот блоки
Код:
    server {
        listen  83.222.XXXXXXX;
        server_name *.hostname.com;
        access_log /home/XXX.log; 
        location ~* \.(html?|gif|jpe?g|png|txt|zip|doc|xls|rar|avi)$ {
                root /home/XXXX/www;
        }
        location / {
                proxy_pass [url]http://127.0.0.1:8080/;[/url]
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header Host hostname.com;
        }
    }
 

si

Administrator
pachanga
так стоп. я запутался. я так понимаю ты привел сильно обрезаный конфиг, покажи полный для одного vh.

-~{}~ 30.05.06 15:48:

да и если он у тебя уходит на апача все должно работать в любом случае

-~{}~ 30.05.06 15:53:

есть какая-то методика - незаметно для пользователя переползти на двухуровневую архитектуру.
повесить nginx на внешний ip апаче ан 127.0.0.1:80 и направить все запросы с nginx на апача. потом постепенно выделать статику которую nginx способен сам отдавать и выделать ее в отдельные location и/или сервер и так постепенно получить желаемый результат. для подмены remote_addr есть соответствующий модуль
 
Сверху