由于现在的生产环境中, 由于一个对外的服务上线之后,需要部署的服务器往往不止一台, 这个时候就产生了如下的几个问题:
代理问题
现在存在两台服务器, 客户端怎么知道需要请求哪一台服务器呢?
负载均衡问题
要是所有的请求都达到了服务器A, 那么在服务器B上进行的部署将毫无意义
资源优化
一个请求可能是请求动态资源, 也有可能访问静态资源,比如样式等, 如果都访问服务器会使资源浪费
这个时候使用nginx处理之后就可以很好的解决以上的几个问题.
nginx 稳定性极强, 并且占用内存很小,并发能力还非常的强,并且由于非常的火,网上存在非常多的配置的示例, 可以很方便的参考配置
在/opt(第三方软件的安装我们一般放在这个文件夹下面)目录下创建一个docker_nginx目录,放置docker-compose.yml文件
具体的docker教程后面补, 可自己自行学习. ->> 菜鸟 Docker 教程
version: '3.1' services: nginx: restart: always # 随着docker的启动而启动 image: daocloud.io/library/nginx:latest # 拉取镜像的地址, 这里用的是国内的地址 container_name: nginx # 生成的镜像名称 ports: - 80:80 #端口映射 volumes: - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d # 数据卷映射, 将nginx容器内的配置文件夹映射到linux主机的本地文件夹, 修改其中一个另一个也会对应改变
然后使用docker-compose up -d 启动即可
使用 docker exec -it nginx bash
进入Nginx容器内部, 在/etc/nginx目录下存放着nginx.conf文件, 即是nginx的核心配置文件
worker_processes 1; error_log /var/log/nginx/error.log warn; # 以上统称为全局块, # worker_processes他的数值越大,Nginx的并发能力就越强 # error_log 代表Nginx的错误日志存放的位置 events { worker_connections 1024; } # events块 # worker_connections他的数值越大,Nignx并发能力越强 http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } # location块 # root:将接收到的请求根据/usr/share/nginx/html去查找静态资源 # index: 默认去上述的路径中找到index.html或者index.htm } # server块 # listen: 代表Nginx监听的端口号 # localhost:代表Nginx接收请求的ip } # http块 # include代表引入一个外部的文件 -> /mime.types中放着大量的媒体类型 # include /etc/nginx/conf.d/*.conf; -> 引入了conf.d目录下的以.conf为结尾的配置文件 server块的内容就相当于是*.conf中配置的内容
由于我们上面设置过了数据卷, - /opt/docker_nginx/conf.d/:/etc/nginx/conf.d
, 我们在/opt/docker_nginx/conf.d目录下新建一个default.conf文件,内容如下:
可以根据需要进行修改, 后面我们只需要修改这个文件即可, 修改完成之后重启下ngxin服务器即可验证是否生效
server{ listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } }
正向代理是客户端的代理, 客户端知道自己具体需要访问的目标服务器和代理服务器, 这个时候我们使用正向代理进行访问权限的突破, 提高访问的速度等, 并且这个时候对于目标服务器是隐藏了客户端的ip的
比如在我们访问谷歌, youtube等网站的时候使用的即时正向代理
反向代理是服务器端进行配置的, 客户端只知道访问的域名, 但是不知道自己访问的具体是那一台服务器,可以由此达成负载均衡, 并隐藏服务器的ip地址
修改上面的ngxin配置文件, 准备一个可以正常访问发服务, 一个普通的在tomcat中的网页也行, 这里我在服务器中运行了一个简单的SpringBoot demo , 配置的端口是, 修改配置文件如下之后:
访问我在服务器中的服务的时候就不需要带上端口号了, 使用nginx的默认80端口即可自动跳转到配置文件中的8088端口.实现了反向代理. (注: 修改文件后重启下服务器)
优先级
(location =) --> (location /xxx/yyy/zzz) -->(location ^~) -->(location ,*)–>(location /起始路径)–>(location /)
# 1. 直接匹配 location = / { # 精准匹配,主机名后面不能带任何的字符串 } # 2. 通用匹配 location /xxx { # 匹配所有以/xxx开头的路径 } # 3. 匹配开头路径 location ^~ /images/ { # 匹配所有以/images开头的路径 } # 4. 正则匹配 location ~ /xxx { # 匹配所有以/xxx开头的路径 } # 5. 匹配后缀 location ~* \.(gif|jpg|png)$ { # 匹配以gif或者jpg或者png为结尾的路径 } # 6. 全部通配 location / { # 匹配全部路径 }
启动一个springboot项目(保证可用, 自己根据需要写就好了)
修改配置文件内容, 添加两个反向代理的路径
重启nginxdocker-compose restart
请求
server{ listen 80; # 监听80端口 server_name localhost; location = /index { # 匹配所有index开头的路径 proxy_pass http://192.168.206.138:8081/; } location ^~ /ssm/ { # 匹配所有/ssm/ 开头的路径 proxy_pass http://192.168.206.138:8081/ssm/; } location / { # 匹配所有路径 proxy_pass http://192.168.206.138:8080/; } }
Nginx默认提供了3种负载均衡策略
配置后如果没有生效可以换个浏览器刷新试试
upstream 名字 { server ip:port; server ip:port; ... } server { listen 80; server_name localhost; location / { proxy_pass http://upstream的名字/; } }
如果访问的次数少, 不一定可以出现
upstream 名字 { server ip:port weight=权重比例; server ip:port weight=权重比例; ... } server { listen 80; server_name localhost; location / { proxy_pass http://upstream的名字/; } }
upstream 名字 { ip_hash; server ip:port; server ip:port; ... } server { listen 80; server_name localhost; location / { proxy_pass http://upstream的名字/; } }
Nginx并发力公式 : worker_processes * worker_connections / 4 | 2
= Nginx最终的并发能力
动态资源需要/4,静态资源需要/2.
Nginx通过动静分离,来提升Nginx的并发能力,更快的给用户响应。
# 配置如下 location / { proxy_pass 路径; }
# 配置如下 location / { root 静态资源路径; index 默认访问路径下的什么资源; autoindex on; # 代表展示静态资源全的全部内容,以列表的形式展开。 } # 先修改nginx的docker-compose.yml文件,添加一个数据卷,映射到Nginx服务器的一个目录 - /opt/docker_nginx/html:/data/html - /opt/docker_nginx/img:/data/img # 添加了index.html和1.jpg静态资源 # 修改default.conf配置文件 location /html { root /data; index index.html; } location /img { root /data; autoindex on; }
使用nginx集群可以防止单点故障的问题
可使用keepalived Keepalived详细介绍 监听nginx的健康情况
使用HAProxy HAProxy用法详解 提供一个虚拟的路径,统一的去接收用户的请求。
测试方式:
1.在opt目录下创建一个docker_nginx_cluster目录,放入所有的集群需要的文件
2.关闭删除其他容器,再启动集群的部署
3.启动后先保证能访问master的8081,slave的8082,通过浏览器访问,可以看到页面
4.通过浏览器访问80端口,默认找master主机,所以能看到输出master
5.当关闭master容器后,再访问80端口,则会访问slave容器,输出slave
具体集群的搭建可参考这篇文章:
keepalived原理及nginx+keepalived
Nginx+Keepalived实现Nginx高可用
可能出现的问题 : ERROR: Pool overlaps with other one on this address space
可参考其他的nginx文章 : 搞懂Nginx一篇文章就够了