Ngxin
一. Ngxin是干嘛的
由于现在的生产环境中, 由于一个对外的服务上线之后,需要部署的服务器往往不止一台, 这个时候就产生了如下的几个问题:
-
代理问题
现在存在两台服务器, 客户端怎么知道需要请求哪一台服务器呢? -
负载均衡问题
要是所有的请求都达到了服务器A, 那么在服务器B上进行的部署将毫无意义 -
资源优化
一个请求可能是请求动态资源, 也有可能访问静态资源,比如样式等, 如果都访问服务器会使资源浪费
这个时候使用nginx处理之后就可以很好的解决以上的几个问题.
nginx 稳定性极强, 并且占用内存很小,并发能力还非常的强,并且由于非常的火,网上存在非常多的配置的示例, 可以很方便的参考配置
二. 使用docker-compose安装Nginx
2.1 安装
在/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 启动即可
2.2 Nginx的配置文件
使用 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;
}
}
三. Nginx反向代理
反向代理和正向代理
- 正向代理
正向代理是客户端的代理, 客户端知道自己具体需要访问的目标服务器和代理服务器, 这个时候我们使用正向代理进行访问权限的突破, 提高访问的速度等, 并且这个时候对于目标服务器是隐藏了客户端的ip的
比如在我们访问谷歌, youtube等网站的时候使用的即时正向代理
- 反向代理
反向代理是服务器端进行配置的, 客户端只知道访问的域名, 但是不知道自己访问的具体是那一台服务器,可以由此达成负载均衡, 并隐藏服务器的ip地址
基于Nginx实现反向代理
修改上面的ngxin配置文件, 准备一个可以正常访问发服务, 一个普通的在tomcat中的网页也行, 这里我在服务器中运行了一个简单的SpringBoot demo , 配置的端口是, 修改配置文件如下之后:
访问我在服务器中的服务的时候就不需要带上端口号了, 使用nginx的默认80端口即可自动跳转到配置文件中的8088端口.实现了反向代理. (注: 修改文件后重启下服务器)
关于Nginx的路径映射
优先级
(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的负载均衡策略
Nginx默认提供了3种负载均衡策略
- 轮询
- 将请求平均分配给每一台服务器
- 权重
- 根据配置的权重不同分配服务器 - ip Hash
- 根据请求的ip计算hash值, 使相同ip的请求总是访问同一台服务器
轮询
配置后如果没有生效可以换个浏览器刷新试试
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的名字/;
}
}
ip_hash
upstream 名字 {
ip_hash;
server ip:port;
server ip:port;
...
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://upstream的名字/;
}
}
五. Nginx动静分离
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集群
使用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一篇文章就够了