nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
使用nginx可以实现动态资源和静态资源的分离
#拦截后台请求
location / {
proxy_pass http://localhost:8080;
proxy_set_header X-Real-IP $remote_addr;
}
#拦截静态资源
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|js|css)$ {
root /opt/static;
}
nginx的负载均衡算法主要有轮询,ip_hash,权重,随机等算法,通过upstream模块来实现。
upstream定义了一组服务,服务可以监听不同的端口,并且服务可以是TCP服务或unix域套接字(UNIX-domain sockets)。
下面是官方给的一个定义示例:
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
server backup1.example.com backup;
}
nginx默认使用了轮询算法实现负载均衡,这里发送请求,较多的请求会落在第一个服务上,少部分请求会落在第二个或者第三个服务上,第四个服务用backup标识,如果前面三个服务都异常,则会去请求第四个服务。
示例中server后面跟了一些参数除了示例中出现的,server后面还可以添加其他参数,常用的几个参数定义如下:
nginx内置了基于ketama一致性算法的负载均衡方法,该方法基于Memcached缓存实现,如果新增或者删除一个服务,会导致大部分缓存失效然后重新映射。常用的url_hash只需要把hash的值设为请求的url即可,示例如下**。**
upstream urlhash {
hash $request_uri;
server 127.0.0.1:8080;
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
ip_hash策略将客户端的IP作为hash算法的关键字来进行请求的分配,确保从同一个客户端发来的请求,会被分配到同一个服务上,除非服务不可用了,如果要删除一个服务,不能直接删除,用down标识,如果直接删除,那么就会重新对ip进行hash操作,之前的请求就不一定能落在原来的服务上。
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
通过weight=number实现
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com weight=3;
server backend3.example.com weight=2;
}