设为首页 收藏本站
查看: 788|回复: 0

[经验分享] D8-Nginx-Proxy+Balance

[复制链接]

尚未签到

发表于 2018-11-8 07:10:42 | 显示全部楼层 |阅读模式
  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。
  
如下例:
  


  • location / {
  •   proxy_pass        http://localhost:8000;
  •   proxy_set_header  X-Real-IP  $remote_addr;
  • }
  

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

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


  • proxy_pass http://localhost:8000/uri/;
  

  或者一个unix socket:
  


  • 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):
  


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

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

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

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


  • location  /some/path/ {
  •   proxy_pass   http://127.0.0.1;
  • }
  

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


  • location / {
  •   proxy_pass   http://127.0.0.1:8080/VirtualHostBase/https/$server_name:443/some/path/VirtualHostRoot;
  • }
  

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


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

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


  • upstream backend-secure {
  •   server 10.0.0.20:443;
  • }

  • server {
  •   listen 10.0.0.1:443;
  •   location / {
  •     proxy_pass https://backend-secure;
  •   }
  • }
  

  

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


  • upstream backend  {
  •   server backend1.example.com weight=5;
  •   server backend2.example.com:8080;
  •   server unix:/tmp/backend3;
  • }

  • server {
  •   location / {
  •     proxy_pass  http://backend;
  •   }
  • }
  

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


  • upstream backend {
  •   ip_hash;
  •   server   backend1.example.com;
  •   server   backend2.example.com;
  •   server   backend3.example.com  down;
  •   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指令搭配使用)。
  

  
示例配置
  


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

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

  

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


  • upstream backend {
  •   server backend1.example.com weight=5;
  •   server 127.0.0.1:8080       max_fails=3  fail_timeout=30s;
  •   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
  

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

  
#nginx 代码
  


  • #nginx 代理相关参数
  • proxy_redirect off;
  • proxy_set_header Host $host;
  • proxy_set_header X-Real-IP $remote_addr;
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  • client_max_body_size 50m;
  • client_body_buffer_size 256k;
  • proxy_connect_timeout 30;
  • proxy_send_timeout 30;
  • proxy_read_timeout 60;
  • proxy_buffer_size 4k;
  • proxy_buffers 4 32k;
  • proxy_busy_buffers_size 64k;
  • proxy_temp_file_write_size 64k;
  • proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
  • proxy_max_temp_file_size 128m;
  • proxy_store on;
  • proxy_store_access user:rw group:rw all:r;

  • upstream vsphere_web_client
  • {
  •    server 10.0.100.83:443 weight=1 max_fails=2 fail_timeout=30s;
  • }

  • server {
  •         listen          443 ssl;
  •         server_name     client.test.com;

  •         access_log      /data/logs/client.test.com/access.log;
  •         error_log       /data/logs/client.test.com/error.log;

  •         ssl_certificate      ssl/server.crt;
  •         ssl_certificate_key  ssl/server.key;

  •         keepalive_timeout    60;

  •         if ($host !~ "client.test.com")
  •         {
  •           return 403;
  •         }

  •         location /
  •         {
  •           proxy_pass  https://vsphere_web_client;
  •         }

  • }
  

DSC0000.png

  //nginx ssl 可以参考这里
  

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

  
//nginx 日志格式
  


  • log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
  •                     '$status $body_bytes_sent "$http_referer" '
  •                     '"$http_user_agent" $http_x_forwarded_for';
  

  #nginx 代码
  


  • location ^~ /fashion/pic/
  • {
  •   proxy_pass http://blog.test.com/;
  • }
  

  #nginx 日志
  


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

  
//添加proxy_set_header 语句
  
#nginx 代码
  


  • location ^~ /fashion/pic/
  • {
  •   proxy_pass http://blog.test.com/;
  •   proxy_set_header X-Forwarded-For $remote_addr;
  • }
  

  #nginx 日志
  


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

  

  

  
参考
  
HTTP代理模块(HTTP Proxy)
  

  
HTTP负载均衡模块
  

  

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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-632090-1-1.html 上篇帖子: zabbix对nginx监控 下篇帖子: centos nginx安装教程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表