1.1、 Nginx
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。
反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。
1.2、 Nginx的特点
稳定性极强,7*24小时不间断运行(就是一直运行)
Nginx提供了非常丰富的配置实例
占用内存小,并发能力强(随便配置一下就是5w+,而tomcat的默认线程池是150)
二、Nginx 动静分离
Nginx的并发能力公式: worker_processes * worker_connections / 4|2 = Nginx最终的并发能力
动态资源需要/4,静态资源需要/2 , Nginx通过动静分离来提升Nginx的并发能力,更快的给用户响应。
5.1、动态资源代理
# 配置如下 location / { proxy_pass 路径; }
5.2、静态资源代理
# 停掉 nginx docker-compose down
在 /opt/docker_nginx/html 和 /opt/docker_nginx/img下新建一个 index.html(随便写点东西) 和 一张图片, 修改nginx 的default.conf配置文件
server { listen 80; listen [::]:80; server_name localhost; # 代理静态 html 资源 location /html { root /usr/share/nginx/; # 静态资源路径 index index.html; # 默认访问路径下的什么资源; } # 代理静态 img 资源 location /img { root /usr/share/nginx/; # 静态资源路径 autoindex on; # 代表展示静态资源的全部内容,以列表的形式展开 } }
在docker_nginx目录下执行docker-compose restart ,重启nginx, 并访问静态资源
静态 html 页面访问成功。
由于配置了 autoindex on 所以访问目录会全部列出静态资源。
静态资源图片访问成功。
5.3、 静态资源代理注意事项
① 反向代理路径别写错,location 后面写了路径(如:location /html {}), 则 root 后面接的路径不能有 /html,否则访问为404,查看nginx错误日志(/var/log/nginx/error.log)如下:
可以看出访问路径出现了重复。
② 在 nginx 的 docker-compose.yml 构建文件中再加一个目录挂载:
-v /usr/local/docker_nginx/logs/:/var/log/nginx
以便 nginx 代理出现问题后查看 log 日志找出问题。
六、Nginx 集群
6.1、前言
如果只有一台 Nginx 的话,当出现故障时,会导致整个程序的崩溃,产生严重后果。使用多台Nginx搭建成一个集群,当其中某一个Nginx宕机,并不会影响整个程序的正常运行。
6.2、Nginx集群工作原理
准备多台Nginx, 准备 keepalived ,监听nginx的健康情况 ;准备 haproxy,提供一个虚拟的路径,统一的去接收用户的请求。当有一台 nginx服务器出现故障,keepalived 检测到了故障后,会及时通知 haproxy 切换到正常nginx服务器,保证程序不受影响。
6.3、准备工作
① 创建一个放置集群配置文件的文件夹:docker_nginx_cluster
mkdir /opt/docker_nginx_cluster
② 在 docker_nginx_cluster 目录中编写 Dockerfile 镜像构建文件
FROM nginx:1.13.5-alpine # 导入镜像,如果本地有则从本地获取,反之去远程仓库拉取 RUN apk update && apk upgrade # 更新 apk # 下载软件包: ipvsadm,iproute2,openrc,keepalived RUN apk add --no-cache bash curl ipvsadm iproute2 openrc keepalived COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # 执行脚本 CMD ["/entrypoint.sh"]
Dockerfile 使用的是 apk 包管理工具,如果把 apk 改成 yum 会报没有 yum 这个指令
③ 在 docker_nginx_cluster 目录中编写 entrypoint.sh 脚本
/usr/sbin/keepalived -D -f /etc/keepalived/keepalived.conf # 启动 keepalived nginx -g "daemon off;"
④ 在 docker_nginx_cluster 目录中编写 docker-compose.yml 模板文件
version: "3.1" services: nginx_master: build: context: ./ # 上下文 dockerfile: ./Dockerfile # 引入构建文件 ports: - 8081:80 # 端口映射 volumes: - ./index-master.html:/usr/share/nginx/html/index.html - ./favicon.ico:/usr/share/nginx/html/favicon.ico - ./keepalived-master.conf:/etc/keepalived/keepalived.conf networks: static-network: ipv4_address: 172.30.128.2 # 必须与下面 subnet设置的ip 前16位相同 cap_add: - NET_ADMIN # 增加权限 nginx_slave: build: context: ./ dockerfile: ./Dockerfile ports: - 8082:80 volumes: - ./index-slave.html:/usr/share/nginx/html/index.html - ./favicon.ico:/usr/share/nginx/html/favicon.ico - ./keepalived-slave.conf:/etc/keepalived/keepalived.conf networks: static-network: ipv4_address: 172.30.128.3 # 必须与下面 subnet设置的ip 前16位相同 cap_add: - NET_ADMIN proxy: image: haproxy:1.7-alpine ports: - 80:6301 volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg networks: - static-network networks: static-network: ipam: config: - subnet: 172.30.0.0/16
上面的 ip地址必须是没有被占用的, 执行 ifconfig 查看已被使用的 ip 地址,我上面写的 172.30.xxx.xxx 没有被占用的所以可以使用,并且映射出的端口号也不能使用已被占用的!!
必须写死 nginx 的 ip(如:nginx_master -> 172.30.128.2 ),否则是ip随机的,haproxy 无法确定发送给哪个nginx服务器。
⑤ 在 docker_nginx_cluster 目录中编写 keepalived 对 nginx_master 和 nginx_slave 的监听配置文件
keepalived-master.conf
vrrp_script chk_nginx { # 配置多久检测一次 nginx 是否存活 script "pidof nginx" interval 2 } vrrp_instance VI_1 { state MASTER interface eth0 # nginx容器内部网卡的名称, 一般是eth0 virtual_router_id 33 # 路由Id, 默认33 priority 200 # 优先级,优先级越高就先访问哪个 nginx advert_int 1 # 授权 authentication { auth_type PASS auth_pass letmein } virtual_ipaddress { 172.30.128.50 # 指定用户统一访问的虚拟路径 } track_script { chk_nginx # 指定脚本文件,默认即可。 } }
- keepalived-slave.conf ( 配置和keepalived-master.conf基本一样)
vrrp_script chk_nginx { script "pidof nginx" interval 2 } vrrp_instance VI_1 { state BACKUP interface eth0 # 容器内部网卡的名称 virtual_router_id 33 priority 100 # 优先级 advert_int 1 # 授权 authentication { auth_type PASS auth_pass letmein } virtual_ipaddress { 172.30.128.50# 指定用户统一访问的虚拟路径 } track_script { chk_nginx # 指定脚本文件,默认即可。 } }
⑥ 在 docker_nginx_cluster 目录中编写 haproxy 的配置文件 haproxy.cfg
# global: 全局配置区域参数是进程级的,通常是和操作系统相关。这些参数一般只设置一次,如果配置无误,就不需要再次进行修改。 global log 127.0.0.1 local0 # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志 maxconn 4096 # 最大连接数 daemon # 以守护进程方式运行haproxy nbproc 4 # 指定后台的进程数量 # defaults:配置默认参数,这些参数可以被用到 frontend,backend,Listen组件 defaults log 127.0.0.1 local3 mode http # 默认的模式 mode { tcp|http|health } option dontlognull option redispatch retries 2 # 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用 maxconn 2000 # 最大连接数 balance roundrobin # 负载均衡算法-轮询 # 最大超时时间设置 timeout connect 5000ms # 最大连接 timeout client 5000ms # 客户端 timeout server 5000ms # 服务端 # frontend: 处理请求的虚拟节点,Frontend可以将匹配到本地区域的请求交给下边的backend frontend main bind *:6301 # 监听地址为 6301 default_backend webserver # 此处将对应的请求转发给后端 # 定义一个名为 webserver 后端部分(webserver 是自定义名称,但是需要与frontend里面的配置项default_backend值相一致) backend webserver server nginx_master 172.30.128.50:80 check inter 2000 rise 2 fall 5 # 这里的 ip 要和 keepalived-master.conf 和 keepalived-slave.conf 里面的写的虚拟ip对应上,端口映射为 80
option dontlognull : 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该 服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监 听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来。
option redispatch:当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了, 但是客户端的cookie是不会刷新 的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。
6.4、构建启动集群
在 docker_nginx_cluster 目录下执行:
docker-compose up -d
构建运行成功!
如果出现如下情况:
IPv4 forwarding is disabled. Networking will not work.
解决方法:
① 执行以下命令:
vi /usr/lib/sysctl.d/00-system.conf
1
② 在最下面添加如下代码: net.ipv4.ip_forward=1
③ 重启 network 服务: systemctl restart network
④ 再次构建启动集群: docker-compose up -d
6.5、 访问测试
haproxy 默认访问优先级高的,nginx_master 服务器设置的优先级更高,所以先访问 master
如果nginx_master主机宕机,那么haproxy把请求发给从机 nginx_slave服务器
如果出现访问 80端口出现下图所示:
解决办法: 仔细检查配置文件是否配置错误,有些地方的配置在不同的主机上配置是不同的,不能直接照抄,仔细看我写的注释!!!
完结 ~ ~
ε=(´ο`*)))唉,变懒了,几个月前学的东西,现在才把笔记写上,欠的总得一点一点还啦~~