Обратный прокси-сервер Apache + NginX: обслуживание статических и прокси-файлов во вложенных URL-адресах - PullRequest
0 голосов
/ 09 марта 2012

У меня работает Apache на моем сервере через порт 8080 с NginX, работающим в качестве резервного прокси на порту 80. Я пытаюсь заставить NginX обслуживать статические HTML-файлы для определенных URL-адресов.Я изо всех сил пытаюсь написать конфигурацию NginX, которая делает это.У меня есть конфликтующие директивы, поскольку мои URL-адреса вложены друг в друга.

Вот что я хочу получить:

  • Один URL-адрес находится на /example/, и я хочу, чтобы NginXобслуживать статический HTML-файл, расположенный на моем сервере на /path/to/www/example-content.html, вместо того, чтобы позволить Apache обслуживать страницу для NginX.

  • Другой URL-адрес находится на /example/images/, и я хочу, чтобы Apache обслуживал эту страницудля NginX, так же как и для остальной части сайта.

Я настроил свой файл nginx.conf так:

server {
    listen          80;
    server_name     localhost;
    # etc...

    location / {
        proxy_pass  http://127.0.0.1:8080/;
    }

    # etc...    

Моя попыткаСлужить статическому файлу в /example/ из NginX было следующим образом:

    location /example/ {
        alias  /path/to/www/;
        index  example-content.html;
    }

Это работает, но это означает, что все, что после URL /example/ (например, /example/images/), также связано с этим локальным путем.

Я бы хотел использовать вместо этого регулярное выражение, но я не нашел способа подать файл специально, только папку.Я хочу сказать что-то вроде этого:

    location ~ ^/example/$ {
        alias  /path/to/www/example-content.html;
    }

Это специально соответствует папке /example/, но использование такого имени файла является недопустимым синтаксисом.Использование явного location = /example/ в любом случае также не работает.

Если я напишу это:

    location ~ ^/example/$ {
        alias  /path/to/www/;
        index  example-content.html;
    }

    location ~ /example/(.+) {
        alias  /path/to/www/$1;
    }

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

Так что я немного растерялся.Любые советы вообще приветствуются!Большое спасибо.

1 Ответ

1 голос
/ 09 марта 2012

Поскольку вы говорите, что у вас работает Apache, я предполагаю, что он предназначен для запуска динамического контента, такого как PHP (в противном случае он не нужен).В этом случае приведенный ниже пример конфигурации будет обслуживать весь статический контент с помощью Nginx и передавать другие в Apache.

server {
    # default index should be defined once as high up the tree as possible
    # only override lower down if absolutely required
    index index.html index.php

    # default root should be defined once as high up the tree as possible
    # only override lower down if absolutely required
    root /path/to/www/

    location / {
        try_files $uri $uri/ @proxy;
    }
    location @proxy {
        proxy_pass  http://127.0.0.1:8080;
        # Other Proxy Params 
    }
    location ~ \.php$ {
        error_page 418 = @proxy
        location ~ \..*/.*\.php$ { return 400; }
        return 418;
    }
}

Это предполагает, что вы следуете структурированной установке, где файл по умолчанию в каждой папке либоназываемые "index.html" или "index.php", такие как "/example/index.html", "some-folder / index.html" и "/some-other-folder/index.html".

При этом переход к «/ example /», «/ some-folder /» или «/ some-other-folder /» будет просто работать без каких-либо дополнительных действий.

Если в каждой папке есть файлы по умолчаниюсо случайными разными именами, такими как «/example/example-content.html», «some-folder / some-folder.html» и «some-other-folder / still-another-different-default.html», затемстановится немного сложнее, так как вам нужно сделать что-то вроде

server {
    # default index should be defined once as high up the tree as possible
    # only override lower down if absolutely required
    index index.html index.php

    # default root should be defined once as high up the tree as possible
    # only override lower down if absolutely required
    root /path/to/www/

    location / {
        try_files $uri $uri/ @proxy;
    }
    location @proxy {
        # Proxy params 
        proxy_pass  http://127.0.0.1:8080;
    }
    location ~ .+\.php$ {
        error_page 418 = @proxy
        location ~ \..*/.*\.php$ { return 400; }
        return 418;
    }
    location /example/ {
        # Need to keep defining new index due to lack of structure
        # No need for alias or new root
        index  example-content.html;
    }
    location /some-folder/ {
        # Need to keep defining new index due to lack of structure
        # No need for alias or new root
        index  some-folder.html;
    }
    location /some-other-folder/ {
        # Need to keep defining new index due to lack of structure
        # No need for alias or new root
        index  yet-another-different-default.html;
    }
    # Keep adding new location blocks for each folder
    # Obviously not the most efficient arrangement
}

Лучшим вариантом будет структурированное и логическое расположение файлов на сайте вместо нескольких разных мест.

...