内容简介: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的能力及使用场景
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Writing Apache Modules with Perl and C
Lincoln Stein、Doug MacEachern / O'Reilly Media, Inc. / 1999-03 / USD 39.95
Apache is the most popular Web server on the Internet because it is free, reliable, and extensible. The availability of the source code and the modular design of Apache makes it possible to extend Web......一起来看看 《Writing Apache Modules with Perl and C》 这本书的介绍吧!