[Nginx]
Nginx简介
Nginx是一款高性能的http服务器/反向代理服务器及电子邮件代理服务器
应用场景
- http服务器。可以做网页静态服务器
- 虚拟主机。实现再一台服务器虚拟出多个网站。
- 反向代理,负载均衡。令多台服务器可以平均分担负载
常用命令
1 | 1. 启动命令 |
nginx.conf 配置文件
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件
nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
1 | worker_processes 1; |
根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:
第一部分:全局块
- 从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
- 比如上面第一行配置的:worker_processes 1;
- 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
第二部分:events块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。
上述例子就表示每个 work process 支持的最大连接数为 1024.
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
第三部分:http块
- 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
- 需要注意的是:http 块也可以包括 http全局块 、 server 块 。
- http 全局块
http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。 - server 块
- 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
- 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- **1 、全局 server 块:**最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
**2 、location 块:**一个 server 块可以配置多个 location 块。 - 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称也可以是IP别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
- http 全局块
正向代理VS反向代理
正向代理
定义
其实是”代理服务器”代理了”客户端”,去和”目标服务器”进行交互。
通过正向代理服务器访问目标服务器,目标服务器是不知道真正的客户端是谁
用途
突破访问限制
通过代理服务器,可以突破自身IP访问限制,访问国外网站,教育网等。
提高访问速度
通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
隐藏客户端真实IP
上网者也可以通过这种方法隐藏自己的IP,免受攻击。
类比:房东并不知道租客的真实身份。PS:但是中介知道了,可能骚扰更多….
反向代理
定义
其实是”代理服务器”代理了”目标服务器”,去和”客户端”进行交互。
通过反向代理服务器访问目标服务器时,客户端是不知道真正的目标服务器是谁的,甚至不知道自己访问的是一个代理。
用途
隐藏服务器真实IP
使用反向代理,可以对客户端隐藏服务器的IP地址。
负载均衡
反向代理服务器可以做负载均衡,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上。
提高访问速度
反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度
提供安全保障
反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。
区别
1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。
反向代理
反向代理(reverse proxy):是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
实现效果:使用nginx反向代理,根据访问的路径跳转到不同端口的服务中nginx监听端口为 9001
访问
http://192.168.32.132:9001/edu/
直接跳转到192.168.32.132:8081
访问http://192.168.32.132:9001/vod/
直接跳转到192.168.32.132:8082
实验代码
- 第一步,准备两个tomcat,一个 8001 端口,一个 8002 端口,并准备好测试的页面
- 第二步,修改nginx的配置文件
在http块中添加server{}
1
2
3
4
5
6
7
8
9
10server {
listen 9001;
server_name 192.168.32.132; #配置域名或ip
location ~ /edu/ {
proxy_pass http://192.168.32.132:8001;#配置访问路径
}
location ~ /vod/ {
proxy_pass http://192.168.32.132:8002;#配置访问路径
}
}
**血的教训:**千万不要挂梯子去访问Nginx反向代理后访问的Tomcat服务器,会访问失败
**域名绑定:**一个域名对应一个 ip 地址,一个 ip 地址可以被多个域名绑定。
location指令说明:该指令用于匹配 URL。
语法如下:
=
:用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配
成功,就停止继续向下搜索并立即处理该请求。~
:用于表示 uri 包含正则表达式,并且区分大小写。~*
:用于表示 uri 包含正则表达式,并且不区分大小写。^~
:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location块中的正则 uri 和请求字符串做匹配。
注意:如果 uri 包含正则表达式,则必须要有~或者 ~* 标识,记得中间有空格。
负载均衡
负载均衡 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
负载均衡,英文名称为Load Balance,其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
配置负载均衡-准备工作
- 将刚才的存放工程的tomcat复制三份,修改端口分别为8080 ,8081,8082
- 分别启动这三个tomcat服务
- 为了能够区分是访问哪个服务器的网站,可以在首页标题加上标记以便区分
配置负载均衡
修改 Nginx配置文件:
1 | upstream tomcat-travel { |
如果其中一台服务器性能比较好,想让其承担更多的压力,可以设置权重。
比如想让NO.1出现次数是其它服务器的2倍,则修改配置如下:
1 | upstream tomcat-travel { |
分配方式(策略)
轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。weight
weight代表权,重默认为1,权重越高被分配的客户端越多
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
1 | 1.weight |
动静分离
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat处理动态页面
- 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
- 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送
一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304 ,如果有修改,则直接从服务器重新下载,返回状态码200 。
- 实验代码
- 项目资源准备
- 进行nginx配置
找到nginx安装目录,打开/conf/nginx.conf
配置文件
1 | http { |
添加监听端口、访问名字
- 重点是添加location,最后检查 Nginx 配置是否正确即可,然后测试动静分离是否成功,之需要删除后端tomcat服务器上的某个静态文件,查看是否能访问,如果可以访问说明静态资源 nginx 直接返回了,不走后端 tomcat 服务器
原理与优化参数配置
master-workers的机制的好处
首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
需要设置多少个 worker
- Nginx 同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换上下文带来的损耗。
连接数 worker_connection
这个值是表示每个worker进程所能建立连接的最大值,所以,一个nginx能建立的最大连接数,应该是worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections *worker_processes,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是HTTP作为反向代理来说,最大并发数量应该是worker_connections *worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。