D8-Nginx-Proxy+Balance

简介:

D8-Nginx-Proxy+Balance

内容:

1 HTTP代理模块(HTTP Proxy)

2 HTTP负载均衡模块

3 例子:Nginx 代理 VMware Vsphere Web Client (Https/SSL)

 

 

 

1 HTTP代理模块(HTTP Proxy)
这个模块可以转发请求到其他的服务器
HTTP/1.0无法使用keepalive(后端服务器将为每个请求创建并且删除连接)。nginx为浏览器发送HTTP/1.1并为后端服务器发送HTTP/1.0,这样浏览器(nginx?)就可以为浏览器处理keepalive。
如下例:

 
  1. location / { 
  2.   proxy_pass        http://localhost:8000; 
  3.   proxy_set_header  X-Real-IP  $remote_addr; 

注意当使用http proxy模块(甚至FastCGI),所有的连接请求在发送到后端服务器之前nginx将缓存它们,因此,在测量从后端传送的数据时,它的进度显示可能不正确。

//proxy_pass
语法:proxy_pass URL
默认值:no
使用字段:location, location中的if字段
这个指令设置被代理服务器的地址和被映射的URI,地址可以使用主机名或IP加端口号的形式,例如:

 
  1. proxy_pass http://localhost:8000/uri/; 

或者一个unix socket

 
  1. proxy_pass http://unix:/path/to/backend.socket:/uri/; 

路径在unix关键字的后面指定,位于两个冒号之间
注意:HTTP Host头没有转发,它将设置为基于proxy_pass声明,例如,如果你移动虚拟主机example.com到另外一台机器,然后重新配置正常(监听example.com到一个新的IP),同时在旧机器上手动将新的example.comIP写入/etc/hosts,同时使用proxy_pass重定向到http://example.com, 然后修改DNS到新的IP。
当传递请求时,Nginx将location对应的URI部分替换成proxy_pass指令中所指定的部分,但是有两个例外会使其无法确定如何去替换:

location通过正则表达式指定
在使用代理的location中利用rewrite指令改变URI,使用这个配置可以更加精确的处理请求(break):

 
  1. location  /name/ { 
  2.   rewrite      /name/([^/] +)  /users?name=$1  break; 
  3.   proxy_pass   http://127.0.0.1; 


这些情况下URI并没有被映射传递。
此外,需要标明一些标记以便URI将以和客户端相同的发送形式转发,而不是处理过的形式,在其处理期间:

    两个以上的斜杠将被替换为一个: ”//” – ”/”;
    删除引用的当前目录:”/./” – ”/”;
    删除引用的先前目录:”/dir /../” – ”/“。

如果在服务器上必须以未经任何处理的形式发送URI,那么在proxy_pass指令中必须使用未指定URI的部分:

 
  1. location  /some/path/ { 
  2.   proxy_pass   http://127.0.0.1; 


在指令中使用变量是一种比较特殊的情况:被请求的URL不会使用并且你必须完全手工标记URL。
这意味着下列的配置并不能让你方便的进入某个你想要的虚拟主机目录,代理总是将它转发到相同的URL(在一个server字段的配置)

 
  1. location / { 
  2.   proxy_pass   http://127.0.0.1:8080/VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot; 

解决方法是使用rewrite和proxy_pass的组合

 
  1. location / { 
  2.   rewrite ^(.*)$ /VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot$1 break; 
  3.   proxy_pass   http://127.0.0.1:8080; 


这种情况下请求的URL将被重写, proxy_pass中的拖尾斜杠并没有实际意义。
如果需要通过ssl信任连接到一个上游服务器组,proxy_pass前缀为 https://并且同时指定ssl的端口,如:

 
  1. upstream backend-secure { 
  2.   server 10.0.0.20:443; 
  3.   
  4. server { 
  5.   listen 10.0.0.1:443; 
  6.   location / { 
  7.     proxy_pass https://backend-secure; 
  8.   } 



2 HTTP负载均衡模块
这个模块为后端的服务器提供简单的负载均衡(轮询(round-robin)和连接IP(client IP))如下例:

 
  1. upstream backend  { 
  2.   server backend1.example.com weight=5
  3.   server backend2.example.com:8080; 
  4.   server unix:/tmp/backend3; 
  5.   
  6. server { 
  7.   location / { 
  8.     proxy_pass  http://backend; 
  9.   } 


//ip_hash
语法:ip_hash
默认值:none
使用字段:upstream
这个指令将基于客户端连接的IP地址来分发请求
哈希的关键字是客户端的C类网络地址,这个功能将保证这个客户端请求总是被转发到一台服务器上,但是如果这台服务器不可用,那么请求将转发到另外的服务器上,这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重(weight)与ip_hash联合使用来分发连接。如果有某台服务器不可用,你必须标记其为“down”,如下例:

 
  1. upstream backend { 
  2.   ip_hash; 
  3.   server   backend1.example.com; 
  4.   server   backend2.example.com; 
  5.   server   backend3.example.com  down; 
  6.   server   backend4.example.com; 


//server
语法:server name [parameters]
默认值:none
使用字段:upstream
指定后端服务器的名称和一些参数,可以使用域名,IP,端口,或者unix socket。如果指定为域名,则首先将其解析为IP
weight = NUMBER - 设置服务器权重,默认为1
max_fails = NUMBER - 在一定时间内(这个时间在fail_timeout参数中设置)检查这个服务器是否可用时产生的最多失败请求数,默认为1,将其设置为0可以关闭检查,这些错误在proxy_next_upstream或fastcgi_next_upstream(404错误不会使max_fails增加)中定义。
fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接请求后这个服务器可能不可用,同样它指定了服务器不可用的时间(在下一次尝试连接请求发起之前),默认为10秒,fail_timeout与前端响应时间没有直接关系,不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。
down - 标记服务器处于离线状态,通常和ip_hash一起使用。
backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙,则使用本服务器(无法和ip_hash指令搭配使用)。

示例配置

 
  1. upstream  backend  { 
  2.   server   backend1.example.com    weight=5
  3.   server   127.0.0.1:8080          max_fails=3  fail_timeout=30s
  4.   server   unix:/tmp/backend3; 


注意:如果你只使用一台上游服务器nginx将设置一个内置变量为1即max_fails和fail_timeout参数不会被处理
结果:如果nginx不能连接到上游,请求将丢失。
解决:使用多台上游服务器。


//upstream
语法:upstream name { … }
默认值:none
使用字段:http
这个字段设置一群服务器,可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体,它们可以是监听不同端口的服务器,并且也可以是同时监听TCP和Unix socket的服务器
服务器可以指定不同的权重默认为1
示例配置

 
  1. upstream backend { 
  2.   server backend1.example.com weight=5
  3.   server 127.0.0.1:8080       max_fails=3  fail_timeout=30s
  4.   server unix:/tmp/backend3; 

请求将按照轮询的方式分发到后端服务器,但同时也会考虑权重
在上面的例子中如果每次发生7个请求,5个请求将被发送到backend1.example.com,其他两台将分别得到一个请求,如果有一台服务器不可用,那么请求将被转发到下一台服务器,直到所有的服务器检查都通过。如果所有的服务器都无法通过检查,那么将返回给客户端最后一台工作的服务器产生的结果。


3 例子:
//代理 vmware vsphere web client 为例

URL  https://client.test.com/vsphere-client/
过程  client -> nginx 443 -> tomcat 443

nginx proxy 
  rhel5.4 192.168.57.71/10.0.100.71
tomcat  web client server 
  windows 2k3 server 10.0.100.83

#nginx 代码

 
  1. #nginx 代理相关参数
  2. proxy_redirect off; 
  3. proxy_set_header Host $host; 
  4. proxy_set_header X-Real-IP $remote_addr; 
  5. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
  6. client_max_body_size 50m; 
  7. client_body_buffer_size 256k; 
  8. proxy_connect_timeout 30; 
  9. proxy_send_timeout 30; 
  10. proxy_read_timeout 60; 
  11. proxy_buffer_size 4k; 
  12. proxy_buffers 4 32k; 
  13. proxy_busy_buffers_size 64k; 
  14. proxy_temp_file_write_size 64k; 
  15. proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; 
  16. proxy_max_temp_file_size 128m; 
  17. proxy_store on; 
  18. proxy_store_access user:rw group:rw all:r; 
  19.  
  20. upstream vsphere_web_client 
  21.    server 10.0.100.83:443 weight=1 max_fails=2 fail_timeout=30s
  22.  
  23. server { 
  24.         listen          443 ssl; 
  25.         server_name     client.test.com
  26.   
  27.         access_log      /data/logs/client.test.com/access.log; 
  28.         error_log       /data/logs/client.test.com/error.log; 
  29.   
  30.         ssl_certificate      ssl/server.crt; 
  31.         ssl_certificate_key  ssl/server.key; 
  32.  
  33.         keepalive_timeout    60; 
  34.   
  35.         if ($host !~ "client.test.com") 
  36.         { 
  37.           return 403; 
  38.         } 
  39.  
  40.         location / 
  41.         { 
  42.           proxy_pass  https://vsphere_web_client; 
  43.         } 
  44.  

//nginx ssl 可以参考这里



PS:proxy_pass 代理得不到客户端ip 地址问题

//nginx 日志格式

 
  1. log_format  access  '$remote_addr - $remote_user [$time_local] "$request" ' 
  2.                     '$status $body_bytes_sent "$http_referer" ' 
  3.                     '"$http_user_agent" $http_x_forwarded_for'; 

#nginx 代码

 
  1. location ^~ /fashion/pic/ 
  2. {   
  3.   proxy_pass http://blog.test.com/; 
  4. }   

#nginx 日志

 
  1. 192.168.57.75 - - [21/Aug/2012:11:00:10 +0800] "GET / HTTP/1.0" 200 6153 "-" \
  2. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1"\
  3. - #注意这里


//添加proxy_set_header 语句
#nginx 代码

 
  1. location ^~ /fashion/pic/ 
  2. {   
  3.   proxy_pass http://blog.test.com/; 
  4.   proxy_set_header X-Forwarded-For $remote_addr; 

#nginx 日志  

 
  1. 192.168.57.75 - - [21/Aug/2012:11:52:40 +0800] "GET / HTTP/1.0" 200 6156 "-" \
  2. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1" \
  3. 192.168.4.33 #注意这里




参考
HTTP代理模块(HTTP Proxy)

HTTP负载均衡模块

 

结束
更多请:
linux 相关 37275208
vmware 虚拟化相关  166682360


本文转自 dongnan 51CTO博客,原文链接:http://blog.51cto.com/dngood/994421


相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
8月前
|
监控 网络协议 应用服务中间件
nginx--虚拟主机 server、状态模式
nginx--虚拟主机 server、状态模式
nginx--虚拟主机 server、状态模式
|
应用服务中间件 Apache nginx
Nginx反向代理之proxy_redirect详解
今天在做nginx反向代理apache的时候出了一点点问题,原来后端apache用的端口是8080通过反向代理后,使用wireshark抓包发现location头域数值为http://192.168.1.154:8080/wuman/ 如果把这个返回给客户端肯定是不可以的,看起来别扭而且还暴露了apache的具体信息 所以在这里用到了nginx的proxy_redirect指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值 以下是截取nginx的一小段配置文档
2846 0
|
网络协议 应用服务中间件 API
Nginx反向代理配置之proxy_pass
Nginx反向代理配置之proxy_pass
254 0
Nginx反向代理配置之proxy_pass
|
监控 网络协议 应用服务中间件
|
应用服务中间件 nginx
在nginx中配置proxy_pass
在nginx中配置proxy_pass
141 0
|
监控 应用服务中间件 nginx
|
运维 负载均衡 Cloud Native
Nginx + UpSync + Consul 实现 Dynamic Upstream
Nginx + UpSync + Consul 实现 Dynamic Upstream
507 0
Nginx + UpSync + Consul 实现 Dynamic Upstream