Nginx负载均衡总结2
如果要支持健康检查需要开启health_check(好吧,这个是nginx plus版本才有的功能,plus是付费版)
还有一点,Windows的nginx不支持udp等协议,所以有一些测试还必须用linux环境测试;
对于Tcp的负载均衡简易配置:
tcp { # 如果自己写的话最好不用这个,还是用stream好,它可以同时代表tcp和udp
upstream xxx-service { # 注意,无论是tcp/udp/http什么的,这里都是upstream clusterName
server localhost:9000;
server localhost:9001;
#check interval 健康:检查时间间隔,单位为毫秒
#rise 检查几次正常后,将server加入以负载列表中
#fall 检查几次失败后,从负载队列移除server
#timeout 检查超时时间,单位为毫秒
check interval=3000 rise=2 fall=5 timeout=1000;
}
server { # 对于TCP/UDP这样的协议不存在location的说法
listen 8786;
proxy_pass xxx-service;
}
}
HTTP协议的:(和tcp或udp的不同的是,tcp里面一个upstream对于一个server[listen]配置,而http里是多个upstream可以对应一个server[listen]配置,也可以对应多个server配置,
而不同的server的listen端口是可以一样的【这种情况其实就可以用一个server,当然也可以用两个】)
http
{
include conf/mime.types;
default_type application/octet-stream; keepalive_timeout 120; tcp_nodelay on; upstream www.s135.com { # 这里可以用标识符而非域名,比如upstream uuu {...};而所有的web访问到nginx网关的时候都是指定了对应的server
server 192.168.1.2:80;
server 192.168.1.3:80;
server 192.168.1.4:80;
server 192.168.1.5:80;
} upstream blog.s135.com {
server 192.168.1.7:8080;
server 192.168.1.7:8081;
server 192.168.1.7:8082;
} server
{
listen 80;
# 这个server_name一般要么是nginx所在主机的ip地址,要么就是这台主机绑定的域名(一台主机可以绑定多个域名,这个时候就会用到多个server,但是没有绑定多个域名也是可以配置多个server的【最好不要会产生warn】)
server_name www.s135.com; # 下面的http://www.s135.com对应的是upstream里的名字,和server_name是没有关系的,但是如果一个请求是通过www.s135.com请求过来,那么header里Host值就会是www.s135.com这样就能被nginx识别并由这个server去处理,所以这个东西在多域名访问时还是有用的,但是如果是nginx集群只处理一个域名 或者 不以域名为转发标识只与url有关 或者 是内部系统的网关直接用的ip那么多个upstream用一个server即可,这里域名处理的作用是为了假设两个server监听的同一个地址,然后两个server里的location存在一样的配置,那么请求过来匹配上该一样的location,如果没有域名处理那么这里就无法知道到底转发给哪个server的该location【当然是先匹配server然后才是location】) location / {
proxy_pass http://www.s135.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;
} log_format www_s135_com '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/www.log www_s135_com;
} server
{
listen 80;
server_name blog.s135.com; location / {
proxy_pass http://blog.s135.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;
} log_format blog_s135_com '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /data1/logs/blog.log blog_s135_com;
}
}
官方的HTTP协议配置里不需要listen,默认就是80端口,如果是https则要listen后面有个ssl后缀:
http {
upstream backend {
server backend1.example.com;
server backend2.example.com;
server 192.0.0.1 backup;
}
server {
location / {
proxy_pass http://backend;
}
}
}
自己测试通过的Http协议负载均衡配置:#user nobody;
worker_processes 1; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections 1024;
} http {
include mime.types;
default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on; #gzip on;
# 【重要,这里的cluster_name必须是一个可访问的ip或者是域名,它不是key的意思(是key,之前用cluster_servers这个key有下划线所以失败);
# 但经过测试用cluster_servers提示400,用mmm则可以,难道是下划线的原因?(对,确实是下划线的原因,真坑啊,一般不都应该支持下划线吗?反倒是-支持,不过最好也不要有指不定什么时候不支持了)
upstream clusterservers {
server 127.0.0.1:8891 down; # max_fails=3 fail_timeout=60s weight=1
server 127.0.0.1:8892 weight=1; # 注意,weight的值不能是0(可能低版本可以),如果要软卸载单个server可以配置为down然后reload;
# server localhost:8080 backup; # 注意,backup也是会转发的,由于之前转发到上面两个主机一直失败,所以就转发到backup机里了;
} server {
listen 80; # 如果是80是可以省略的 # 其实对于HTTP协议而言,location才是相当于tcp/udp这种协议的server,而且一个upstream可以对于多个location;
server_name uuuu; # 这个配置可以不用,注意它描述的是nginx开启的server的server_name【错,它对应的其实是requestHeader中的Host的值,即域名,当两个server都绑定的同一个地址时,请求过来到底转发到哪个server里的location就可以进一步通过这个来判断】,即listen 80中的这个server,而不是upstream里的被代理服务的server_name charset utf-8; access_log logs/cluster_servers.access.log main; location / {
proxy_pass http://clusterservers;
# health_check; # 开启健康检查
} # redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
UDP协议的:
stream { # UDP的居然是叫stream(好吧,貌似TCP也能是这个,只不过后面的server的listene不需要udp后缀)
# 可以有多个upstream
upstream dns {
server 101.89.134.11:8989;
server 101.89.134.12:8989;
server 101.89.134.13:8989;
}
# 可以有多个server对应上面的upstream
server {
listen 8989 udp; # 注意这里有udp
proxy_responses 1;
proxy_timeout 20s;
proxy_bind $server_addr:$remote_port;
proxy_pass dns;
}
}
官方文档里的TCP和UDP共同的例子(注意,虽然是官方的例子,但是还是不要用下划线比较好,自己测试的时候下划线死活无法转发):
stream {
upstream stream_backend {
least_conn;
server backend1.example.com:12345 weight=5;
server backend2.example.com:12345 max_fails=2 fail_timeout=30s;
server backend3.example.com:12345 max_conns=3;
}
upstream dns_servers {
least_conn;
server 192.168.136.130:53;
server 192.168.136.131:53;
server 192.168.136.132:53;
}
server { # TCP的集群服务
listen 12345;
proxy_pass stream_backend;
proxy_timeout 3s;
proxy_connect_timeout 1s;
}
server { # UDP的集群服务
listen 53 udp;
proxy_pass dns_servers;
}
server { # 这个就是没有配置集群,普通的转发;
listen 12346; # 注意,这里的server和下面的proxy_pass你可以理解为docker容器和内部应用的关系
proxy_pass backend4.example.com:12346;
}
}
Nginx负载均衡总结2的更多相关文章
- 对比Haproxy和Nginx负载均衡效果
为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...
- nginx负载均衡集群
nginx负载均衡集群 0.前言:nginx 负载均衡,属于网络7层模型中的应用层,说白了就是一个代理,要用 upstrem 模块实现,代理则用proxy模块 1.可以针对域名做转发,lvs只能针对 ...
- 手把手教你玩转nginx负载均衡(二)----安装虚拟机操作系统
引言 在上一篇,我们组装好了虚拟机的硬件部分,那么现在我们就要把操作系统装上了,既然是服务器,那么安装linux操作系统是个比较好的选择,如果你喜欢的话,安装windows也是没有任何问题的 我这里选 ...
- nginx负载均衡基于ip_hash的session粘帖
nginx负载均衡基于ip_hash的session粘帖 nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除 ...
- Net分布式系统之二:CentOS系统搭建Nginx负载均衡
一.关于CentOS系统介绍 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red Hat ...
- Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用
上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...
- 配置nginx负载均衡
配置nginx负载均衡 执行命令:vi /usr/local/nginx/sbin/nginx/conf/nginx.conf 修改为: worker_processes 2; events { ...
- 烂泥:nginx负载均衡
本文由秀依林枫提供友情赞助,首发于烂泥行天下. 今天我们来学习下有关nginx的负载均衡配置.nginx的负载均衡是通过nginx的upstream模块和proxy_pass反向代理来实现的. 说明: ...
- nginx负载均衡集群中的session共享说明
在网站使用nginx+php做负载均衡情况下,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登录状态. 下面罗列几种nginx负载均衡 ...
- nginx 负载均衡策略
nginx 负载均衡策略 1. 轮询轮询方式是nginx负载均衡的默认策略,根据每个server的权重值来轮流发送请求,例如:upstream backend {server backend1.e ...
随机推荐
- Codeforces 1172F Nauuo and Bug [线段树]
Codeforces 思路 定义\(f_{l,r}(x)\)表示数\(x\)从\(l\)进去\(r\)出来的时候会变成什么样子.容易发现这个函数是个分段函数,每一段都是斜率为1的一次函数,并且段数就是 ...
- zabbix监控线
echo mntr | nc 127.0.0.1 2181获取mntr的信息 换成conf将获得conf信息,从中找出需要监控项 conf: clientPort:客户端端口号 dataDir:数据文 ...
- 【转】Linux 利用 PROMPT_COMMAND 实现审计功能
linux历史命令记录在history,在用户退出的时候写入,不过有时候可以直接绕过去,不让写入,比如shutdown now,还有在一些情况下也是不予保存的,这让人很头疼 使用PROMPT_COMM ...
- 2019全国大学生信息安全竞赛ciscn-writeup(4web)
web1-JustSoso php伪协议获取源码 ?file=php://filter/read=convert.base64-encode/resource=index.php index.php ...
- QT文本转语音模块(TTS)QTextToSpeech
QTextToSpeech是QT5.8以上的文本转语音模块. 使用方法: 在.pro工程文件中添加“QT += texttospeech”. 添加头文件 #include <QTextToSpe ...
- keepalived非争抢机制不生效【原创】
故障现象:俩台服务器设置了keepalived非争抢机制,但是发现优先级高的服务器还是会优先获取vip 利用tcpdump抓包发现只有其中一台服务器,没有另一台 tcpdump -i eth0 vrr ...
- vs2017发布后宕机,没有响应解决方法
找到项目下:Properties\PublishProfiles 删除:FolderProfile.pubxml.user
- eclipse remote system explorer operation
Remote System Explorer Operation卡死Eclipse解决方案 - 披萨大叔的博客 - CSDN博客https://blog.csdn.net/qq_27258799/ar ...
- Springmvc request response log
Log Incoming Requests In Spring | Java Development Journalhttps://www.javadevjournal.com/spring/log- ...
- jenkins关联shell命令修改pom项目版本
#获取pom文件内的项目版本 version=`awk '/<version>[^<]+<\/version>/{gsub(/<version>|<\/ ...