引言
- 静态资源WEB服务
- 代理服务
- 负载均衡调度器SLB
- 动态缓存
本文介绍Nginx的二种使用场景----代理服务与负载均衡SLB。
代理服务
- 正向代理
- 反向代理
区别在于代理的对象不一样
正向代理代理的对象是客户端
反向代理代理的对象是服务端
配置语法
Syntax: proxy_pass URL;
Default:--
Context:location,if in location,limit_except
URL示例:
http://localhost:8000/uri
https://localhost:8000/uri
http://unix:/tmp/backend.socket:/uri;
反向代理示例:
location /demo/ {
root /usr/local/apache-tomcat-8.0.45/webapps;
index index.jsp;
proxy_pass http://localhost:8081/demo/;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
正向代理示例:
resolver 8.8.8.8;
location / {
proxy_pass http://$http_host$request_uri;
}
resolver 是作DNS解析的,8.8.8.8是google的dns解析地址。
Nginx作为反向代理__代理配置语法
1.缓冲区的配置:
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
扩展:proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size
2.跳转重定向
Syntax: proxy_redirect default;
proxy_redirect off;
proxy_redirect redirect replacement;
Default:proxy_redirect default;
Context:http, server, location
3.头信息
Syntax: proxy_set_header field value;
Default:proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context:http, server, location
扩展:proxy_hide_header、proxy_set_body
4.超时
Syntax: proxy_connect_timeout time;
Default:proxy_connect_timeout 60s;
Context:http, server, location
扩展:proxy_read_timeout、proxy_send_timeout
实际示例:
location /{
proxy_pass http:127.0.0.1:8080;
proxy_redirect default;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote-addr;
proxy_connect_timeout 30;
proxy_read_timeout:60;
proxy_send_timeout:60;
proxy_buffer_size 32k;
proxy_buffering on;
proxy_buffers 4 128k;
proxy_busy_buffers_size 256k;
proxy_max_tmp_file_size 256k;
}
因为这些常用的配置都是属于通用型的,因此我们可以把它抽取出来,单独放在proxy_params;
location /{
proxy_pass http:127.0.0.1:8080;
include proxy_params;
}
Nginx负载均衡
负载均衡按照范围分类
-
GSLB
SLB
安装网络模型(OSI)分类:
- 四层负载均衡
也就是在四层传输层。处理tcp/ip,TCPI/IP协议的包转发即可,效率很高。
七层负载均衡
处理第七层应用层,如:http信息
Nginx是一个典型的七层负载均衡的SLB。
Nginx负载均衡的原理
配置语法
Syntax: upstream name{ ... } ;
Default:proxy_next_upstream error timeout;
Context:http
必须配置在server层以外。
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/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 /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream imooc{
server 116.62.103.228:8001;
server 116.62.103.228:8002;
server 116.62.103.228:8003;
}
server {
listen 80;
server_name localhost www.gongxu8023.xin
access_log /var/log/nginx/test_proxy.access.log main;
location{
proxy_pass http://imooc;
include proxy_params;
}
}
include /etc/nginx/conf.d/*.conf;
}
upstream举例:
upstream backend{
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
server backend1.example.com:8080 backup;
server.backend2.example.com:8080 backup;
}
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后,服务暂停的时间 |
max_conns | 限制最大的接受的连接数 |
后端服务器在负载均衡调度中的状态
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后,服务暂停的时间 |
max_conns | 限制最大的接受的连接数 |
Nginx作负载均衡服务的轮询策略及加权轮询
加权轮询与轮询的方式都是基于请求来进行分配的。
由于是基于请求进行分配的,有可能导致同一客户端发出的若干请求会被分配到不同的后端上去,由此带来cookie、session等验证不通过。
调度算法解决了上述可能会出现的问题
轮询 | 按时间顺序逐一分配到不同的后端服务器 |
加权轮询 | weight值越大,分配到的访问几率越高 |
ip_hash | 每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器 |
least_conn | 最少链接数,哪个机器连接数少就分发 |
url_hash | 按照访问的url的hash结果来分配请求,是每个URL定向到同一个后端服务器 |
hash关键数值 | hash自定义的key |
示例:
upstream imooc{
ip_hash;
server 116.232.12.23:8001 ;
server 116.232.12.23:8002 ;
server 116.232.12.23:8003 ;
}
url_hash语法
Syntax:hash key [consistent];
Default:--;
Context:upstream
This directive appeared in version 1.7.2
示例:
upstream imooc{
hash $request_uri;
server 116.232.12.23:8001 ;
server 116.232.12.23:8002 ;
server 116.232.12.23:8003 ;
}