【Nginx】Nginx

nginx

Nginx 简介

Nginx 1.8.0 下载:https://nginx.org/ ,在Linux上安装见 Linux 开发环境配置文档

Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

Nginx 能用来:

  • 反向代理
  • 负载均衡
  • 动静分离

Nginx 常用命令

  1. 进入 Nginx 的目录 cd /usr/local/nginx/sbin
  2. 查看 Nginx 版本号:
1
./nginx -v
  1. 启动 Nginx(注意在防火墙开放相应的端口号80):
1
./nginx
  1. 停止 Nginx
1
./nginx -s stop
  1. 热部署重新加载 Nginx(修改配置文件后需要重新加载)
1
./nginx -s reload

https://www.bilibili.com/video/av68136734

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; 支持的最大连接数为1024
  • http 块:是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。包含 http 全局块和 server

image-20201029050828421

全局块:配置服务器整体运行的配置指令

主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数(工作进程数),进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

worker_processes (工作进程数)是 Nginx 服务器并发处理服务的关键配置,值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约,常设置为cpu核数:

img

events 块:影响 Nginx 服务器与用户的网络连接

events 块涉及的指令主要影响Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work_process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word_process 可以同时支持的最大连接数等。

work_process 1024 表示支持的最大并发连接数为 1024

img

http 块

Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块server 块

img

http 全局块

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等:

img

server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。

每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块

img

全局 server 块最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串(例如前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

Nginx 反向代理配置

反向代理作用:屏蔽内网服务器信息,令外部客户端无法直接接触到内网的服务器,而是通过反向代理服务器转发到内网服务器:

image-20201029051037570

  • 正向代理:帮忙访问别人,客户端信息被屏蔽
  • 反向代理:帮忙被别人访问,服务端信息被屏蔽

配置方法:

  • 修改配置文件 server 块的 server_name 为本机的ip地址
  • location 里添加 proxy_pass 代理路径(即要跳转到的路径)
image-20210831214700318

反向代理案例

  • 访问 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端口

image-20210831215100428

请求头

Nginx 反向代理时会将请求头信息删掉,导致反向代理后的请求没有消息头 RequestHeader

注意,当使用 Nginx 代理给自己项目的网关服务时,会发生无法转发的情况。这是因为 Nginx 进行反向代理时,会将请求头信息给删掉,然后才转发给网关服务,这就导致了无法访问网关服务。因此需要在 location 中添加请求头信息,代表将原始请求的请求头信息原封不动的转发给网关:

1
2
3
4
location / {
proxy_pass http://yunmall;
proxy_set_header Host $host;
}

注意事项

如果两个不同 server 的块中配置的 server_name 相同,则二者的 location 必须配置相同路径,否则会出现问题。如果必须配置不同的路径,则这两个 server 块中的 server_name 必须设置不同(可以一个 localhost,一个写 ip 地址)

Nginx 负载均衡配置

准备工作

  • 准备两台 Tomcat 服务器,一台 8080,一台 8081
  • 在两台 Tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试

在 Nginx 的配置文件中进行负载均衡的配置

img

Nginx 分配服务器策略

第一种 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

第二种 weight

weight 代表权重默认为 1,权重越高被分配的客户端越多

img

第三种 ip_hash

每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器

img

第四种 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

img

Nginx 动静分离配置

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过 Nginx 来分开。

通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

准备工作

在 liunx 系统中准备静态资源,用于进行访问:

img

具体配置

在 Nginx 配置文件中进行配置,重点是修改 locationroot 目录,令其指向存放静态资源的根目录,这样访问浏览器里的 http://192.168.17.129/www/image/01.jpg 就会映射到服务器中的 /data/image/01.jpg 文件:

img

测试

浏览器中输入地址 http://192.168.17.129/image/01.jpg

img

配置文件配置了 autoindex on,访问image路径时会展示出image目录下的所有文件,点击即可下载。

img

总结

https://zhuanlan.zhihu.com/p/55698543

1
2
3
4
5
6
7
8
9
server {
location / {
root /data/www/;
}

location /images/ {
alias /data/;
}
}
  • 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.129192.168.17.131
  • 在两台服务器安装 nginx
  • 在两台服务器安装 keepalived
  1. 安装 keepalived:
1
yum install keepalived –y
  1. 安装之后,在 /etc/keepalived/生成文件 keepalived.conf

完成高可用配置(主从配置)

  1. 修改/etc/keepalived/keepalivec.conf 配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.17.129 # 本机ip
smtp_connect_timeout 30
router_id LVS_DEVEL # 路由id,通过该id可以访问到当前主机,该名字存储在/etc/host文件中,可以添加一个自定义的名字
}

vrrp_script chk_http_port {
script "/usr/local/src/nginx_check.sh"
interval 2 #(检测脚本执行的间隔)
weight 2 # 权重:若当前脚本里的判断条件成立,把当前主机权重+2
}

# 设置虚拟ip信息
vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
interface ens33 # 设置将虚拟ip绑定到哪个网卡
virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小
advert_int 1 # 每隔一秒发送一个请求查看当前主机是否存活

# 权限校验方式和密码
authentication {
auth_type PASS
auth_pass 1111
}

virtual_ipaddress {
192.168.17.50 # VRRP H 虚拟地址
}
}
  1. /usr/local/src 添加检测脚本
1
2
3
4
5
6
7
8
9
#!/bin/bash
A=`ps -C nginx –no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
  1. 把两台服务器上 nginx 和 keepalived 启动
1
2
./nginx
systemctl start keepalived.service

测试

在浏览器地址栏输入 虚拟 ip 地址 192.168.17.50,发现能正常访问,当关掉一台Nignx服务器后再访问仍然能正常访问

image-20210902191355104

Nginx 原理

Master 和 worker

Master进程为主进程,用于协调管理worker进程,本身并不处理业务。

img

img

worker 如何进行工作的

当客户端发来请求时,Master进程将该请求告诉所有能够工作的worker进程,之后多个worker进程争抢该请求,抢到的worker进程将处理该请求,同时woker进程采用多路复用技术,开启唯一线程非阻塞地处理请求。

img

一个 Master 和多个 woker 有好处

  • 可以使用 nginx –s reload 热部署,利用 Nginx 进行热部署操作,当收到请求时,其他不工作的先更新配置,正在工作的进程暂时不更新,当其工作完毕后再更新。
  • 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的,继续进行争抢,实现请求过程,不会造成服务中断

设置多少个 woker 合适

worker 数和服务器的 cpu 数相等是最为适宜的

连接数 worker_connection

问题一:发送请求,占用了 woker 的几个连接数?

答案:2 或者 4 个

img

问题二:Nginx 有一个 Master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

  • 普通的静态访问最大并发数是: worker_connections * worker_processes /2
  • 而如果是 HTTP 作为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4