Nginx
Nginx简介
- 反向代理
- 负载均衡
- 动静分离
- 高可用
Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
**正向代理:**客户端依靠代理服务器(即在客户端配置代理服务器)从局域网向internet访问。
**反向代理:**反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
负载均衡
**动静分离:**动态资源和静态资源分散到不同服务器上。也可以认为使用 nginx 处理静态页面,tomcat 处理动态页面。
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。
具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
Nginx命令
如果是直接在linux中用压缩包安装的话,nginx使用命令时必须在/usr/local/nginx/sbin下执行命令。
-
开启nginx:./nginx
-
关闭nginx:./nginx -s stop
-
重新加载nginx:./nginx -s reload
但是本人用的是docker,经过我的测试,进入容器后可以不用在/usr/local/nginx/sbin下执行命令,而是在根目录就可以执行。
-
查看nginx版本:nginx -v
-
开启nginx:nginx
-
关闭nginx:nginx -s stop
-
重新加载nginx:nginx -s reload
Nginx配置文件
Nginx配置文件分为三大块儿:
-
全局块:从配置文件开始到 events 块 之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
-
events块:events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
-
http块:配置最频繁的部分,如反向代理,负载均衡,动静分离,高可用。代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。
三大块中的小块:
-
http全局块:http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
-
server:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
-
全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
-
location 块:一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
注意:docker的所在宿主机的位置 /var/lib/docker/容器ID,并且可以在 .json结尾的文件中修改容器对外映射端口号。然后重启docker即可。
Nginx实例
浏览器通过访问nginx反向代理服务器实现对tomcat主页的访问。
在进行反向代理过程中,location块有时会有正则表达式:
- docker的nginx容器反向代理配置:进入nginx.conf文件,在 http块 下的 server块 配置 (listen - - - >外部访问端口号 和 server_name - - ->外部访问ip ),之后在 server 块的 location块中配置 (proxy_pass http://ip:port; ),必要时可以在location后加入正则表达式。
- docker的nginx容器负载均衡配置:进入nginx.conf文件,在http 块下的 server块 上方加入 upstream myserver 块并配置(server ip:port; ),同样在server块中配置 listen 和 server_name ,在server块的location块中配置(proxy_pass http://myserver; )
Nginx的负载均衡策略:
-
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
-
weight:weight 代表权重,默认为 1,权重越高被分配的客户端越多。
- ip_hash:每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
- fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
- docker的nginx容器动静分离配置,在根目录下创建了 /nginxstatic/www 和 /nginxstatic/image 两个文件充当静态资源,并在nginx.conf的 location块 中配置。
Nginx原理
linux查看应用进程:ps -ef | grep 应用名
一个master和多个worker的好处:
-
利于进行热部署。
-
每个worker是独立的进程,不需要加锁(节省了锁的开销),如果有一个worker出现了问题,其他worker会继续争抢,实现请求过程,不会造成服务器的中断。
**注意:**worker 数和服务器的 cpu 数相等是最为适宜的。
连接数 work_connection:
这个值是表示每个 worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于HTTP 请 求 本 地 资 源 来 说 , 能 够 支 持 的 最 大 并 发 数 量 是 worker_connections * worker_processes,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该worker_connections * worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。