пятница, 25 ноября 2011 г.

nginx и imagecache

Мало кто знает что я помимо своих Баз и кое-какого программирования занимаюсь еще и администрированием web-сервера.
Там много чего крутится и хостится, и настал такой случай, который описан и решен не раз и не одним мной.

Итак, фронтэнд - nginx, бэкэнд - apache2, на сайте установлен Drupal. Когда imagecache должен генерить картинки и выдавать их, nginx воспринимает их как статику, пытается найти и не может. Соответственно, в логах куча ошибок, а в интерфейсе пусто, вместо картинок.

Решается все следующим образом: когда nginx не может найти что-то, он выдает ошибку 404. Ну вот мы и сделаем, чтоб он вместо своей 404 ошибки он перенаправлял запросы в апач, а тот уже разберется сам:

# то, что будет отдавать nginx
                location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js)$ {
                        root /var/www/vhosts/example.com/www;
                        error_page 404 = @backend;
                }
# запрещаем доступ к .ht - файлам
                location ~ /\.ht {
                        deny  all;
                }
# описываем наш бэкэнд
                location @backend {
                        proxy_pass http://example.com:8888;
                        proxy_set_header Host $host;
                        proxy_set_header X-Real-IP $remote_addr;
                        proxy_set_header X-Forwarded-For $remote_addr;

                        proxy_connect_timeout 120;
                        proxy_send_timeout    120;
                        proxy_read_timeout    180;
                }
# все что не попало в предыдущие правила уходит на бэкэнд
                location / {
                        try_files $uri @backend;
                }