2009-05-15 6 views
64
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; 
     } 
    } 

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

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

EDIT: Существует белый подход к списку, но он не очень изящный, см. Все эти расширения, я не хочу этого.

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; 
    } 

EDIT 2: В новых версиях Nginx использовать try_files вместо http://wiki.nginx.org/HttpCoreModule#try_files

+0

Просто для того, чтобы очистить вещи: над кодом будет использоваться статический файл, если он существует на диске, если файл не существует, запрос передается Apache. Это работает большую часть времени, так как все URL-адреса в моих приложениях используют mod_rewrite (или маршрутизацию) и на самом деле не существуют на диске. Только прямой доступ к * .php filename является исключением и должен анализироваться Apache. –

ответ

124

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

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; 
} 

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

+10

Лучший ответ, чем принятый, за использование 'if'. – Konklone

+0

Я использую wordpress, поэтому мне нужно разместить папку загрузки на сервере nginx? – Chameron

+4

Моя проблема с этим решением: nginx не использует другое местоположение (прокси) и пытается показать список каталогов. Таким образом, он выдает 403, потому что список каталогов не активирован. ** Редактирование: ** Хорошо, если вы удалите '$ uri /', то это сработает. – ChristophLSA

15

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

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. Отдых будет обрабатываться как статические файлы. Фактический алгоритм оценки местоположения - here.

+1

Прочтите это [статья] (http://wiki.nginx.org/IfIsEvil), почему IfIsEvil – czerasz

+1

ответ ниже должен быть принятым ответом. – timbrown

4

Если вы используете 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

+0

Это работало отлично, хотя я все еще получаю ошибки для мини-файлов (например, site.min.css и main.min.js и т. Д.). Как я поймаю их в регулярном выражении? @lo_fye – Garth

 Смежные вопросы

  • Нет связанных вопросов^_^