Nginx实现负载均衡以及跨域问题解决

软负载和硬负载的区别

软负载

软负载是基于服务器安装的特定软件,比如:nginx实现负载均衡。

硬负载

硬负载均衡是基于固定的硬件实现负载均衡,比如:F5。

基于Nginx实现反向代理

在nginx.conf配置文件中配置如下:

server {
        listen       80;
        server_name  www.mayikt.com;   #请求的域名
		# 
        location / {
            proxy_pass   http://127.0.0.1:8080;  #将请求转发到这个域名
            index  index.html index.htm;
        }
    }

基于Ngninx实现负载均衡

Nginx负载均衡提供上游服务器(真实业务逻辑访问的服务器),负载均衡、故障转移、失败重试、容错、健康检查等。

当上游服务器(真实业务逻辑访问的服务器)发生故障时,可以转移到其他上游服务器(真实业务逻辑访问的服务器)。

Upstream Server配置

upstream 主要配置如下:

IP地址和端口号:配置上游服务器的IP地址和端口

###定义上游服务器(需要被nginx真实代理访问的服务器) 默认是轮训机制
    upstream  backServer{
	    server 127.0.0.1:8080;
	    server 127.0.0.1:8081;
	}
 	
	server {
        listen       80;
        server_name  www.mayikt.com;
        location / {
		    ### 指定上游服务器负载均衡服务器
		    proxy_pass http://backServer;
            index  index.html index.htm;
        }
    }

五种负载均衡策略

轮询(默认)

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

upstream backserver {
    server 192.168.0.14;
    server 192.168.0.15;
}

指定权重(weight)

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。backup备用服务器,服务器全部崩溃后启动

upstream backserver {
    server 192.168.0.14 weight=3;
    server 192.168.0.15 weight=7;
    server 192.168.0.15 weight=7 backup;
    
}

IP绑定 ip_hash

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

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

fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream backserver {
    server server1;
    server server2;
    fair;
}

url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream somestream {
    hash $request_uri;
    server 192.168.244.1:8080;
    server 192.168.244.2:8080;
    server 192.168.244.3:8080;
    server 192.168.244.4:8080;
 
}
server {
    listen 8081 default;
    server_name test.csdn.net;
    charset utf-8;
    location /get {
    proxy_pass http://somestream;
 
    }  
}

上述同样也是一个极简的监听8081端口的nginx服务,当请求url为/get时,会走url_hash;同样配置了upstream模块,hash $request_uri表明了是按照url规则进行hash策略。

服务器集群的问题

  1. 分布式session的问题—使用springSession解决或者使用Token替代解决。
  2. 分布式重复任务调度—分布式任务调度平台 xxl-job
  3. 分布式日志收集的问题—elk + kafka 日志收集

root和alias命令的区别

  1. alias是一个目录别名的定义。
  2. root是最上层目录的定义。

区别:alias后面必须要用“/”结束,否则会找不到文件的。而root可有可无。

两个命令的作用:都是指定静态文件的目录。

Nginx解决跨域问题

什么是跨域问题?

页面中请求的ajax地址如果与页面请求地址域名和端口、协议不同的话,浏览器采用安全策略,请求能够正常到达服务器端,但是无法获取响应结果。

跨域问题解决方案

  1. 响应头设置允许跨域权限 response.setHeader(“Access-Control-Allow-Origin”, “*”); 适合于小公司

  2. 使用jsonp解决网站跨域问题 缺点:只能支持Get请求 模拟脚本提交。

  3. 使用Nginx搭建API网关保持域名和端口一致 Location

  4. 使用微服务中的Zuul网关

  5. HttpClient实现转发 缺点:重复发送两次请求

配置案例:

使用Nginx搭建API网关保持域名和端口一致。下面配置根据请求路径的不同将请求转发给不同的域名、端口去处理。

location /b {
            proxy_pass   http://192.168.18.190:8081/;
            index  index.html index.htm;
     }

location /a {
proxy_pass   http://192.168.18.190:8080/;
index  index.html index.htm;
}

遇到场景

实际开发中前后端分离

Nginx Location指令详解

通过指定模式来与客户端请求的URI相匹配,基本语法如下:location [=||*|^~|@] pattern{……}

  1. ~ #区分大小写的正则匹配

  2. ~* #不区分大小写的正则匹配

  3. ^~ #普通字符匹配,如果此选项匹配成功,忽略其他匹配选项,一般用来匹配目录

  4. = #普通字符精确匹配

1、没有修饰符 表示:必须以指定模式开始(也就是请求链接以kaico开头),如:

location /kaico{

}
如下匹配正确:
http://baidu.com/kaico/abc
http://baidu.com/kaico/abc?p1
如下匹配错误:
http://baidu.com/abc/kaico/
http://baidu.com/abc/kaicode

2、=表示:必须与指定的模式精确匹配(也就是请求链接必须一致)

location =/kaico{
}

如下匹配正确:
http://baidu.com/kaico
http://baidu.com/kaico?p1
如下匹配错误:
http://baidu.com/kaico/
http://baidu.com/kaicode

3、~ 表示:指定的正则表达式要区分大小写

location ~ ^/abc$ {
    ……
}
如下匹配正确:
http://baidu.com/abc
http://baidu.com/abc?p1=11&p2=22
如下匹配错误:
http://baidu.com/ABC
http://baidu.com/abc/
http://baidu.com/abcde

4、^~ 表示:指定的正则表达式区分大小写,如果此选项匹配成功,忽略其他匹配选项(停止向下搜索),一般用来匹配目录

location ^~ /images/ {
  # 匹配任何以 /images/ 开始的查询并且停止搜索,不检查正则表达式。
  [ configuration C ]
}

5、~* 表示:指定的正则表达式不区分大小写

location ~* ^/abc$ {
    ……
}
如下匹配正确:
http://baidu.com/abc
http://baidu..com/ABC
http://baidu..com/abc?p1=11&p2=22
如下匹配错误:
http://baidu..com/abc/

匹配优先级

查找顺序和优先级
1:带有“=“的精确匹配优先
2:没有修饰符的精确匹配
3:正则表达式按照他们在配置文件中定义的顺序
4:带有“^~”修饰符的,开头匹配
5:带有“~” 或“~*” 修饰符的,如果正则表达式与URI匹配
6:没有修饰符的,如果指定字符串与URI开头匹配

你可能感兴趣的:(服务器,nginx)