文章目录
- 说明
- Nginx 简介
- Ubuntu 下 安装 Nginx
- 安装方式一:
- 安装方式二:
- nginx卸载干净
- Nginx TCP负载均衡配置
- 上手Nginx,从配置文件开始
- main 全局配置
- events模块
- stream
- 负载均衡算法
- 指令参数
- nginx 监控
说明
本篇侧重点在于 TCP负载均衡,或者可以说,没有多少HTTP负载均衡相关的。所以如果不是你的菜,可以省些时间。
虽然我现在不排斥任何一门新技术,但是让我跨越web这一块直接上手HTTP负载均衡,跨度有点大哈。还是得循序渐进,有机会再说吧。
Nginx 简介
Nginx是一个 Web 服务器,也可以用作 反向代理,负载均衡器 和 HTTP 缓存。
单台服务器受限于硬件资源,其性能是有上限的,当单台服务器不能满足应用场景的并发需求量时,就需要考虑部署多个服务器共同处理客户端的并发请求,此时就需要一台负载均衡器,通过预设的负载算法,指导客户端连接服务器。
从1.9版本开始以后,nginx开始支持tcp的长连接负载均衡,但是nginx默认并没有编译tcp负载均衡模块,编译它时,需要加入–with-stream参数来激活这个模块。
Ubuntu 下 安装 Nginx
安装方式一:
代码语言:javascript复制apt-get install nginx
安装完之后,nginx位于 /usr/sbin
下,nginx.conf
位于/etc/nginx
下。
查看 nginx 是否启动的方式:netstat -tanp
,如果看到80端口由nginx监听,则启动了。
启动nginx:./nginx
关闭nginx:./nginx -s stop
平滑重启nginx:./nginx -s reload
安装方式二:
1、准备一个目录 2、下载相关组件:
代码语言:javascript复制wget http://nginx.org/download/nginx-1.10.2.tar.gz
版本自选。
3、安装pcre
代码语言:javascript复制sudo apt-get update
sudo apt-get install libpcre3 libpcre3-dev
4、安装zlib
代码语言:javascript复制apt-get install zlib1g-dev
5、安装nginx
代码语言:javascript复制tar zxvf nginx-1.10.2.tar.gz
cd nginx-1.10.2
./configure --with-stream
make && make install
6、检查nginx是否安装成功
代码语言:javascript复制cd /usr/local/nginx/sbin
./nginx -t
显示 :
代码语言:javascript复制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
则启动成功
安装成功之后,nginx 位于 /usr/local/nginx/sbin
下,nginx.conf 位于 /usr/local/nginx/conf
下。
nginx卸载干净
新手,玩的时候有可能会整的乱七八糟,卸载干净了重新再安装呗。
1、删除相关软件:
代码语言:javascript复制sudo apt-get --purge remove nginx nginx-common nginx-core
2、移除全部不使用的软件包
代码语言:javascript复制apt-get autoremove
3、罗列出与nginx相关的软件并删除
代码语言:javascript复制dpkg --get-selections|grep nginx
自行删除、
4、查看nginx正在运行的进程,如果有就kill掉
代码语言:javascript复制ps -ef |grep nginx
kill -9 XXX
5、全局查找与nginx相关的文件
代码语言:javascript复制find / -name nginx*
rm -rf file
删除列出的所有文件
Nginx TCP负载均衡配置
上手Nginx,从配置文件开始
看到一张还不错的图:
main 全局配置
nginx在运行时与具体业务功能(比如http服务或者email服务代理)无关的一些参数,比如工作进程数,运行的身份等。
代码语言:javascript复制user www www; # 指定nginx进程使用什么用户启动
worker_processse auto; # 表示由 Nginx 根据内核数生成等量的工作进程
# 指定启动多少进程来处理请求,一般情况下设置成CPU的核数。
#如果开启了ssl和gzip更应该设置成与逻辑CPU数量一样甚至为2倍,可以减少I/O操作。
#使用grep ^processor /proc/cpuinfo | wc -l查看CPU核数。
worker_cpu_affinity auto; # 同上,表示由 Nginx 自动进行 CPU 绑定
# 在高并发情况下,通过设置将CPU和具体的进程绑定来降低由于多核CPU切换造成的寄存器等现场重建带来的性能损耗。
# 如worker_cpu_affinity 0001 0010 0100 1000; (四核)
error_log /var/logs/nginx_error.log crit; # 定义全局错误日志文件。
# 日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
pid /usr/local/webserver/nginx/nginx.pid;
worker_rlimit_nofile 65535; # 用于指定一个nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535”来设置。
worker_rlimit_core 800m; # 指明所有worker进程所能够使用的总体的最大核心文件大小(段错误·核心已转储)
worker_priority -5 # 工作进程优先级,设置为-5,取值范围为 -20~19,数值越低优先级越高,获得的CPU时间越多。
events模块
代码语言:javascript复制events{
use epoll; # 事件模块指令,用来指定Nginx的工作模式。
worker_connections 65536; # 每一个worker进程能并发处理(发起)的最大连接数(包含与客户端或后端被代理服务器间等所有连接数)。
}
1、Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选。在操作系统不支持这些高效模型时才使用select。
2、最大连接数 = worker_processes * worker_connections/4,所以这里客户端最大连接数是65536。当nginx作为http服务器时,计算公式里面是除以2。进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令ulimit -n 65536后worker_connections的设置才能生效。
stream
做tcp负载均衡的话在这下面插一下stream,像这样:
代码语言:javascript复制events {
worker_connections 1024;
accept_mutex on;
accept_mutex_delay 300ms; # 互斥条件下进程等待时间为300毫秒
worker_aio_requests 128; # 完成异步操作最大数为128
multi_accept on; //尽可能多的接受请求
}
stream {
upstream MyServer{ # 定义一个upstream组,名为MyServer
# 这里配置成要访问的 IP:Port
# 这里选用权重轮询负载算法,weight为权重
server 192.168.190.129:6000 weight=1 max_fails=3 fail_timeout=30s;
server 192.168.190.129:6002 weight=1 max_fails=3 fail_timeout=30s;
# max_fails :表示10s内失败几次,则标记server已宕机,剔出上游服务。10s清零一次
# fail_timeout :表示失败时候熔断时间。时间过后继续回来重试
}
server {
proxy_connect_timeout 1s;
listen 8000;
proxy_pass MyServer; # 把TCP通信发送到upstream的哪个server中去,可以指定端口,但是这里没必要
tcp_nodelay on;
}
}
http {
负载均衡算法
前面提到了权重负载,这里再列举几种: a):least-connected :对于每个请求,nginx plus选择当前连接数最少的server来处理
代码语言:javascript复制upstream MyServer{
least_conn;
server 192.168.190.129:6000;
server 192.168.190.129:6001;
server 192.168.190.129:6002;
}
b)ip_hash :客户机的IP地址用作散列键,用于确定应该为客户机的请求选择服务器组中的哪个服务器。
代码语言:javascript复制upstream MyServer{
ip_hash;
server 192.168.190.129:6000;
server 192.168.190.129:6001;
server 192.168.190.129:6002;
}
与之对应的还有url_hash。
c)fair,按后端服务器的响应时间来分配请求,响应时间短的优先分配。
代码语言:javascript复制upstream MyServer{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}
指令参数
a)max_conns,限制每台server的连接数,用于保护避免过载,可起到限流作用。
代码语言:javascript复制upstream MyServer{
server 192.168.190.129:6000 max_conns=2;
server 192.168.190.129:6001 max_conns=2;
server 192.168.190.129:6002 max_conns=2;
}
b)slow_start
代码语言:javascript复制upstream MyServer{
server 192.168.190.129:6000 weight=6 slow_start=60s;
server 192.168.190.129:6001 weight=2;
server 192.168.190.129:6002;
}
1、该参数不能使用在 hash 和 random load balancing 中。 2、如果在 upstream 中只有一台 server,则该参数失效
c)down、backup: down 用于标记服务节点不可用,backup 表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到。
代码语言:javascript复制upstream MyServer{
server 192.168.51.5:8080 down;
server 192.168.51.6:8080 weight=1;
server 192.168.51.5:8080 backup;
}
backup 参数不能使用在 hash 和 random load balancing 中。
d)Keepalived 长连接缓存数。当Nginx与被代理服务器建立长连接时,设定每个工作进程可以缓存与当前上游服务器组中被代理服务器保持长连接的数量。当超过设定值时,将根据最近最少使用算法(LRU)进行关闭。
代码语言:javascript复制upstream MyServer{
·····
keepalive 32; # 设置连接池大小
}
e)keepalive_requests 长连接最大请求数 默认值100,设置每个与被代理服务器建立的长连接中传输请求的最大数量,超过这个值后,该连接将被断掉。也可做防洪使用,看个人怎么使用了。
f)keepalive_timeout 长连接缓存超时时间,默认60s。 设置长连接缓存,每个连接的超时时间,被缓存的连接超过这个时间认为被激活使用时将被关闭。
还有很多的配置,只要你敢想。 比如说:限制并发数、限制IP访问、根据IP分流等
nginx 监控
待完善