Nginx的五大应用场景详解
本文来说下Nginx的五大应用场景
文章目录
- HTTP服务器
- 静态服务器
- 反向代理
- 负载均衡
- 动静分离
- 其他
HTTP服务器
Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。
1、首先在文档根目录Docroot(/usr/local/var/www)下创建html目录, 然后在html中放一个test.html;
2、 配置nginx.conf中的server
user mengday staff;http {server {listen 80;server_name localhost;client_max_body_size 1024M;# 默认locationlocation / {root /usr/local/var/www/html;index index.html index.htm;}}
}
3、访问测试
- http://localhost/ 指向/usr/local/var/www/index.html, index.html是安装nginx自带的html
- http://localhost/test.html 指向/usr/local/var/www/html/test.html
注意:如果访问图片出现403 Forbidden错误,可能是因为nginx.conf 的第一行user配置不对,默认是#user nobody;是注释的,linux下改成user root; macos下改成user 用户名 所在组; 然后重新加载配置文件或者重启,再试一下就可以了, 用户名可以通过who am i 命令来查看。
4、指令简介
- server : 用于定义服务,http中可以有多个server块
- listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口
- server_name : 服务名称,用于配置域名
- location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
- root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到”/”uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
- index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html
5、location uri正则表达式
小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
静态服务器
在公司中经常会遇到静态服务器,通常会提供一个上传的功能,其他应用如果需要静态资源就从该静态服务器中获取。
1、在/usr/local/var/www 下分别创建images和img目录,分别在每个目录下放一张test.jpg
http {server {listen 80;server_name localhost;set $doc_root /usr/local/var/www;# 默认locationlocation / {root /usr/local/var/www/html;index index.html index.htm;}location ^~ /images/ {root $doc_root;}location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {root $doc_root/img;}}
}
自定义变量使用set指令,语法 set 变量名值;引用使用变量名值;引用使用变量名; 这里自定义了doc_root变量。
静态服务器location的映射一般有两种方式:
- 使用路径,如 /images/ 一般图片都会放在某个图片目录下,
- 使用后缀,如 .jpg、.png 等后缀匹配模式
访问http://localhost/test.jpg 会映射到 $doc_root/img
访问http://localhost/images/test.jpg 当同一个路径满足多个location时,优先匹配优先级高的location,由于^~ 的优先级大于 ~, 所以会走/images/对应的location
常见的location路径映射路径有以下几种:
location优先级
当一个路径匹配多个location时究竟哪个location能匹配到时有优先级顺序的,而优先级的顺序于location值的表达式类型有关,和在配置文件中的先后顺序无关。相同类型的表达式,字符串长的会优先匹配。
location优先级从高到底:
(location =) > (location 完整路径) > (location ^~ 路径) > (location , 正则顺序) > (location 部分起始路径) > (/)*
location = / {# 精确匹配/,主机名后面不能带任何字符串 /[ configuration A ]
}location / {# 匹配所有以 / 开头的请求。# 但是如果有更长的同类型的表达式,则选择更长的表达式。# 如果有正则表达式可以匹配,则优先匹配正则表达式。[ configuration B ]
}location /documents/ {# 匹配所有以 /documents/ 开头的请求,匹配符合以后,还要继续往下搜索。# 但是如果有更长的同类型的表达式,则选择更长的表达式。# 如果有正则表达式可以匹配,则优先匹配正则表达式。[ configuration C ]
}location ^~ /images/ {# 匹配所有以 /images/ 开头的表达式,如果匹配成功,则停止匹配查找,停止搜索。# 所以,即便有符合的正则表达式location,也不会被使用[ configuration D ]
}location ~* \.(gif|jpg|jpeg)$ {# 匹配所有以 gif jpg jpeg结尾的请求。# 但是 以 /images/开头的请求,将使用 Configuration D,D具有更高的优先级[ configuration E ]
}location /images/ {# 字符匹配到 /images/,还会继续往下搜索[ configuration F ]
}location = /test.htm {root /usr/local/var/www/htm;index index.htm;
}
注意:location的优先级与location配置的位置无关
反向代理
反向代理应该是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。
反向代理通过proxy_pass指令来实现。
启动一个Java Web项目,端口号为8081
server {listen 80;server_name localhost;location / {proxy_pass http://localhost:8081;proxy_set_header Host $host:$server_port;# 设置用户ip地址proxy_set_header X-Forwarded-For $remote_addr;# 当请求服务器出错去寻找其他服务器proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; }}
当我们访问localhost的时候,就相当于访问 localhost:8081了
负载均衡
负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。
负载均衡通过upstream指令来实现。
RR(round robin :轮询 默认)
每个请求按时间顺序逐一分配到不同的后端服务器,也就是说第一次请求分配到第一台服务器上,第二次请求分配到第二台服务器上,如果只有两台服务器,第三次请求继续分配到第一台上,这样循环轮询下去,也就是服务器接收请求的比例是 1:1, 如果后端服务器down掉,能自动剔除。轮询是默认配置,不需要太多的配置
同一个项目分别使用8081和8082端口启动项目
upstream web_servers { server localhost:8081; server localhost:8082;
}server {listen 80;server_name localhost;#access_log logs/host.access.log main;location / {proxy_pass http://web_servers;# 必须指定Header Hostproxy_set_header Host $host:$server_port;}}
访问地址仍然可以获得响应 http://localhost/api/user/login?username=zhangsan&password=111111 ,这种方式是轮询的
权重
指定轮询几率,weight和访问比率成正比, 也就是服务器接收请求的比例就是各自配置的weight的比例,用于后端服务器性能不均的情况,比如服务器性能差点就少接收点请求,服务器性能好点就多处理点请求。
upstream test {server localhost:8081 weight=1;server localhost:8082 weight=3;server localhost:8083 weight=4 backup;
}
示例是4次请求只有一次被分配到8081上,其他3次分配到8082上。backup是指热备,只有当8081和8082都宕机的情况下才走8083
ip_hash
上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream test {ip_hash;server localhost:8080;server localhost:8081;
}
fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。这个配置是为了更快的给用户响应
upstream backend {fair;server localhost:8080;server localhost:8081;
}
url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {hash $request_uri;hash_method crc32;server localhost:8080;server localhost:8081;
}
以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用。
动静分离
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路。
upstream web_servers { server localhost:8081; server localhost:8082;
}server {listen 80;server_name localhost;set $doc_root /usr/local/var/www;location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {root $doc_root/img;}location / {proxy_pass http://web_servers;# 必须指定Header Hostproxy_set_header Host $host:$server_port;}error_page 500 502 503 504 /50x.html; location = /50x.html { root $doc_root;}}
其他
return指令
返回http状态码 和 可选的第二个参数可以是重定向的URL
location /permanently/moved/url {return 301 http://www.example.com/moved/here;
}
rewrite指令
重写URI请求 rewrite,通过使用rewrite指令在请求处理期间多次修改请求URI,该指令具有一个可选参数和两个必需参数。
第一个(必需)参数是请求URI必须匹配的正则表达式。
第二个参数是用于替换匹配URI的URI。
可选的第三个参数是可以停止进一步重写指令的处理或发送重定向(代码301或302)的标志
location /users/ {rewrite ^/users/(.*)$ /show?user=$1 break;
}
error_page指令
使用error_page指令,您可以配置NGINX返回自定义页面以及错误代码,替换响应中的其他错误代码,或将浏览器重定向到其他URI。在以下示例中,error_page指令指定要返回404页面错误代码的页面(/404.html)。
error_page 404 /404.html;
日志
访问日志:需要开启压缩 gzip on; 否则不生成日志文件,打开log_format、access_log注释
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /usr/local/etc/nginx/logs/host.access.log main;gzip on;
deny 指令
# 禁止访问某个目录
location ~* \.(txt|doc)${root $doc_root;deny all;
}
内置变量
nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。
Nginx的五大应用场景详解相关推荐
- nginx配置文件及工作原理详解
nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...
- Nginx正则表达式之匹配操作符详解
2019独角兽企业重金招聘Python工程师标准>>> Nginx正则表达式之匹配操作符详解 nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewri ...
- nginx下gzip配置参数详解
这篇文章主要介绍了nginx下gzip配置参数详解,本文同时给出了配置例子,以及一些注意事项,需要的朋友可以参考下 Nginx自带的有gzip模块 http://wiki.nginx.org/Ngin ...
- Nginx开启Gzip压缩配置详解
Nginx开启Gzip压缩配置详解 最近生产上发生了一些问题,原先所有的静态资源文件都是经过gzip压缩的,然而这几天突然都没有压缩了,经过一顿排查,发现是Nginx的配置有问题,借此机会详细了解了N ...
- Java EE 8的五大新特性详解
Java EE 8的五大新特性详解 2018.4.3 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. Java EE 8带来了很多新特性,其中最好的新特性有下面五个. 备受期待的Ja ...
- 转:修改ETM,用Ogre实现《天龙八部》地形与部分场景详解
本文主要讲的是<天龙八部>游戏的地形和一部分场景的具体实现,使用C++, Ogre1.6,我摸索了段时间,可能方法用的并不是最好的,但好歹实现了.文章可能讲得有点罗嗦,很多简单的东西都讲了 ...
- Redis(十)——HyperLogLog 基数统计和 Bitmap位图场景详解
文章目录 Redis(十)--HyperLogLog 基数统计和 Bitmap位图场景详解 1.HyperLogLog 基数统计 2.Bitmap位图场景详解 Redis(十)--HyperLogLo ...
- Nginx 自编译及编译参数详解
Nginx Nginx(发音同"engine X")是异步框架的网页服务器,也可以用作反向代理.负载平衡器和HTTP缓存.该软件由俄罗斯程序员伊戈尔·赛索耶夫开发并于2004年首次 ...
- bom event周期_MRP运行五大步骤逻辑详解(含动态安全库存、安全时间、批量计算方法、BOM表扩展方法的详细说明)...
MRP运行五大步骤逻辑详解(含动态安全库存.安全时间.批量计算方法.BOM表扩展方法的详细说明) 作者:袁云飞(AlbertYuan)- 微信号yuanalbert 以下内容均为原创,希望对初学者有一 ...
最新文章
- 低版本jdbc连接高版本oracle,转:oracle11g的JDBC连接 URL和之前的版本有一定的区别...
- 清华大学:2021 元宇宙研究报告!
- java指定长度数组长度_Java声明数组时不能指定其长度
- 基线长度中误差的计算_电子战支援实施中的测向技术
- 大道至简 爱上Metro
- php double 类型 浮点数相减
- java JDK 自带的 native2ascii 和它的 reverse 命令
- docker设置不同网络和迁移到指定网络
- 别轻易说,我热爱编程,热爱学习
- Ant Design Icon图标使用
- VIN码识别技术加速汽车后市场服务速度
- web前端本科未拿到学位证_您是否需要计算机科学学位才能成为成功的Web开发人员...
- 如何用linux搭建简单的论坛
- 从零开始速通百度云网盘
- 安全大数据的7个V——大数据基础问题与信息安全的交叉探究
- OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...
- L3-1 千手观音【拓扑排序】
- mac安装zsh和oh my zsh,并配置显示历史命令
- 获取当前客户端ip,并且根据ip获取当前城市和天气
- 知道一个IP地址,如何计算出它的子网掩码