Как обслуживать все существующие статические файлы напрямую с помощью NGINX, а остальные проксировать на внутренний сервер.
-
22-08-2019 - |
Вопрос
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