Nginx之upstream和proxy模块使用
一、模块简介
ngx_http_upstream_module模块用于定义可以由proxy_pass、fastcgi_pass、uwsgi_pass、scgi_pass、memcached_pass和grpc_pass指令引用的服务器组。
二、示例
upstream feng { server 192.168.1.1:8080 weight = 8; server www.feng.club weight = 2; } server { location / { proxy_pass http://feng; } }
注意:upstream定义在http下!!!
三、upstream指令
1.分组的方法
upstream的作用是定义一组服务器,服务器可以在不同的监听端口,还可以混合使用侦听TCP和UNIX套接字的服务器。
官方文档示例:
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; }
定义服务器address和其他parameters服务器。
该地址可以指定为域名或IP地址(IP:端口,如果不加端口,默认为80),也可以指定为 unix:
”前缀后指定的UNIX域套接字路径。
2.负载均衡的算法
①WRR(WeightedRound-Robin)
在示例配置中,每10个请求将如下分配:向192.168.1.1:8080发送8个请求,向www.fengcc.club发送2个请求。如果在与upstream定义的服务器通讯时发生错误,那么nginx会把请求传递给下一个服务器。
配置权重的方法是定义关键字"weight"
weight = number注:如果不定义,默认值为1
②RR(Round-Robin)
Nginx默认使用的负载均衡算法是加权轮询算法,依次将请求分配到各个后台服务器中,适用于后台机器性能一致的情况。
挂掉的机器可以自动从服务列表中剔除。
示例: upstream rr { 192.168.1.1; 192.168.1.2; 192.168.1.3; 192.168.1.4; }
③ip_hash
在该方法中,请求将基于客户端IP地址在服务器之间分配。客户端IPv4地址的前三个八位位组或整个IPv6地址用作哈希密钥。该方法确保了来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用。
如果客户请求的此太服务器不可用,则该请求将传递到另一台服务器。
在一定情况下,用户永远请求的是同一台服务器。
示例: upstream rr { ip_hash; 192.168.1.1; 192.168.1.2; 192.168.1.3; }
四、proxy模块介绍
ngx_http_proxy_module
模块允许将请求传递到另一台服务器。
五、示例
location / { proxy_pass http://feng; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
六、proxy_pass的使用
1.proxy_pass的语法
“proxy_pass URL” 设置代理服务器的协议和地址。
作为协议,可以指定为“http”或“https”。
作为URL,可以指定为域名或IP地址+端口。
proxy_pass http://www.feng.club; proxy_pass http://192.168.1.1:8080; proxy_pass http://localhost:8080/url/; proxy_pass http:// unix:/tmp/backend.socket:/ uri /;
2.URI请求传递给服务器的两种方法
①proxy_pass
使用URI指定了伪指令,那么当请求传递到服务器时, 与该位置匹配的请求URI 的一部分 将被伪指令中指定的URI代替:
1 location / { 2 proxy_pass http://127.0.0.1/remote/; 3 }
②proxy_pass
指定为不带URI,在处理更改的URI时传递完整的规范化请求URI。
location /some/path/ { proxy_pass http://127.0.0.1; }
3.无法确定请求URI中要替换的部分
location /name/ { proxy_pass http://127.0.0.1$request_uri; }
在这种情况下,如果在指令中指定了URI,它将照原样传递到服务器,从而替换原始请求URI。
七、proxy_set_header的使用
允许在传递给代理服务器的请求标头中重新定义或附加字段 。该值可以是文本,变量,以及它们的组合 。默认情况下,仅重新定义两个字段:
1 proxy_set_header Host $proxy_host; 2 proxy_set_header Connection close;
如果启用了缓存,则标题栏中的字段“ If-Modified-Since”,“ If-Unmodified-Since”,“ If-None-Match”,“ If-Match”,“ Range”和“ If-Range”原始请求不会传递到代理服务器。
八、简单示例:把自己的域名代理到淘宝(访问自己的域名跳转到淘宝)
Nginx配置如下:
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; gzip on; upstream taobao { server www.taobao.com:443; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/local/nginx/html; } ssl_certificate XXXXX.crt; ssl_certificate_key XXXXX.key; server_name XXXX你的域名; location / { proxy_pass https://taobao; proxy_set_header Host www.taobao.com; } }