Nginx
Nginx
概述
什么是Nginx
Nginx 是一个高性能的HTTP和[反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAPIPOP3)代理服务器,在BSD-like协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
Nginx作为服务器
nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如perl、php等。但是不支持 java。Java程序只能通过与tomcat配合完成。Nginx专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考验,有报告表明能支持高达50,000个并发连接数。
反向代理
Nginx不仅可以做反向代理,实现负载均衡,还能用作正向代理进行上网等功能。
正向代理
如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet则需要通过代理服务器访问,这种代理服务就叫做正向代理
反向代理
其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将服务发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器的地址,隐藏了真实的服务器IP地址
负载均衡
负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是 尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。(见得太多了,不用说太多)
动静分离
为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度。降低原来单个服务器的压力。
Nginx安装
在CentOS7下的Linux系统中安装Nginx
官网下载http://nginx.org/en/download.html
使用winSCP将压缩包带入虚拟机中(/usr/local/Nginx)
解压文件
1 | tar -xvf Nginx压缩包名 |
进入解压后的包中
执行命令
1 | ./configure |
安装nginx所需要的配置环境
1 | yum -y install gcc |
安装完成后开始编译nginx
1 | make |
安装完成后可以在/usr/local下看到一个新生成的nginx包
访问/usr/local/nginx/sbin
开启nginx服务
1 | ./nginx |
提前开启端口80
1 | firewall-cmd --zone=public --add-port=80/tcp --permanent |
访问ip地址+端口80
当开启服务时
进入/usr/local/nginx/sbin/
Nginx常用命令
1 | ./nginx -v (查看版本) |
1 | ./nginx -s stop(关闭服务) |
Nginx配置文件
nginx的配置文件在 /usr/local/nginx/conf中
nginx中分为三部分
- 第一部分:全局块
这里的配置主要影响了nginx服务器整体运行的配置指令,包括配置运行Nginx服务器的用户(组)、允许生成worker process数,进程PID存放路径、日志存放路径和类型以及配置文件的引入
例如以下配置 ,这时Nginx服务器并发处理服务的关键配置,worker_processes值越大,可以支持的并发处理量就越多,但是受到硬件和软件等设备的制约
1 | worker_process=1 |
- 第二部分 event块
events 块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。
上述例子就表示每个work process支持的最大连接数为1024,这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。
第三部分 http块
这时Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,http块包括http全局块、server块
- Http全局块
http 全局块配置的指令包括文件引入、MIME-TYPE定义、日志自定义、连接超时时间、单链接请求数上限等。
server块
这块和虚拟主机有密切关系,虚拟主机从用户的角度看,和一台独立的硬件主机是完全一样的,该技术产生是为了节省互联网服务器硬件成本
每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。而每个server 块也分为全局server块,以及可以同时包含多个locaton块。
- 全局server块
- 最常见的配置时本虚拟机主机的监听配置和本虚拟主机的名称和IP配置
- location 块
- 这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string ),对虚拟主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string )进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- 全局server块
Nginx配置实例
反向代理(一)
要达成的效果:打开浏览器,在浏览器地址栏中输入地址:www.123.com跳转到linux系统重的tomcat页面
首先要将Tomcat安装到Linux并开启服务(别忘了开启防火墙端口8080)
打开本地C:\Windows\System32\drivers\etc目录下的hosts文件
向其中添加配置
然后重启nginx
1 | ./nginx -s restart |
然后访问www.123.com
通过配置和达成效果图我们就可以更好的理解注解中的内容
首先 我们在地址栏中输入 www.123.com ,浏览器就在本地域名上查找发现本地域名服务(具体配置在hosts)中将www.123.com这个域名请求到192.168.26.128这个服务器上,nginx服务打开时在随时监听本地IP(192.168.26.128)的80端口,发现请求来了将其解析为 http://127.0.0.1:8080这个请求
反向代理(二)
要实现的效果,我们的虚拟机下有两台tomcat服务器8080 8081 在其/webapps包下分别由/edu/a.html 与 /vod/a.html ,当前端请求端口为9001时nginx将端口抓发到这两个tomcat中,此时如果请求路径中为/vod/*则转发到8081中,若请求路径中有/edu/ *则转发到8080端口中返回不同页面
首先配置两个不同的tomcat,在其config包下将配置文件进行修改,其中 标签connector中的端口为外部所访问tomcat的端口号,默认为8080。配置为一个8080一个8081,在tomcat的安装包下的webapps包下分别创建 目录 vod 加入a.html (输入内容为8081),目录 edu 加入a.html (输入内容为8080)
修改Nginx配置文件
添加以下配置
1 | server { |
其中~ /vod/ 为正则表达式,表示为请求路径中有/vod/
=
精确匹配路径,用于不含正则表达式的 uri 前,如果匹配成功,不再进行后续的查找;^~
用于不含正则表达式的 uri 前,表示如果该符号后面的字符是最佳匹配,采用该规则,不再进行后续的查找;~
表示用该符号后面的正则去匹配路径,区分大小写;~*
表示用该符号后面的正则去匹配路径,不区分大小写。跟 ~
优先级都比较低,如有多个location的正则能匹配的话,则使用正则表达式最长的那个;
如果 uri 包含正则表达式,则必须要有 ~
或 ~*
标志。
重启nginx
1 | ./nginx -s reload |
负载均衡
要到达的效果
继续引用反向代理的两个tomcat服务器
在nginx配置文件中修改配置
- 在http{} 配置中添加
1 | upstream myserver{ |
添加配置
server {
listen 80;
server_name 192.168.26.128;
location / {
root html;
proxy_pass http://myserver;
index index.html index.htm;
}
}
实际上我们在反向代理的基础之上做了一个负载均衡,在反向代理示例1中我们做好的第二个配置但其中稍有修改,我们将转发到的请求(proxy_pass)改为了 一个地址组 myserver
重启nginx服务
负载均衡策略
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,则自动剔除。
例如我们的8080和8081 , 他们轮询顺序即为 8080 、8081、 8080 、8081……
但如果8081或8080其中一台服务挂掉,后面的所有服务都会访问到另一台服务器上
权重
weight代表权重,权重默认为1,权重越高,被分配的客户端请求就会越多。相当于指定了轮训的几率weight和访问率成正比,多用于性能不均的情况
例如:实验室的一台服务器QOS为8000 ,家中的服务器为2000。如果二者为一个tomcat集群,Nginx来做负载均衡,我们就可以根据两台服务器的性能分配权重(实验室weight=4 ,家中weight=1)
我们在配置文件中的配置
ip_hash
每个请求按照访问ip的hash结果分配,这样每个访客固定访问一个后端服务器
当我请求路径,点击了N下刷新后(还是它,“真”一直不变)
fair
根据后端服务器的响应时间来分配请求,响应时间短的优先分配(高版本已被删除)
动静分离
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx :处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。
通过 location指定不同的后缀名实现不同的请求转发。通过 expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
在根目录下创建目录data,在其中创建两个目录image和www,image目录中加入图片123.jpg www其中加入 a.html 如何运用动静分离将这些静态资源访问到
首先在nginx配置文件中
server {
listen 80;
server_name 192.168.26.128;
location /www {
root /data;
index index.htm index.html;
}
location /image {
root /data;
autoindex on;
}
}
root 类似于将访问路径的前缀加上 /data autoindex on ;进入文件夹后是否要创建一个首页面去展示文件内容
重启nginx