【Nginx】Nginx
Nginx 简介
Nginx 1.8.0 下载:https://nginx.org/ ,在Linux上安装见 Linux 开发环境配置文档
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。
Nginx 能用来:
- 反向代理
- 负载均衡
- 动静分离
Nginx 常用命令
- 进入 Nginx 的目录
cd /usr/local/nginx/sbin
- 查看 Nginx 版本号:
1 | ./nginx -v |
- 启动 Nginx(注意在防火墙开放相应的端口号80):
1 | ./nginx |
- 停止 Nginx
1 | ./nginx -s stop |
- 热部署重新加载 Nginx(修改配置文件后需要重新加载)
1 | ./nginx -s reload |
Docker 安装 Nginx 的教程见:http://blog.yuyunzhao.cn/2021/11/09/【Docker】Docker配置实战案例/
Nginx 配置文件
Nginx 配置文件位置: /usr/local/nginx/conf/nginx.conf
配置文件包含三部分内容
- 全局块:配置服务器整体运行的配置指令,比如
worker_processes 1;
处理并发数的配置 events
块:影响 Nginx 服务器与用户的网络连接,比如worker_connections 1024;
支持的最大连接数为1024http
块:是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。包含http
全局块和server
块
全局块:配置服务器整体运行的配置指令
主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process
数(工作进程数),进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
worker_processes
(工作进程数)是 Nginx 服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约,常设置为cpu核数:
events 块:影响 Nginx 服务器与用户的网络连接
events
块涉及的指令主要影响Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work_process
下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word_process
可以同时支持的最大连接数等。
work_process 1024
表示支持的最大并发连接数为 1024
http 块
Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。
http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等:
server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
全局 server 块最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
Nginx 反向代理配置
反向代理作用:屏蔽内网服务器信息,令外部客户端无法直接接触到内网的服务器,而是通过反向代理服务器转发到内网服务器:
- 正向代理:帮忙访问别人,客户端信息被屏蔽
- 反向代理:帮忙被别人访问,服务端信息被屏蔽
配置方法:
- 修改配置文件
server
块的server_name
为本机的ip地址 - 在
location
里添加proxy_pass
代理路径(即要跳转到的路径)
反向代理案例
- 访问
http://192.168.17.129:9001/edu/
直接跳转到127.0.0.1:8080
- 访问
http:// 192.168.17.129:9001/vod/
直接跳转到127.0.0.1:8081
准备工作:
- 准备两个 Tomcat 服务器,一个 8080 端口,一个 8081 端口
- 创建文件夹和测试页面
修改配置文件,监听Nginx所在服务器ip的9001端口,将匹配正则表达/edu/
和/vod/
的请求分别映射到本机Tomcat的8080和8081端口
请求头
Nginx 反向代理时会将请求头信息删掉,导致反向代理后的请求没有消息头 RequestHeader
注意,当使用 Nginx 代理给自己项目的网关服务时,会发生无法转发的情况。这是因为 Nginx 进行反向代理时,会将请求头信息给删掉,然后才转发给网关服务,这就导致了无法访问网关服务。因此需要在 location 中添加请求头信息,代表将原始请求的请求头信息原封不动的转发给网关:
1 | location / { |
注意事项
如果两个不同 server 的块中配置的 server_name
相同,则二者的 location 必须配置相同路径,否则会出现问题。如果必须配置不同的路径,则这两个 server 块中的 server_name
必须设置不同(可以一个 localhost,一个写 ip 地址)
Nginx 负载均衡配置
准备工作
- 准备两台 Tomcat 服务器,一台 8080,一台 8081
- 在两台 Tomcat 里面
webapps
目录中,创建名称是edu
文件夹,在edu
文件夹中创建页面 a.html,用于测试
在 Nginx 的配置文件中进行负载均衡的配置
Nginx 分配服务器策略
第一种 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
第二种 weight
weight 代表权重默认为 1,权重越高被分配的客户端越多
第三种 ip_hash
每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器
第四种 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
Nginx 动静分离配置
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 Nginx 来分开。
通过 location
指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。
准备工作
在 liunx 系统中准备静态资源,用于进行访问:
具体配置
在 Nginx 配置文件中进行配置,重点是修改 location
的 root
目录,令其指向存放静态资源的根目录,这样访问浏览器里的 http://192.168.17.129/www/image/01.jpg 就会映射到服务器中的 /data/image/01.jpg
文件:
测试
浏览器中输入地址 http://192.168.17.129/image/01.jpg
配置文件配置了 autoindex on
,访问image
路径时会展示出image
目录下的所有文件,点击即可下载。
总结
1 | server { |
- root 响应的路径:root 后配置的路径 + 完整访问路径(完整的location配置路径+静态文件)
- alias 响应的路径:alias 后配置路径 + 静态文件(去除location中配置的路径)
使用alias时目录名后面一定要加
“/”
。一般情况下,在 location / 中配置root,在 location /other 中配置alias
示例:上述配置下,请求 http://servername/images/figure1.png 分别访问到的资源路径:
- root:
/data/www/images/figure1.png
- alias:
/data/figure1.png
即:alias 将请求路径中符合 location 的前缀给替换成了 /data
;而 root 则不会进行替换,直接拼接到 /data/www
中。
注意,一旦配置了 location /
,则 root /data/www/
目录下的所有资源文件都可以通过 http://servername/xxx 的形式访问到,因此放在该目录下的文件不需要额外配置路由规则也可直接被外界访问。
Nginx 高可用集群
准备工作
- 需要两台服务器
192.168.17.129
和192.168.17.131
- 在两台服务器安装 nginx
- 在两台服务器安装 keepalived
- 安装 keepalived:
1 | yum install keepalived –y |
- 安装之后,在
/etc/keepalived/
生成文件keepalived.conf
完成高可用配置(主从配置)
- 修改
/etc/keepalived/keepalivec.conf
配置文件
1 | global_defs { |
- 在
/usr/local/src
添加检测脚本
1 |
|
- 把两台服务器上 nginx 和 keepalived 启动
1 | ./nginx |
测试
在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50,发现能正常访问,当关掉一台Nignx服务器后再访问仍然能正常访问
Nginx 原理
Master 和 worker
Master进程为主进程,用于协调管理worker进程,本身并不处理业务。
worker 如何进行工作的
当客户端发来请求时,Master进程将该请求告诉所有能够工作的worker进程,之后多个worker进程争抢该请求,抢到的worker进程将处理该请求,同时woker进程采用多路复用技术,开启唯一线程非阻塞地处理请求。
一个 Master 和多个 woker 有好处
- 可以使用
nginx –s reload
热部署,利用 Nginx 进行热部署操作,当收到请求时,其他不工作的先更新配置,正在工作的进程暂时不更新,当其工作完毕后再更新。 - 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断
设置多少个 woker 合适
worker 数和服务器的 cpu 数相等是最为适宜的
连接数 worker_connection
问题一:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
问题二:Nginx 有一个 Master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?
- 普通的静态访问最大并发数是:
worker_connections * worker_processes /2
- 而如果是 HTTP 作为反向代理来说,最大并发数量应该是
worker_connections * worker_processes/4