美文网首页
nginx反向代理2台tomcat实践(使用docker-com

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

作者: lazyguy | 来源:发表于2018-01-11 15:57 被阅读0次

    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/

    结构和内容如下图:

    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-com

          本文链接:https://www.haomeiwen.com/subject/bzqtoxtx.html