Как обслуживать все существующие статические файлы напрямую с помощью NGINX, а остальные проксировать на внутренний сервер.

StackOverflow https://stackoverflow.com/questions/869001

Вопрос

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

    if (-f $request_filename) {
        access_log off;
        expires 30d;
        break;
        }

    if (!-f $request_filename) {
        proxy_pass http://127.0.0.1:8080; # backend server listening
        break;
        }
    }

Вышеуказанное будет обслуживать все существующие файлы напрямую с помощью Nginx (например.Nginx просто отображает исходный код PHP), в противном случае перенаправьте запрос в Apache.Мне нужно исключить файлы *.php из правила, чтобы запросы к *.php также передавались и обрабатывались Apache.

Я хочу, чтобы Nginx обрабатывал все статические файлы, а Apache обрабатывал все динамические данные.

РЕДАКТИРОВАТЬ:Существует подход с использованием белого списка, но он не очень элегантен. Посмотрите на все эти расширения, мне это не нужно.

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)$ {
    access_log off;
    expires 30d;
    }
location / {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
    }

РЕДАКТИРОВАТЬ 2:В более новых версиях Nginx используйте try_files вместо http://wiki.nginx.org/HttpCoreModule#try_files

Это было полезно?

Решение

Использовать try_files и названный блок местоположения (@apachesite).Это удалит ненужное совпадение регулярных выражений и блокировку if.Более эффективным.

location / {
    root /path/to/root/of/static/files;
    try_files $uri $uri/ @apachesite;

    expires max;
    access_log off;
}

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

Обновлять: Предполагается, что в этой конфигурации не существует никакого PHP-скрипта. /path/to/root/of/static/files.Это распространено в большинстве современных PHP-фреймворков.Если в ваших устаревших проектах php в одной папке смешаны как php-скрипты, так и статические файлы, вам, возможно, придется внести в белый список все типы файлов, которые вы хотите, чтобы nginx обслуживал.

Другие советы

Попробуй это:

location / {
    root /path/to/root;
    expires 30d;
    access_log off;
}

location ~* ^.*\.php$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Надеюсь, это сработает.Регулярные выражения имеют более высокий приоритет, чем простые строки, поэтому все запросы, заканчивающиеся на .php должен быть перенаправлен Apache, если только соответствующий .php Файл существует.Остальные будут обрабатываться как статические файлы.Фактический алгоритм оценки местоположения: здесь.

Если вы используете mod_rewrite, чтобы скрыть расширение ваших скриптов, или вам просто нравятся красивые URL-адреса, оканчивающиеся на /, то вы можете подойти к этому с другой стороны.Скажите nginx, чтобы все, что имеет нестатическое расширение, могло передаваться в Apache.Например:

location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$
{
    root   /path/to/static-content;
}

location ~* ^!.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm)$ {
    if (!-f $request_filename) {
        return 404;
    }
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8080;
}

Я нашел первую часть этого фрагмента по адресу: http://code.google.com/p/scalr/wiki/NginxStatic

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top