nginx实现常见场景

综合技术 2018-12-09 阅读原文

Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能。我们在日常开发中使用到Nginx的主要有以下几个场景:

  • Nginx作为http服务器
  • 跨域请求
  • 负载均衡
  • 网络资源的动静分离

nginx作为http服务器

Nginx本身是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如下,我们使用Nginx来部署一个打包好的vue项目

#vue项目
server
{
     listen 8081; #监听端口
     server_name 209.250.235.145; 
     root /app/vue/dist/; # 我们的资源在服务器中的路径
     index index.html; #指定资源的入口文件
}复制代码

完成后我们nginx -s reload一下,然后访问209.250.235.145:8081,只要路径没错静态资源就访问的到了

跨域请求

前后端分离的项目中由于前后端项目分别部署到不同的服务器上,我们首先遇到的问题就是跨域,在这个场景我们下nginx可以帮助我们很好地解决这个问题

#跨域请求server
server{
	listen 9000;
	server_name 209.250.235.145;
	root /app/crossDomain/;
	index index.html;
	
	location /douban/ { #添加访问目录为/apis的代理配置
		rewrite   ^/douban/(.*)$ /$1 break;
		proxy_pass   https://m.douban.com;
   }
}
复制代码

在我的服务器下我写了一个

index.html请求豆瓣接口,模拟跨域

function nginxClick(){
	$.ajax({
		url: '/douban/rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3',
		dataType: 'json',
		type: 'get',
		data: "",
		success:(res)=>{
		    console.log(res)
		}
	})
}
复制代码

当我们访问点击请求时,匹配到 location下的 /douban/

rewrite   ^/douban/(.*)$ /$1 break;复制代码

这段配置将请求路径重写为/ rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3,其中$1代表正则模糊匹配到的第一个参数,

proxy_pass   https://m.douban.com;复制代码

这段配置是将请求域名代理到豆瓣的域名下面,所以从本地服务器发出去的请求将被重新重写为:

https://m.douban.com/rexxar/api/v2/muzzy/columns/10018/items?start=0&count=3,我们就能拿到豆瓣api提供的数据。详情可以看看这篇文章

演示地址: http://209.250.235.145:9000/

负载均衡

负载均衡也是Nginx常用的一个功能,主要的是利用 upstream 来定义集群服务器。负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略

  • RR(默认) :每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除
  • 权重 :指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
  • ip_hash :上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

这里用第二900种策略来模拟实现了下负载均衡(同一台服务器上的两个端口起了两个node服务。)

使用 upstream定义服务器 

upstream smile.com{	
	server 209.250.235.145:9001 weight=1;
	server 209.250.235.145:9002 weight=2;
}复制代码
server{
	listen  9003;
	server_name 209.250.235.145;
	
	location / {
		proxy_pass		http://smile.com;
		proxy_redirect 		default;
	}
}复制代码

当我们访问9003这个端口时,会根据我们设置的权重不同分别落在不同的服务器(端口)。

演示地址: http://209.250.235.145:9003/

网络资源的动静分离

当我们的请求涉及静态资源时,我们可以将请求分发到不同的服务器。

#动静分离server
    upstream static {
	    server 209.250.235.145:9006;
    }
    server{
        listen 9005;
	    server_name 209.250.235.145;
	    root /app/dynSta;
		
	    location ~ .*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
            proxy_pass http://static;
        }
    }
    server{
        listen 9006;
	   server_name 209.250.235.145;
	   root /app/dynSta;
    }
复制代码

我们定义了一个

为静态资源新增了一个端口,并添加到

upstream模块,当我们的location匹配到以

(gif|jpg|jpeg|png|bmp|swf|css|js)结尾的文件时,我们都会把请求转发到9006这个端口下(好想成为土豪,好想拥有两台服务器啊啊啊啊。。)

nginx除了以上的使用场景外,还可以用来适配pc和移动环境

适配pc和移动环境

#适配pc环境和移动环境
	server{
		listen 9007;
		server_name 209.250.235.145;
		root /app/pcAndh5/;
		index pc.html;
		
		location / {
			if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
				set $mobile_request '1';
			}
			if ($mobile_request = '1') {
				rewrite ^.+ https://www.baidu.com/;
				
			}
        }
    }
复制代码

这里我们使用nginx内置变量 $http_user_agent来匹配请求的来源,当来源是 (Android|webOS|iPhone|iPod|BlackBerry)时,我们将请求整个重写,让他去访问百度,否则访问我服务器的地址。

演示地址: http://209.250.235.145:9007/

以上就是nginx服务器在我们日常开发中使用到的场景

稀土掘金

责编内容by:稀土掘金阅读原文】。感谢您的支持!

您可能感兴趣的

Disable query buffering in nginx It seems that nginx buffers requests before passing it to the updstream server,while it is OK for most cases for me it i...
Save the Date! NGINX Conf 2018 in Atlanta, October... We at NGINX request the pleasure of your company at NGINX Conf 2018, the fourth annual NGINX conference. It will begin M...
探索HTTP传输中gzip压缩的秘密 为什么要开启gZip 我们给某人发送邮件时,我们在传输之前把自己的文件压缩一下,接收方收到文件后再去解压获取文件。这中操作对于我们来说都已经司空见惯。我们压缩文件的目的就是为了把传输文件的体积减小,加快传输速度。我们在 ...
kubernets: Persistent Volume & Persistent Volu... k8s 1.5版本支持了有状态应用StatefullSet,其中一个很重要的技术支撑点就是,持久化存储。 在前面介绍Statefull的时候,我把涉及到PV的地方改为使用HostPath+nodeSelector来代替了,虽然可以...
一般型网站日志接入大数据日志系统的实现... 0×01 概要 之前的糖果实验室介绍了一般网站的系统的服务器及网络部署的结构,也介绍了大数据平台上的数的流向流程 。我们从整体上对生产环境的情况的有一个俯瞰的视野了解,接下来我们要具体的介绍日志处理的落地方法,用一个看得...