nginx反向代理、负载均衡、跨域问题

nginx的应用场景

1、http服务器:Nginx是一个http服务器,可以独立提供http服务。可以作为静态网页服务器。
2、虚拟主机:可以实现一台服务器虚拟出多个网站。例如个人网站使用的虚拟主机。

3、反向代理:当网站的访问量达到一定程度后,单台主机不能满足用户的请求时,需要用多台服务器集群可以使用Nginx做反向代理。
4、负载均衡:并且多台服务器可以平均分担负载,不会因为某台服务器负载高宕机而某台闲置的情况。

1、http反向代理配置

server {
//被监听的端口号
		listen       8080;                                                         
		server_name  localhost;                                               
		client_max_body_size 1024M;
	 
		location / {
		//请求转发到到的端口号
			proxy_pass http://localhost:8082;
			proxy_set_header Host $host:$server_port;
		}
	}

保存配置文件后重启Nginx,当访问localhost的时候,就相当于访问localhost:8080了

2、负载均衡配置

2.1、 负载均衡配置

负载均衡是Nginx常用的一个功能,意思是将请求分摊到多个服务单元上进行执行,例如Web服务器、FTP服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

2.1.1、 RR

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

upstream test {
    server localhost:8080;
    server localhost:8081;
}
server {
    listen       80;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;
 
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

假如upstream中其中一个服务8080挂掉了,访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8081,。因为Nginx会自动判断服务器的状态,如果服务器处于不能访问,就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,这就是Nginx的默认策略RR。

2.1.2 、权重

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

upstream test {
    server localhost:8080 weight=9;
    server localhost:8081 weight=1;
}
server {
    listen       80;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;
 
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

2.1.3 、ip_hash

上面两种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当程序不是无状态的时候(比如服务端采用session保存数据),这时候就有一个很大的很问题。比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用ip_hash了,ip_hash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}
server {
    listen       80;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;
 
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

3、跨域问题

web开发领域中,经常采用前后端分离模式。这种模式下,前端和后端分别是独立的web应用程序,比如后端是Java 程序,前端是React或Vue应用。各自独立的web app在互相访问时,势必存在跨域问题。解决跨域问题一般有两种思路:

CORS:在后端服务器设置HTTP响应头,把你需要运行访问的域名加入加入Access-Control-Allow-Origin中。
jsonp:把后端根据请求,构造json数据,并返回,前端用jsonp跨域。
Nginx针对CORS提供了一种跨域解决方案,比如前端后端存在跨域时,前端和后端如果使用http进行交互,请求会被拒绝。这时候可以通过设置后台服务响应头方式解决。

server {
    listen 8080;
 
    server_name localhost;
 
	location / {
	
	    add_header 'Access-Control-Allow-Origin' '$http_origin';
	    add_header 'Access-Control-Allow-Credentials' 'true';
	    add_header 'Access-Control-Allow-Methods' 'POST, GET, OPTIONS, DELETE, PUT';
	    add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
	
	    #跨域OPTIONS请求,set response header后直接204返回
	    if ($request_method = 'OPTIONS') {
	            return 204;
	    }
	
	    proxy_set_header X-Real-IP $remote_addr;
	    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	
	    proxy_pass http://test;
	}
}
发布了5 篇原创文章 · 获赞 1 · 访问量 109

猜你喜欢

转载自blog.csdn.net/licong1994/article/details/103936241