内容简介:Nginx是一款轻量级的HTTP服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的IO性能。我们在日常开发中使用到Nginx的主要有以下几个场景:当我们访问点击请求时,匹配到这段配置将请求路径重写为/
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服务器在我们日常开发中使用到的场景
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 深入解析Redis中常见的应用场景
- Redis常见七种使用场景(PHP实战)
- MySQL 的死锁系列:常见加锁场景分析
- 如何在常见业务场景中使用React Hook
- TCP重置报文段及RST常见场景分析
- HBase场景 | 对比MySQL,一文看透HBase的能力及使用场景
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。