首页 > 系统相关 >第九天(nginx-第三篇--------nginx的相关总结)

第九天(nginx-第三篇--------nginx的相关总结)

时间:2023-03-28 19:55:42浏览次数:45  
标签:-------- 第九天 Nginx keepalived nginx html docker haproxy

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端口出现下图所示:

解决办法: 仔细检查配置文件是否配置错误,有些地方的配置在不同的主机上配置是不同的,不能直接照抄,仔细看我写的注释!!!

完结 ~ ~
ε=(´ο`*)))唉,变懒了,几个月前学的东西,现在才把笔记写上,欠的总得一点一点还啦~~

标签:--------,第九天,Nginx,keepalived,nginx,html,docker,haproxy
From: https://www.cnblogs.com/XieLingYu/p/17266445.html

相关文章

  • 设备树的概念(四):平台设备驱动和设备树
    平台驱动程序也与DTs一起工作。这是目前处理平台设备的推荐方式,不再需要使用板级文件,当设备的属性发生变化时也不需要重新编译内核。可以使用OF匹配表进行匹配,这是一种基于......
  • 20.拔模
    1.定义:通过拔模命令,将实体具有一定的倾斜角度,一般用于模具环境中;2.拔模的两种模式:手工和DraftXpert(拔模专家)3.手工: A.拔模类型:  a)中性面;  b)分型......
  • npm WARN deprecated [email protected]: core-js@<3.23.3 is no longer maintained and
    [email protected]:core-js@<3.23.3isnolongermaintainedandnotrecommendedforusageduetothenumberofissues.BecauseoftheV8engine......
  • 对称的二叉树
    classSolution{public:booldfs(TreeNode*l,TreeNode*r){if(l==NULL&&r==NULL)returntrue;elseif(l&&r)re......
  • 二叉树的镜像
    classSolution{public:voidmirror(TreeNode*root){if(root==NULL)return;mirror(root->left);mirror(root->right);Tre......
  • 数字三角形
    如图所示,一个数字三角形。请编一个程序计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。每一步可沿左斜线向下或右斜线向下走;1<三角形行数<25;......
  • P1005 [NOIP2007 提高组] 矩阵取数游戏
    思维题:显然每个行可以互相独立来处理。贪心和暴力显然都不容易处理这题,所以我们只能考虑dp。每次只能取最左边和最右边的数,这显然很符合区间dp的特点。所以我们令dp[i]......
  • mysql 查看表的大小方法
    mysql查看表的大小方法:1.查看所有数据库容量大小selecttable_schemaas'数据库',sum(table_rows)as'记录数',sum(truncate(data_length/1024/1024,2))as'数据......
  • 实验2 字符串和列表
    实验任务1task1实验源码1#字符串的基础操作2#课堂上没有演示的一些方法34x='nbaFIFA'5print(x.upper())6print(x.lower())7print(x.swapcase()......
  • Jenkins如何配置邮箱通知?
    1.下载插件 EmailExtensionPlugin在Jenkins主界面,点击“ManageJenkins”->“ManagePlugins”->“Available”标签页。在搜索框中输入“EmailExtensionPlugin......