12.17 Nginx负载均衡
时间:2022-04-27
本文章向大家介绍12.17 Nginx负载均衡,主要内容包括Nginx负载均衡目录概要、Nginx负载均衡、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
Nginx负载均衡目录概要
- vim /usr/local/nginx/conf/vhost/load.conf // 写入如下内容
upstream qq_com
{
ip_hash;
server 61.135.157.156:80;
server 125.39.240.113:80;
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
- upstream来指定多个web server
Nginx负载均衡
- 代理一台机器称为代理 ,代理两台机器就可以称为负载均衡
- 代理服务器后面可以有多个web服务器,多个web服务器去提供服务的时候,就可以实现一个负载均衡的功能
- 正常情况下,用户访问web服务器,是一台一台去请求;要么就是指定一个IP,把这域名解析到多台服务器上
- 案例
- 用户1 –> web1服务器
- 用户2 –> web2服务器
- 假设这时web1服务器挂掉了(宕机),用户1因为解析到了web1,但web1宕机了,所以就无法正常访问
- 这时候若是用nginx的负载均衡,在web1宕机后,代理服务器就不会把请求发送给web1,这就是代理的一个优点,负载均衡的优点
- 配置负载均衡,负载均衡的配置借助了upstream 模块
- 这里将qq.com作为演示对象
- dig命令查看解析的IP——>yum install -y bind-utils
[root@hanfeng ~]# yum install -y bind-utils
[root@hanfeng ~]# dig qq.com
; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.1 <<>> qq.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24485
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;qq.com. IN A
;; ANSWER SECTION:
qq.com. 273 IN A 125.39.240.113
qq.com. 273 IN A 61.135.157.156
;; Query time: 18 msec
;; SERVER: 119.29.29.29#53(119.29.29.29)
;; WHEN: 一 1月 08 22:46:59 CST 2018
;; MSG SIZE rcvd: 67
[root@hanfeng ~]#
- 会看到返回出两个IP,这个就是域名解析,也就是qq.com解析到了两个IP上
- 这时候就可以用这两个125.39.240.113IP和61.135.157.156IP,去 做负载均衡
- 写一个配置文件vim /usr/local/nginx/conf/vhost/load.conf
[root@hanfeng ~]# vim /usr/local/nginx/conf/vhost/load.conf
写入以下内容
upstream qq_com //upstream后的名称自定义
{
ip_hash; //目的是为了让同一个用户始终保持在同一个机器上
server 61.135.157.156:80; //如果域名解析端口是80,这段配置上的指定端口80是可以省略的
server 125.39.240.113:80;
}
server
{
listen 80; //定义监听端口
server_name www.qq.com; //域名
location /
{
proxy_pass http://qq_com; //这里填写的是upstream 的名字
即“http://upstream”,因为作为一个模块,代理访问的是通过解析后的IP访问;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存退出
- upstream来指定多个web server
- 当有多个服务器同时对一个域名提供服务的时候,长时间访问一个域名,在一定的时效内,会出现需要重新登录或者是说跳转到另外一个地址的服务器上;ip_hash,就是使通过这个代理访问的同一个域名的多个IP的服务器是,始终保持在一个IP上对这个域名进行访问
- 在未加载配置的时候,本机去访问qq.com,回去访问默认虚拟主机
[root@hanfeng ~]# curl -x127.0.0.1:80 www.qq.com
This is the default site.
[root@hanfeng ~]#
- 测试访问qq.com
- 检查配置文件语法,并重新加载
[root@hanfeng ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@hanfeng ~]# /usr/local/nginx/sbin/nginx -s reload
[root@hanfeng ~]#
- 这时再来访问qq.com,会看到的是qq.com的主页,反馈回来的是网页的源码
[root@hanfeng ~]# curl -x127.0.0.1:80 www.qq.com
- 这个就是负载均衡
nginx代理和负载均衡的知识点
- nginx不支持去代理https,也就是在配置文件中的server 后不能写443,是不支持的,只能代理http、tcp
- 若想要实现代理https,nginx监听443端口,但web服务必须是80端口
- Dubbo源码解析 —— Router
- 【死磕Java并发】—–深入分析volatile的实现原理
- phalcon-入门篇3(优美的URL与Config)
- 数据库中间件 Sharding-JDBC 源码分析 —— 事务(一)之BED
- 熔断器 Hystrix 源码解析 —— 命令执行(二)之执行隔离策略
- phalapi-入门篇4(国际化高可用和自动生成文档)
- 用JavaScript动态输出的JS脚本不能执行
- Dubbo源码解析 —— 服务暴露原理
- [Golang软件推荐] RSA公私钥加解密(解决Golang私钥加密公钥解密问题)
- [喵咪大数据]Hive+Hbase关联
- 再战子域共享Cookie问题
- [喵咪大数据]Presto查询引擎
- 如何在5分钟内做出你的第一个开源贡献
- [喵咪大数据]HUE大数据管理工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- TensorFlow 指定GPU 日志却显示的是第0块
- bazel 出现no such package '@org_tensorflow//tensorflow' 错误
- tensorflow API——tf.random_uniform 使用
- go cannot find package "golang.org/x/crypto/ssh/terminal" 解决方案
- go 中的 defer 使用及其规则
- 数据结构算法操作试题(C++/Python/Go)——938 二叉搜索树的范围和
- Android Studio 代理配置了Gradle依旧连接超时
- Dart 中变量类型 var, Object, dynamic 区别
- C++ 中的static关键字使用场景
- Dart 中的生产模式和检查模式
- 使用mysqladmin工具统计mysql当前的T/QPS
- MixIn 理解
- Day14:链表中倒数第k个结点
- Flutter开发笔记——BottomNavigationBar设置未选择Item颜色
- 访问虚拟机局域网服务拒绝连接