Restheart前面的Nginx代理配置

时间:2017-11-07 11:10:55

标签: nginx proxy docker-swarm restheart

我在一个docker(swarm,单节点)容器中运行nginx作为前端反向代理,在Restheart应用程序前面,提供restheart REST服务。

我在Alpine上使用ngninx的最新docker镜像。 配置文件附在下面。

作为后端,我正在使用Restheart的标准mvn构建uberJar,其中大部分只有REST资源访问的根已被移动到/ api而不是/。这在直接访问时非常有效。

当我直接测试上游服务器(Restheart)(打开以进行调试)8080端口时,所有REST apis都按预期工作。

我使用httpie进行测试。

当我通过nginx,在端口8081上,使用相同的请求时,/ api / ...和/ _logic路径/ ...被捕获并按预期工作。

由于我无法理解的原因,/ _ authtokens / ...和/ browser / paths不会传递给上游的Restheart服务器,但最终被第一个块捕获,试图找到具有该名称的文件在本地文件系统中,在/ usr / share / nginx / html /...

真正困扰我的是,我不明白为什么它在前两条路径上完美运行而不是在另外两条路径上工作?!

任何关于在哪里寻找/搜索的提示或指示都将受到高度赞赏? (现在已经用Google搜索并将我的头发刮了几天......; - )

N
# Configuration file for the nginx front-end container.

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}




http {

    sendfile        off;
    keepalive_timeout  65;
    gzip  on;
    include       /etc/nginx/mime.types;
    # default_type  application/json;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  stdout  main;
    error_log stderr debug;


    upstream docker-restheart {
        server   myrestheart:8080;
    }

    server {
        listen 8081 ;   
        proxy_pass_request_headers      on;
        proxy_pass_request_body         on;
        proxy_http_version 1.1;
        proxy_redirect     default;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Host $server_name;  



        # Default will serve the index as a test.
        # This is also where non allocated locations will end up,
        # because it is the first block ..
        location / {            
            root /usr/share/nginx/html/;           
            }


        # Restheart api - ok
        location /api/  {
            proxy_pass         http://docker-restheart;            
            }

        # Restheart _logic - ok
        location /_logic/  {
            proxy_pass         http://docker-restheart;
            }

        # Restheart _authtokens - does not work ?
       location /_authtokens/  {
            proxy_pass         http://docker-restheart;
            }

        # Restheart browser - does not work ?
       location /browser/  {
            proxy_pass         http://docker-restheart;
            }



        # Restheart _authtokens - does not work ?  
        # Restheart browser - does not work ?
        # In both cases, no transfer to upstream happening, 
        # but instead, caught by the first block ...


    }
}

2 个答案:

答案 0 :(得分:0)

尝试删除或移动到nginx conf文件中location /条目的末尾。

答案 1 :(得分:0)

过去我们遇到过与Nginx配置类似的问题。在我们的例子中,我们转移到位置的正则表达式语法,它的工作原理。类似的东西:

https://gist.githubusercontent.com/[gist username]/[gist ID]/raw/[gist commit ID]/[file name]

参考:https://www.digitalocean.com/community/tutorials/understanding-nginx-server-and-location-block-selection-algorithms