nginx配置⽂件详解和负载均衡
Nginx 配置吴彦祖
配置f ,
/usr/local/webserver/nginx/f
nginx 启动命令说明
[root@iz2ze2w3v37sit3vf71kuez sbin]# ./nginx -?
nginx version: nginx/1.6.2
Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]
Options:
-?,-h        : this help
-v            : show version and exit
-
V            : show version and configure options then exit
-t            : test configuration and exit
-q            : suppress non-error messages during configuration testing
-s signal    : send signal to a master process: stop, quit, reopen, reload
-p prefix    : set prefix path (default: /usr/local/webserver/nginx/)
-c filename  : set configuration file (default: f)
-g directives : set global directives out of configuration file
-s
reload
[root@iz2ze2w3v37sit3vf71kuez sbin]# ./nginx -s reload
⽤户⽆感知重启,⽐如修改了nginx配置⽂件,然后执⾏reload重启,则在重启成功之前,nginx依然在按照⽼的配置在⼯作,重启成功后,按照新的配置⼯作
stop
⽴即停⽌
quit
处理完当前请求后,停⽌
nginx 为多进程模式
worker_processes  1;    #⼯作进程:数量,根据硬件调整,通常等于CPU数量
错误⽇志位置及级别
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
nginx启动后,会⽣成⼀个pid⽂件,记录 nginx主进程的 ID 号。
#pid        logs/nginx.pid;
worker_rlimit_nofile 65525;
# 指定进程可以打开最⼤的描述符:数⽬
events {
use epoll; #⽀持⼤并发的原因,使⽤Linux异步I/O模式。(默认使⽤同步,我们需要⼿动修改成异步)这⾥必须使⽤异步I/O
}
worker_connections
events {
worker_connections  1024;
读取配置文件失败
use epoll;
}
worker_connections:每个⼯作进程最⼤的连接数量,根据硬件调整,和前边的⼯作进程配合起来⽤。当来⼤量并发,处理不过来时就会产⽣排队,允许排队的最⼤数量。多余这个值的请求就会报502了,这⾥建议多配置⼀些,默认是1024.
keepalive_timeout 60; #超时时间
client_header_buffer_size 4k; #客户端请求头部的缓冲区⼤⼩。这个可以根据你系统设置分页⼤⼩来设置,建议设置成4k或4k的倍数。open_file_cache max=65535 inactive=60s;
# 这个将为打开⽂件指定缓存,默认是关闭的。max指定缓存数量,
把header缓存起来,就会⾛nginx的缓存,静态⽂件、图⽚等等,不经过tomcat和后端服务,直接返回资源, (tomcat处理静态资源效率不⾼,适合处理动态请求)。
inactive=60s 如果60s,没有再次被⽤到,属于⾮热点数据,会被缓存⾥清掉,这⼏个是配合使⽤的。
open_file_cache min uses 3;
# open_file_cache 指令中的inactice参数时间内⽂件的最少使⽤次数,如果超过这个,属于热点数据。⾮热点数据会在缓存⾥清理掉。
这⾥要配合使⽤,如
open_file_cache max=65535 inactive=60s; open_file_cache min uses 3;
60s内,被使⽤3次的属于热点数据,⾮热点数据会在缓存⾥清理掉。
open_file_cache_valid 60s;
这个指多长时间检查⼀下缓存有效的信息,如,这⾥设置60s,则60s检查⼀下缓存内数据是否失效,失效的被清理掉。
负载均衡配置
nginx的负载均衡主要是对proxy_pass和upstream的配置。
nginx本⾝就是⼀个web容器,既可以作为⼀个web容器,也可以作为负载均衡使⽤。负载均衡,需要配置upstream;web容器需要配置server。
负载均衡,upstream不是⼀个,可以有好多个。如:
upstream foo1 和upstream foo2
负载均衡整个流程:
1)⾸先配置 upstream upstream_name {}  要映射的服务器。其中的upstream_name⼤家可以指定为服务的域名或者项⽬的代号,这个名字是⾃⼰取的。
2)在http server下,来执⾏刚刚配置服务upstream_name的转发。
1)配置upstream (http模块内server模块外添加代码)
upstream bakend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
2)在http server模块location 下配置proxy_pass
如下,是配置完整的
http {
林俊杰哥哥林俊峰
include      pes;
default_type  application/octet-stream;
sendfile        on;
keepalive_timeout  65;
upstream bakend {
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
server {
listen      80;
server_name  localhost;
网络励志经典语录location /status {
root  html;
index  index.html index.htm;
stub_status on;
access_log on;
}
location / {
proxy_pass bakend;
}
重启nginx就⽣效了。
nginx负载均衡策略
nginx的负载均衡策略有6种:
轮询默认⽅式
weight权重⽅式
ip_hash依据ip分配⽅式
九阳电压力锅做蛋糕least_conn最少连接⽅式
fair(第三⽅)响应时间⽅式
url_hash(第三⽅)依据URL分配⽅式
⼀、轮询(默认)
最基本的配置⽅法,它是upstream的默认策略,每个请求会按时间顺序逐⼀分配到不同的后端服务器。参数有:
参数描述
fail_timeout与max_fails结合使⽤
max_fails 设置在fail_timeout参数设置的时间内最⼤失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s。
backup标记该服务器为备⽤服务器。当主服务器停⽌时,请求会被发送到它这⾥。
down标记服务器永久停机了。
注意:
在轮询中,如果服务器down掉了,会⾃动剔除该服务器。
缺省配置就是轮询策略。
此策略适合服务器配置相当,⽆状态且短平快的服务使⽤。
弊端:
轮询策略弊端,不能解决session共享问题。如我访问⼀个⽹站,同时会发出多个不同请求,打到不同的服务器上,再把结果返回给客户端。
不同的请求,seeesion不同。
Session共享问题解决⽅案:
由于请求先通过Nginx代理服务器,再有nginx服务器分配请求到具体的应⽤服务器中间就会遇到Session共享问题:
1.ip_hash 根据ip分配请求的应⽤服务器
2.不使⽤session,换cookie就不会存在此问题,但是⽹站安全度降低
3.使⽤cookie和redis缓存(建议此⽅案,⽅便扩展,缓存中速度⾼效)
例如:⽣成⼀个uuid作为⽤户信息的key存放在redis缓存中,再将uuid作为cookie的值写会客户端,cookie的key可以⽤固定值(常量)
4.放到MySQL数据库中,不推荐(增加数据库的io)
5.⾃⼰修改编写nginx的程序
参考链接:
⼆、权重
在轮询策略的基础上制定轮询的⼏率。例如
upstream foo {
server localhost:8001 weight=2;
赚钱的方法
server localhost:8002;
server localhost:8003 backup;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
这⾥例⼦中,weight参数⽤于制定轮询的⼏率,weight默认值为1;weight的数值和被访问的⼏率成正⽐。
注意:
权重越⾼分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使⽤。
此策略⽐较适合服务器的硬件配置差别⽐较⼤的情况。
三、ip_hash
负载均衡器按照客户端IP地址的分配⽅式,可以确保相同客户端的请求⼀直发送到相同的服务器。这样每个访客都固定访问⼀个后端服务器。
(每个请求按访问ip的hash结果进⾏分配,这样每个访客固定访问⼀个后端服务器,可以解决session问题)
upstream foo {
ip_hash;
server localhost:8001
server localhost:8002;
server localhost:8003;
server localhost:8004;
}
注意:
在nginx版本1.3.1之前,不能在ip_hash中使⽤权重(weight)。
ip_hash不能与backup同时使⽤。
此策略适合有状态服务,⽐如session。
当有服务器需要剔除,必须⼿动down掉。
四、least_conn 最⼩连接
把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载⼤
致相同;但是,有些请求占⽤的时间很长,会导致其所在的后端负载较⾼。这种情况下,least_conn这种⽅式就可以达到更好的负载均衡效果。
upstream foo {
least_conn;
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003 backup;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
注意:
此负载均衡策略适合请求处理时间长短不⼀造成服务器过载的情况。
除了上⾯这些调度策略之后,还有⼀些第三⽅的调度策略可以集成到nginx中。
在实际运⽤中,需要根据不同的场景选择不同的策略,⼤多是多种策略结合使⽤以达到实际需求的性能