nginx не обслуживает статики как часть страницы - PullRequest
2 голосов
/ 05 февраля 2010

У меня есть кластер Mongrel за nginx, и я пытаюсь заставить nginx обслуживать статическое содержимое моего сайта по следующему правилу (URL-адреса RESTful):

    location / {
        if (-f $request_filename) { 
            break; 
        }

        if (!-f $request_filename) {
            proxy_pass http://mycluster$request_uri;
            break;
        }
    }

Когда я загружаю страницу, на которой есть изображения (по ссылке из / public / images), запросы на изображения просто зависают навсегда (то же самое касается JS, CSS и т. Д.). Тем не менее, если я перейду прямо к URL-адресу изображения (щелчок правой кнопкой мыши, «просмотреть изображение»), все файлы будут обслуживаться, как и ожидалось, - и они будут продолжаться, если я выключу кластер Mongrel. Таким образом, nginx может ясно видеть и получать доступ ко всем статическим файлам. Кроме того, при поиске в firebug при загрузке страницы я вижу, что для некоторых файлов делаются двойные запросы (не всегда одинаковые!) И что иногда один из них обслуживается правильно, а другой - зависает на неопределенный срок.

Если я изменю правило, чтобы перенаправить все в мой кластер, все статические данные будут работать нормально - точно такой же результат, как если бы я обратился к одному из дворцов напрямую:

    location / {
        proxy_pass http://mycluster$request_uri;
    }

Это, конечно, не вариант, так как я очень хочу, чтобы nginix обслуживал этот контент. Другая странная вещь - кажется, что файлы действительно отправляются; например, я могу видеть изображения в firebug при наведении на никогда не выполняющиеся запросы. Я довольно новичок в nginix, так что, вероятно, я упустил что-то очевидное - я старался изо всех сил, чтобы найти ответ самостоятельно, но я действительно мог сделать с некоторой помощью!

Большое спасибо,

JS

P.S. Может ли быть так, что nginx и Mongrel конфликтуют из-за того, кто должен обслуживать файл?

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

Обновление: кто-то из списка рассылки nginx предложил изменить правило прокси с:

location / {
    if (-f $request_filename) {
    break;
}

if (!-f $request_filename) {
    proxy_pass http://mycluster$request_uri;
    break;
}

до:

location / {
    try_files $uri @fallback;
}

location @fallback {
    proxy_pass http://mycluster$request_uri;
}

Кажется, директива try_files является рекомендуемым способом проверки наличия статического файла. К сожалению, это изменение никак не решает мою проблему.

JS

0 голосов
/ 07 февраля 2010

Если все ваши статические файлы (изображения, CSS, JS) находятся в папке, то вы можете попробовать:

location ^~ /static/ {
    root /path/to/the/folder/which/has/static/subfolder;
    expires 30d;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...