首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用nginx为每个位置提供不同的静态文件夹

使用nginx为每个位置提供不同的静态文件夹
EN

Stack Overflow用户
提问于 2021-01-30 20:21:31
回答 1查看 691关注 0票数 0

TL;DR

我需要服务两个容器应用程序(每个在一个不同的端口)托管在同一台机器上,但位于两个非常不同的路径,使用一个nginx反向代理自己的静态子文件夹。

上下文

我经历了很多非常复杂的内容,这并不能帮助我理解如何使用nginx为每个位置提供一些静态文件夹的本质。

让我用一个简单而整洁的反向代理配置来解释我所说的“每个位置”是什么意思:

代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    root /var/www;
    server_name my.server.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
    }
}

这很好,除了静态文件(css,js,.)不提供服务。

因此,我对其进行了如下更改,以检索app-b的这些文件

代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    root /var/www;
    server_name my.server.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /home/debian/projects/crystallography/web/app-b/;
    }
}

这样做会更好;我现在有了这些用于app-b的静态文件。当然,对app-a来说还是什么都没有。

现在,你看我得到了什么.我还需要提供app-a自己的静态文件夹。

我测试过的

以下是我尝试过的两个主要想法(它们都不起作用)和其他变体(也不起作用):

  1. 添加了一个额外的静态位置(这似乎是一种先验的清洁方式)
代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    root /var/www;
    server_name my.server.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /media/biology/swamps/frog-migration/app-a/; # this is a totally different path than app-b
    }

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /home/debian/projects/crystallography/web/app-b/;
    }
}

这显然与app-b中的静态文件夹冲突,因此nginx -t自然会失败:

代码语言:javascript
运行
复制
nginx: [emerg] duplicate location "/static/" in /etc/nginx/sites-enabled/proxy-pass.conf:24
nginx: configuration file /etc/nginx/nginx.conf test failed
  1. 服务器定义的复制(对我来说这听起来不是个好主意):
代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    root /var/www;
    server_name my.server.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /media/biology/swamps/frog-migration/app-a/;
    }
}

server {
    listen 80;
    listen [::]:80;

    root /var/www;
    server_name my.server.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
    }
    location ^~ /static/ {
        include /etc/nginx/mime.types;
        root /home/debian/projects/crystallography/web/app-b/;
    }
}

语法是可以的,但是我对nginx -t有一些警告

代码语言:javascript
运行
复制
nginx: [warn] conflicting server name "my.server.org" on 0.0.0.0:80, ignored
nginx: [warn] conflicting server name "my.server.org" on [::]:80, ignored
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

但最重要的是,app-b不再是可访问的(返回404)。

问题

有了nginx,我如何才能让两个(或者更多的)不同的应用程序(位于同一台主机上的两条不同的路径)相互毗邻,在它们自己的气泡中生活,并与它们自己的自己的静态子文件夹(即两个应用的静态文件之间没有任何干扰)一起使用?

EN

回答 1

Stack Overflow用户

发布于 2021-02-05 16:56:35

我终于找到了这个解决方案,只有一个服务器正在工作,但我并不是百分之百满意,因为我想避免alias指令,因为路径遍历漏洞

免责声明:所以请不要忘记别名位置中的尾随斜杠。

代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    #root /var/www;
    server_name server.domain.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
        location /app-a/static/ {
            include /etc/nginx/mime.types;
            alias /media/biology/swamps/frog-migration/app-a/static/;
        }
    }

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
        location /app-b/static/ {
            include /etc/nginx/mime.types;
            alias /home/debian/projects/crystallography/web/app-b/static/;
        }
    }

}

特别是,它不使用root指令;因为它发送我的页面时没有任何静态文件(这些静态文件上的错误404,我不明白为什么):

代码语言:javascript
运行
复制
server {
    listen 80;
    listen [::]:80;

    #root /var/www;
    server_name server.domain.org;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    location /app-a {
        proxy_pass http://127.0.0.1:8080/;
        location /app-a/static/ {
            include /etc/nginx/mime.types;
            root /media/biology/swamps/frog-migration/app-a/;
        }
    }

    location /app-b {
        proxy_pass http://127.0.0.1:8081/;
        location /app-b/static/ {
            include /etc/nginx/mime.types;
            root /home/debian/projects/crystallography/web/app-b/;
        }
    }

}

除了上面的工作解决方案之外,我还必须更改我的烧瓶应用程序中的静态路径,以便:

/app-a/static而不只是/static的app-a和

/app-b/static而不仅仅是应用程序b的/static

但是,通过这样做,您肯定希望将app-aapp-b字符串放在环境变量中,而不是硬编码它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65972746

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档