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)_第1张图片
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.war

tomcat2:
 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)

注意我在容器启动的时候挂载的都是具体的文件,如:
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 {
        listen       80;
        server_name  localhost;


        #access_log  logs/host.access.log  main;
        location /app {
           # root   html;
            proxy_pass http://backend;
            index  index.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头)

你可能感兴趣的:(nginx反向代理2台tomcat实践(使用docker-compose))