具有不同应用程序的相同 server_name 在 nginx 中作为单独的位置块插入

具有不同应用程序的相同 server_name 在 nginx 中作为单独的位置块插入

是否可以在同一个 nginx 服务器中“插入”不同的 web 服务(从不同的 docker 容器公开)?

这是一个简单的例子,可以帮助您了解总体思路:

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

    client_max_body_size 10M;
    charset utf-8;

    server_name my.server.org;

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

    location / {
        include proxy_params;
        proxy_pass http://127.0.0.1:8081/;
    }
    location /static/ {
        include proxy_params;
        include /etc/nginx/mime.types;
        alias /var/www/app/static/;
    }
    location ^~ /app2/ {
        include proxy_params;
        proxy_pass http://127.0.0.1:8082;
    }
    location ^~ /app3/ {
        include proxy_params;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8083;
    }
}

其中location /是第一个应用程序的根目录,以及下一个位置块中的静态文件。
第一个应用程序正在运行http://my.server.org/

我想访问另外两个应用程序http://my.server.org/app2/http://my.server.org/app3/同时保持相同的服务器名称my.server.org
这些应用程序与主应用程序相关,但它们完全独立,即它们由其他docker组合提供服务,它们的端口分别暴露在8082和8083。

是否有可能在一个独特的块内实现如此简单的任务server

目前,当我访问另外两个 URL 时,出现 404 错误。

我基本上想将这些工作 URL + 端口及其所有子元素映射到命名位置:

http://my.server.org:8081/..。 ->http://my.server.org/..
http://my.server.org:8082/..。 ->http://my.server.org/app2/..
http://my.server.org:8083/..。 ->http://my.server.org/app3/..

编辑:
或者这样:

    location /app3/ {
        if ($http_referer ~ "^$scheme://$http_host/app3/") {
            rewrite ^/app3/(.*) $scheme://$http_host/app3/$1 redirect;
        }
        include proxy_params;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8083;
    }

或这个:

    location ~*/app3/(.*)$ {
        include proxy_params;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8083/$1;
    }

运行情况相同,但并不完美,因为还存在两个问题:

  1. 仅提供原始 HTML(例如,css 文件上没有样式:“502 bad gateway”)
  2. 页面内的链接指向例如http://my.server.org/subfeature/subitem而不是http://my.server.org/app3/subfeature/subitem。因此,它们“缺少”前缀,/app3如果它不在实际应该出现的位置,我不知道如何实际添加它。

答案1

这是一项典型的任务,但您忘记了两件事:

  • 谷歌搜索你的问题。
  • rewrite在每个块中添加子句location {}

相关内容