Nginx 反向代理、负载均衡讲解

举报
程序员-上善若水 发表于 2022/06/23 23:50:12 2022/06/23
【摘要】 Nginx高可用 一、nginx优点 占内存小,可以实现高并发连接、处理响应快。 可以实现http服务器、虚拟主机、反向代理、负载均衡。 nginx配置简单 可以不暴露真实服务器IP地址 二、ngi...

Nginx高可用

一、nginx优点

占内存小,可以实现高并发连接、处理响应快。
可以实现http服务器、虚拟主机、反向代理、负载均衡。
nginx配置简单
可以不暴露真实服务器IP地址

二、nginx.conf文件的结构

nginx的配置由特定的标识符(指令符)分为多个不同的模块。
指令符分为简单指令和块指令。

  1. 简单指令格式:[name parameters;]
  2. 块指令格式:和简单指令格式有一样的结构,但其结束标识符不是分号,而是大括号{},块指令内部可以包含simple directives 和block directives, 可以称块指令为上下文(e.g. events, http, server, location)
    conf文件中,所有不属于块指令的简单指令都属于main上下文的,http块指令属于main上下文,server块指令http上下文。

三、配置静态访问

Web server很重要一部分工作就是提供静态页面的访问,例如images, html page。nginx可以通过不同的配置,根据request请求,从本地的目录提供不同的文件返回给客户端。
打开安装目录下的nginx.conf文件,默认配置文件已经在http指令块中创建了一个空的server块,在nginx-1.8.0中的http块中已经创建了一个默认的server块。内容如下:

server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        } 
}  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

四、nginx实现反向代理

反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务0器。

nginx.conf配置

 server {
        listen       80;
        server_name  192.168.2.104;
        location / {
		    proxy_pass  http://127.0.0.1:8080;
			index  index.html index.htm;
        }
    }
     server {
        listen       80;
        server_name  192.168.2.104;
        location / {
		    proxy_pass  http://127.0.0.1:8081;
			index  index.html index.htm;
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

五、Location正则表达式

location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

  1. location的语法

    1. 以=开头表示精确匹配

    2. 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。

    3. ^~ 开头表示uri以某个常规字符串开头,不是正则匹配

    4. ~ 开头表示区分大小写的正则匹配;

    5. ~* 开头表示不区分大小写的正则匹配

    6. / 通用匹配, 如果没有其它匹配,任何请求都会匹配到

  2. 精确匹配 ,/ 后面不能带任何字符

    server {
            listen       80;
            server_name  192.168.2.104;
    		#精确匹配,注解后面不能带任何字符
            location =/ {
    		    proxy_pass  http://127.0.0.1:8081;
                index  index.html index.htm;
            }
    }
    
        
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  3. 以开头/abc拦截 默认开启不区分大小写

server {
        listen       80;
        server_name  192.168.2.104;
###  以开头/abc 最终跳转到http://127.0.0.1:8081/;
        location /abc/ {
		    proxy_pass http://127.0.0.1:8081;
            index  index.html index.htm;
        }
		###  以开头/asd 最终跳转到http://127.0.0.1:8082/;
		location /asd/ {
		    proxy_pass http://127.0.0.1:8082/;
            index  index.html index.htm;
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

六、nginx实现负载均衡

负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。

负载均衡策略

1. 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver { 
	server 192.168.0.14; 
	server 192.168.0.15; 
} 

  
 
  • 1
  • 2
  • 3
  • 4

2. 指定权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

upstream backserver { 
	server 192.168.0.14 weight=10; 
	server 192.168.0.15 weight=10; 
} 

  
 
  • 1
  • 2
  • 3
  • 4

3. IP绑定 ip_hash

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream backserver { 
	ip_hash; 
	server 192.168.0.14:88; 
	server 192.168.0.15:80; 
} 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

4. 配置代码

upstream backserver { 
     	server 127.0.0.1:8080; 
     	server 127.0.0.1:8081; 
    } 

    server {
        listen       80;
        server_name 192.168.2.104;
        location / {
		    proxy_pass  http://backserver;
			index  index.html index.htm;
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

七、故障转移

当上游服务器(真实访问服务器),一旦出现故障或者是没有及时相应的话,应该直接轮训到下一台服务器,保证服务器的高可用。
Nginx配置代码

upstream backserver { 
     	server 127.0.0.1:8080; 
     	server 127.0.0.1:8081; 
    } 
 server {
        listen       80;
        server_name  192.168.2.104;
        location / {
		
		    proxy_pass http://backServer;
		    index  index.html index.htm;
			proxy_connect_timeout 1s;  #nginx与上游服务器(真实访问的服务器)超时时间 后端服务器连接的超时时间_发起握手等候响应超时时间
            proxy_send_timeout 1s;  #nginx发送给上游服务器(真实访问的服务器)超时时间
            proxy_read_timeout 1s;  # nginx接受上游服务器(真实访问的服务器)超时时间**
           
        }
    }

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

八、nginx rewrite

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。rewrite只能放在server{},location{},if{}中,并且只能对域名后边的除去传递的参数外的字符串起作用。Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。
Rewrite全局变量:

变量 含义
$args 这个变量等于请求行中的参数,同$query_string
$content length 请求头中的Content-length字段。
$content_type 请求头中的Content-Type字段。
$document_root 当前请求在root指令中指定的值。
$host 请求主机头字段,否则为服务器名称。
$http_user_agent 客户端agent信息
$http_cookie 客户端cookie信息
$limit_rate 这个变量可以限制连接速率。
$request_method 客户端请求的动作,通常为GET或POST。
$remote_addr 客户端的IP地址。
$remote_port 客户端的端口。
$remote_user 已经经过Auth Basic Module验证的用户名。
$request_filename 当前请求的文件路径,由root或alias指令与URI请求生成。
$scheme HTTP方法(如http,https)。
$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name 服务器名称。
$server_port 请求到达服务器的端口号。
$request_uri 包含请求参数的原始URI,不包含主机名,如”/foo/bar.php?arg=baz”。
$uri 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri 与$uri相同。
  1. 判断IP地址来源

    if  ($remote_addr = 192.168.2.104) {  
       return 403;  
    }  
    
        
       
    • 1
    • 2
    • 3
  2. 限制浏览器访问

    ## 不允许谷歌浏览器访问 如果是谷歌浏览器返回404
     if ($http_user_agent ~ Chrome) {   
         return 500;  
     }
    
        
       
    • 1
    • 2
    • 3
    • 4

文章来源: blog.csdn.net,作者:小毕超,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_43692950/article/details/107451794

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。