nginx反向代理2台tomcat实践(使用docker-compose)

title: nginx反向代理2台tomcat实践(使用docker-compose)
date: 2016-12-22 09:32:44
tags: nginx proxy_pass docker-compose
categories: nginx
此篇blog是笔者读《Nginx.From.Beginner.to.Pro》第8章的实践总结
首先准备实践环境
安装docker和docker-compose细节略过
新建单独的文件夹作为实验环境
在我电脑上位置:/Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/
结构和内容如下图:
nginx反向代理2台tomcat实践(使用docker-compose)
文章图片
image.png
其中nginx.conf,mime.types,html文件夹是nginx配置需要的相关文件(直接从nginx安装包中拷出)。
而tomcat1和tomcat2里是部署时需要的2个webapp,分别有2个默认页面显示app1字样和app2字样。
这都是在部署docker容器时修改配置需要的。
接下来一一细说:
docker-compose.yml内容

nginx: container_name: nginx image: nginx ports: - 81:80 volumes: - /Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/nginx.conf:/etc/nginx.conf - /Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/mime.types:/etc/mime.types - /Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/html/:/etc/html command: nginx -g 'daemon off; ' -c /etc/nginx.conf links: - tomcat1 - tomcat2 tomcat1: container_name: tomcat1 image: tomcat:8-jre8 ports: - 8081:8080 volumes: - /Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/tomcat1/app.war:/usr/local/tomcat/webapps/app.wartomcat2: container_name: tomcat2 image: tomcat:8-jre8 ports: - 8082:8080 volumes: - /Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/tomcat2/app.war:/usr/local/tomcat/webapps/app.war

其中分别定义了3个container,nginx,tomcat1,tomcat2。
nginx的links指令,将tomcat1和tomcat2挂载到nginx的container下(这里实际就是在nginx的container的etc/hosts下写入了tomcat1和tomcat2的名字和ip映射,细节参阅docker-compose的wiki)
【nginx反向代理2台tomcat实践(使用docker-compose)】注意我在容器启动的时候挂载的都是具体的文件,如:
Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/nginx.conf:/etc/nginx.conf
如果写成这样:
Users/tobi/Documents/dockerCompose_workspace/nginx_tomcat/:/etc/
就覆盖了容器内/etc/下原有的文件,所以最好别这么做。
当然容器启动想使用新的配置也可以创建新的image。
nginx.conf中的核心配置
upstream backend{ server tomcat1:8080; server tomcat2:8080; } server { listen80; server_namelocalhost; #access_loglogs/host.access.logmain; location /app { # roothtml; proxy_pass http://backend; indexindex.html index.htm; }

注意proxy_pass代理的路径最后是否加上"/"意义完全不同。
比如这,不加代表最后访问的路径是http://backend/app/
而如果配置写的是proxy_pass http://backend/;
则访问的是http://backend/
输入命令docker-compose up启动3个容器,访问localhost:81/app
浏览器交替显示tomcat1/app和tomcat2/app的内容:app1,app2。
因为nginx中upstream的默认均衡策略是Round-Robin轮询。
nginx其他常见的负载策略
upstream backend{ least_conn; server 10.0.2.6 weight=1; server 10.0.2.7 weight=1; }

顾名思义,连接被代理到最少活跃connection的后台服务器上
upstream backend{ ip_hash; server 10.0.2.6; server 10.0.2.7; }

按照ip哈希,当你的后台存有状态比如session,希望同一个客户端被代理到同一台tomcat时使用。
upstream backend{ hash $scheme$request_uri; server 10.0.2.6; server 10.0.2.7; }

按照请求的url进行hash。
定制http header
nginx反向代理tomcat的时候,会影响tomcat接收到的http header头
例如nginx会自动去掉没有值得空header头
不能使用下划线(可以修改)
tomcat如果要得到客户端真实的ip,nginx需要在location中设置
proxy_set_header X-Real-IP $remote_addr; (相当于设置了一个X-Real-IP的header头)

    推荐阅读