使用nginx作为javawebservlet的代理

使用nginx作为javawebservlet的代理,nginx,docker,reverse-proxy,internal-load-balancer,Nginx,Docker,Reverse Proxy,Internal Load Balancer,我试图将nginx用作负载平衡器/代理服务器,它指向一系列tomcat服务器。这是我当前的nginx配置 server { listen 80; server_name _; rewrite ^ https://$http_host$request_uri? permanent; } server { listen 443; resolver 127.0.0.11 valid=5s; ssl on; ssl_certific

我试图将nginx用作负载平衡器/代理服务器,它指向一系列tomcat服务器。这是我当前的nginx配置

server {

    listen 80;
    server_name _;
    rewrite ^ https://$http_host$request_uri? permanent;
}

server {
     listen 443;

     resolver 127.0.0.11 valid=5s;

     ssl on;
     ssl_certificate /etc/nginx/certs/default.crt;        # path to your cacert.pem
     ssl_certificate_key /etc/nginx/certs/default.key;    # path to your privkey.pem
     ssl_verify_client off;
     server_name localhost;
     fastcgi_param   HTTPS               on;
     fastcgi_param   HTTP_SCHEME         https;

     charset utf-8;
     client_max_body_size 200M;

     set $app https://app:8443;
     set $auth https://auth:8443/authentication/;
     set $discovery https://discovery:8443/discovery/;

   location / {
       proxy_pass $app;
   }
   location /authentication {
       proxy_pass $auth;
   }
   location /discovery {
       proxy_pass $discovery;
       proxy_set_header Host $http_host;
       proxy_set_header X_FORWARDED_PROTO https;
   }

}
如果有任何不同,这将被停靠,但在文档正常工作时,设置无法正确解决。docs和provisioning之间的唯一区别是“docs”通过tomcat提供纯html文件。(tomcat7标准/docs/)而配置实际上是一个Javaservlet(JaxRS/spring等)

如果我直接命中图像,它会按预期工作,而如果我试图通过nginx命中同一端点,它将无法解析

我的docker compose配置供参考

version: '2'
services:
  db:
    image: db:nodata
    expose:
    - 5433
  zk:
     image: zookeeper
     ports:
     - 2181:2181
  discovery:
    image: services_discovery:latest
    env_file: docker_environment
    expose:
    - 8443
    ports:
    - 8443:8443
    links:
     - db
     - zk
  app:
    image: tomcat-jsse-ssl:7-jdk8
    volumes:
    - ./app/www/:/usr/local/tomcat7/webapps/ROOT/
    expose:
    - 8443
    ports:
    - 8444:8443
  auth:
    image: tomcat-jsse-ssl:7-jdk8
    volumes:
    - ./authentication/www/authentication/:/usr/local/tomcat7/webapps/authentication/
    expose:
    - 8443
  proxy:
    build: ./proxy/
    depends_on:
     - 'auth'
     - 'app'
     - 'discovery'
    ports:
    - 443:443
    restart: always
运行图像后,我可以很好地解析以下URL

即,两个集装箱运行良好:

  • 通过nginx加载可以正常工作
  • 通过nginx加载可以正常工作
  • ==>404.
服务器日志:

proxy_1      | 172.20.0.1 - - [24/Apr/2017:00:04:28 +0000] "GET /discovery/ready HTTP/1.1" 404 400 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
proxy_1      | 172.20.0.1 - - [24/Apr/2017:00:04:43 +0000] "GET /discovery/api/swagger.json HTTP/1.1" 404 400 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
proxy_1      | 172.20.0.1 - - [24/Apr/2017:00:04:57 +0000] "GET /discovery/ready HTTP/1.1" 404 400 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"
Discovery Tomcat访问日志(直接访问时)

第一个条目是当我通过其他一切直接访问服务器时 是nginx向服务器发送请求的时间。由于某些原因,它没有正确地翻译请求

如有任何想法/建议,将不胜感激

注意:为了回答这个问题,我简化了我的示例/配置,对“配置”的任何引用现在都是“发现”

更新:我弄明白了为什么“servlet”会崩溃。事实上,它一直在破裂。它正在剥离除基URL之外的所有URL

比如说

变成 172.20.0.3---[2017年4月24日:03:22:06+0000]“获取/验证/HTTP/1.0”200 28


请注意,查询参数已剥离

nginx文档说,您有责任重建url:

因此,您可以尝试使用regex捕获URI的其余部分,并将其发送到proxy_pass部分:

location ~* ^/discovery/(.*) {
  proxy_pass $discovery$1$is_args$args;
  .... other configs....
}

集装箱在同一个docker网络上吗?是的,同一个网络。如果我进入nginx容器,我会看到所有不同的容器,并且可以像我说的那样ping它们,只要数据是静态的html/css,它看起来就可以正常工作。您在配置容器日志中看到错误了吗?你能告诉我是哪个容器生成了404吗?不,一切正常。如果我将tomcat在8443上运行的端口暴露到我的笔记本电脑上,我就可以连接到servlet,一切正常。如果我尝试通过nginx,它就会失败。据我所知,是nginx造成了问题。或者tomcat/nginx的组合。我在这里设置了一个测试用例:。我使用的是相同的模式(除了不使用tomcat的应用程序),在这个示例中,所有操作都按预期进行,但tomcat+servlet导致了问题。您能否从配置服务器日志中判断是否有请求进入?有可能nginx甚至没有尝试访问资源调配容器。这对我来说太棒了!只是一些后续问题。我假设(*)被映射到$1。我从以下位置获取了$vars定义:。目的是什么~*啊,明白了。~*将其标记为正则表达式模式。谢谢
location ~* ^/discovery/(.*) {
  proxy_pass $discovery$1$is_args$args;
  .... other configs....
}