ФорумРазработкаУстановка и администрирование ПОВебсервер → nginx, apache + mod_rewrite и file not found

nginx, apache + mod_rewrite и file not found

  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:31

    Под apache работает трюк через mod_rewrite: если запрошена превьюшка картинки и этой превьюшки ещё нет — дадим задание скрипту эту превьюшку сделать. Он её делает один раз, после этого по ссылке получаем статику. Гениально!

    Теперь усложним задачу. Работает связка nginx + apache. Под nginx настроено что статика (узнается по расширению) отдается напрямую без помощи apache. Что-то типа

    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js|swf)$ {
     root /home/www/foobar.com;
    }

    Сталобыть mod_rewrite идет по бороде!

    Профи! Как мне рыбку съесть и всё остальное?
    Эээ… обосрались?
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:35, спустя 4 минуты 14 секунд

    artoodetoo, try_files
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:36, спустя 40 секунд

    p.s. можно тупо заставить nginx не замечать /thumb/*.jpg — очень хуёвый вариант. тогда нахуй мне nginx!
    нужен аналог RewriteCond … !-f тут меня не хватает.
    але?
    Спустя 23 сек.
    упс. лунный дуд - спасибо! попробую
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:36, спустя 49 секунд

    artoodetoo, выше читай
    Спустя 36 сек.
    упс. лунный дуд - спасибо! попробую

    ага, всегда пожалуйста мой сын :D
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:41, спустя 4 минуты 34 секунды

    а поподробнее? помог, называется! я в нгинксе не очень
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:45, спустя 3 минуты 47 секунд

    помог, называется!

    только попиздеть и можете, а помочь не можете фу сука дибилы, гавенный ресурс!!! да чтобы у вас все сломалось!!
    Спустя 182 сек.
    http://sysoev.ru/nginx/docs/http/ngx_http_core_module.html#try_files
    Сапожник без сапог
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 22:53, спустя 8 минут 4 секунды

    http://highload.com.ua/index.php/2009/05/09/%D1%80%D0%B5%D1%81%D0%B0%D0%B9%D0%B7%D0%B8%D0%BD%D0%B3-%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BE%D0%BA-%D0%B2-nginx/
    Спустя 161 сек.

    а поподробнее? помог, называется! я в нгинксе не очень


    типа

    # если файла физически нет, то вызываем @handler
    try_files $uri @handler;

    location @handler {
    # обрабатываем эту сказочную ситуацию
    }
    Спустя 33 сек.
    в try_files можно и каталоги проверять:
    try_files $uri $uri/ @handler;
    adw/0
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 3 августа 2010 г. 23:10, спустя 17 минут 37 секунд

    спасибо родные!
    ιιlllιlllι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 4 августа 2010 г. 15:37, спустя 16 часов 27 минут 2 секунды

    Отчитываюсь: оказалось, что из закромов Debian ставится старенький nginx 0.6.32, который не поддерживает директиву try_files.

    Upgrade
    Поиски привели меня на страничку
    http://www.o-learn.com/content/how-to-compileinstall-and-upgrade-nginx
    По этой инструкции обновился из исходников, только с поправкой на текущую cтабильную версию nginx-0.7.67
    newnginx.sh

    #! /bin/sh

    # download and extract nginx
    wget http://sysoev.ru/nginx/nginx-0.7.67.tar.gz
    tar -zxvf nginx-0.7.67.tar.gz

    # download and extract pcre library
    wget http://sourceforge.net/projects/pcre/files/pcre/7.9/pcre-7.9.tar.gz/download
    tar -xzf pcre-7.9.tar.gz

    # configure and compile nginx
    cd nginx-0.7.67
    ./configure –sbin-path=/usr/sbin –with-http_ssl_module –with-pcre=../pcre-7.9
    make

    #stop nginx to install new version file:
    /etc/init.d/nginx stop
    make install

    Дальше надо кое-что допилить напильником. Оказалось, что новый nginx ищет конфиги не в /etc/nginx, а в /usr/local/nginx/conf/ — чтобы пользоваться уже настроенными конфигами, я поправил /etc/init.d/nginx — добавил опции:

    DAEMON_OPTS="-p /etc/nginx/ -c nginx.conf"

    Т.е. заставил его смотреть на старое место, а новые конфиги оставил для ленивого изучения.
    На старте новый nginx ожидает увидеть папку logs в своей рабочей папке — дадим что просит.

    ln -s /var/log/nginx /etc/nginx/logs

    можно запускать /etc/init.d/nginx start

    Использую try_files
    /etc/nginx/sites-available/site1

    server {
    listen site1.local:80;
    server_name site1.local;

    location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|html|htm)$
    {
    location ~* ^.+thumb/([a-z]+)/([0-9/]+)\.jpg$
    {
    try_files $uri @thumb;
    }
    root /web/site1/public_html/www;
    access_log /var/log/nginx/site1.access.log;
    }

    location @thumb {
    proxy_pass http://127.0.0.1:8080;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    Работает как надо! Если в thumb не обнаружен jpg, то за работу принимается Apache с его mod_rewrite и в итоге запускается генератор превьюшек.

    Некрасиво как-то дублировать location / и location @thumb, но по-другому не умею. Профи, ау!
    ιιlllιlllι унц-унц
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 4 августа 2010 г. 16:06, спустя 28 минут 10 секунд

    может заюзать alias? хотя я не пробовал…
    и вообще я сейчас пья и плохо соображаю)

    еще можно наверное так:


    location @test {
    return 777;
    }

    location / {
    return 777;
    }

    location /superpuper {
    internal;
    proxy_pass http://127.0.0.1:8080;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    error_page 777 /superpuper;

    Спустя 44 сек.
    попробуй, может что получится
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 4 августа 2010 г. 16:13, спустя 7 минут 21 секунду

    можешь заменить
    error_page 777 /superpuper; 

    на
    error_page 777 = @superpuper; 


    ну и location @superpuper {}
    adw/0
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 4 августа 2010 г. 20:06, спустя 3 часа 53 минуты 29 секунд

    попробую
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!