使用nginx作为javawebservlet的代理
我试图将nginx用作负载平衡器/代理服务器,它指向一系列tomcat服务器。这是我当前的nginx配置使用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
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....
}