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头)
网友评论