Apache + NginX反向代理:在嵌套URL中提供静态和代理文件

时间:2012-03-08 22:53:44

标签: apache nginx reverse-proxy

我在端口8080上的服务器上运行Apache,NginX作为端口80上的保留代理运行。我试图让NginX为特定URL提供静态HTML文件。我正在努力编写执行此操作的NginX配置。我有相互矛盾的指令,因为我的网址互相嵌套。

这就是我想要的:

  • 一个网址位于/example/,我希望NginX在我/path/to/www/example-content.html的服务器上提供静态HTML文件,而不是让Apache将页面提供给NginX。

    < / LI>
  • 另一个网址位于/example/images/,我希望Apache将该网页提供给NginX,就像它对网站的其余部分一样。

我已经设置了我的nginx.conf文件:

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

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

    # etc...    

我尝试从NginX提供/example/的静态文件是这样的:

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

这样可行,但这意味着/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 个答案:

答案 0 :(得分:1)

既然你说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 / yet-another-”不同的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
}

更好的选择是在网站上设置文件的结构化和逻辑布局,而不是多个不同的位置。