实时警报通知:微信告警通知的重要性解析
644
2023-03-07
2W字文档,带你深入了解Nginx。
Nginx 是开源、高性能、高可靠的 Web 和反向代理服务器,而且支持热部署,几乎可以做到 7 * 24 小时不间断运行,即使运行几个月也不需要重新启动,还能在不间断服务的情况下对软件版本进行热更新。性能是 Nginx 最重要的考量,其占用内存少、并发能力强、能支持高达 5w 个并发连接数,最重要的是, Nginx 是免费的并可以商业化,配置使用也比较简单。
Nginx 特点
高并发、高性能;模块化架构使得它的扩展性非常好;异步非阻塞的事件驱动模型这点和 Node.js 相似;相对于其它服务器来说它可以连续几个月甚至更长而不需要重启服务器使得它具有高可靠性;热部署、平滑升级;完全开源,生态繁荣;
Nginx 作用
Nginx 的最重要的几个使用场景:
静态资源服务,通过本地文件系统提供服务;反向代理服务,延伸出包括缓存、负载均衡等;API 服务, OpenResty ;
对于前端来说 Node.js 并不陌生, Nginx 和 Node.js 的很多理念类似, HTTP 服务器、事件驱动、异步非阻塞等,且 Nginx 的大部分功能使用 Node.js 也可以实现,但 Nginx 和 Node.js 并不冲突,都有自己擅长的领域。Nginx 擅长于底层服务器端资源的处理(静态资源处理转发、反向代理,负载均衡等), Node.js 更擅长上层具体业务逻辑的处理,两者可以完美组合。
Nginx 安装
本文演示的是 Linux centOS 7.x 的操作系统上安装 Nginx ,至于在其它操作系统上进行安装可以网上自行搜索,都非常简单的。使用 yum 安装 Nginx :
yum install nginx -y
yum install nginx -y
安装完成后,通过 rpm -ql nginx 命令查看 Nginx 的安装信息:
# Nginx配置文件/etc/nginx/nginx.conf # nginx 主配置文件/etc/nginx/nginx.conf.default# 可执行程序文件/usr/bin/nginx-upgrade/usr/sbin/nginx# nginx库文件/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程/usr/lib64/nginx/modules # Nginx模块目录# 帮助文档/usr/share/doc/nginx-1.16.1/usr/share/doc/nginx-1.16.1/CHANGES/usr/share/doc/nginx-1.16.1/README/usr/share/doc/nginx-1.16.1/README.dynamic/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10# 静态资源目录/usr/share/nginx/html/404.html/usr/share/nginx/html/50x.html/usr/share/nginx/html/index.html# 存放Nginx日志文件/var/log/nginx
# Nginx配置文件/etc/nginx/nginx.conf # nginx 主配置文件/etc/nginx/nginx.conf.default# 可执行程序文件/usr/bin/nginx-upgrade/usr/sbin/nginx# nginx库文件/usr/lib/systemd/system/nginx.service # 用于配置系统守护进程/usr/lib64/nginx/modules # Nginx模块目录# 帮助文档/usr/share/doc/nginx-1.16.1/usr/share/doc/nginx-1.16.1/CHANGES/usr/share/doc/nginx-1.16.1/README/usr/share/doc/nginx-1.16.1/README.dynamic/usr/share/doc/nginx-1.16.1/UPGRADE-NOTES-1.6-to-1.10# 静态资源目录/usr/share/nginx/html/404.html/usr/share/nginx/html/50x.html/usr/share/nginx/html/index.html# 存放Nginx日志文件/var/log/nginx
主要关注的文件夹有两个:
/etc/nginx/conf.d/ 是子配置项存放处, /etc/nginx/nginx.conf 主配置文件会默认把这个文件夹中所有子配置项都引入;/usr/share/nginx/html/ 静态文件都放在这个文件夹,也可以根据你自己的习惯放在其他地方;
Nginx 常用命令
systemctl 系统命令:
# 开机配置systemctl enable nginx # 开机自动启动systemctl disable nginx # 关闭开机自动启动# 启动Nginxsystemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面# 停止Nginxsystemctl stop nginx# 重启Nginxsystemctl restart nginx# 重新加载Nginxsystemctl reload nginx# 查看 Nginx 运行状态systemctl status nginx# 查看Nginx进程ps -ef | grep nginx# 杀死Nginx进程kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程
# 开机配置systemctl enable nginx # 开机自动启动systemctl disable nginx # 关闭开机自动启动# 启动Nginxsystemctl start nginx # 启动Nginx成功后,可以直接访问主机IP,此时会展示Nginx默认页面# 停止Nginxsystemctl stop nginx# 重启Nginxsystemctl restart nginx# 重新加载Nginxsystemctl reload nginx# 查看 Nginx 运行状态systemctl status nginx# 查看Nginx进程ps -ef | grep nginx# 杀死Nginx进程kill -9 pid # 根据上面查看到的Nginx进程号,杀死Nginx进程,-9 表示强制结束进程
Nginx 应用程序命令:
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启nginx -s reopen # 重启 Nginxnginx -s stop # 快速关闭nginx -s quit # 等待工作进程处理完成后关闭nginx -T # 查看当前 Nginx 最终的配置nginx -t # 检查配置是否有问题
nginx -s reload # 向主进程发送信号,重新加载配置文件,热重启nginx -s reopen # 重启 Nginxnginx -s stop # 快速关闭nginx -s quit # 等待工作进程处理完成后关闭nginx -T # 查看当前 Nginx 最终的配置nginx -t # 检查配置是否有问题
Nginx 核心配置
配置文件结构
Nginx 的典型配置示例:
全局配置,对全局生效;
配置文件 main 段核心参数
user指定运行 Nginx 的 woker 子进程的属主和属组,其中组可以不指定。
user USERNAME [GROUP]user nginx lion; # 用户是nginx;组是lion
user USERNAME [GROUP]user nginx lion; # 用户是nginx;组是lion
pid指定运行 Nginx master 主进程的 pid 文件存放路径。
pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件
pid /opt/nginx/logs/nginx.pid # master主进程的的pid存放在nginx.pid的文件
worker_rlimit_nofile_number指定 worker 子进程可以打开的最大文件句柄数。
worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。
worker_rlimit_nofile 20480; # 可以理解成每个worker子进程的最大连接数量。
worker_rlimit_core指定 worker 子进程异常终止后的 core 文件,用于记录分析问题。
worker_rlimit_core 50M; # 存放大小限制working_directory /opt/nginx/tmp; # 存放目录
worker_rlimit_core 50M; # 存放大小限制working_directory /opt/nginx/tmp; # 存放目录
worker_processes_number指定 Nginx 启动的 worker 子进程数量。
worker_processes 4; # 指定具体子进程数量worker_processes auto; # 与当前cpu物理核心数一致
worker_processes 4; # 指定具体子进程数量worker_processes auto; # 与当前cpu物理核心数一致
worker_cpu_affinity将每个 worker 子进程与我们的 cpu 物理核心绑定。
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程
worker_cpu_affinity 0001 0010 0100 1000; # 4个物理核心,4个worker子进程
worker_priority指定 worker 子进程的 nice 值,以调整运行 Nginx 的优先级,通常设定为负值,以优先调用 Nginx 。
worker_priority -10; # 120-10=110,110就是最终的优先级
worker_priority -10; # 120-10=110,110就是最终的优先级
Linux 默认进程的优先级值是120,值越小越优先;nice 定范围为 -20 到 +19 。[备注] 应用的默认优先级值是120加上 nice 值等于它最终的值,这个值越小,优先级越高。
worker_shutdown_timeout指定 worker 子进程优雅退出时的超时时间。
worker_shutdown_timeout 5s;
worker_shutdown_timeout 5s;
timer_resolutionworker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降。
timer_resolution 100ms;
timer_resolution 100ms;
在 Linux 系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销就越小。
daemon指定 Nginx 的运行方式,前台还是后台,前台用于调试,后台用于生产。
daemon off; # 默认是on,后台运行模式
daemon off; # 默认是on,后台运行模式
配置文件 events 段核心参数
useNginx 使用何种事件驱动模型。
use method; # 不推荐配置它,让nginx自己选择method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
use method; # 不推荐配置它,让nginx自己选择method 可选值为:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connectionsworker 子进程能够处理的最大并发连接数。
worker_connections 1024 # 每个子进程的最大连接数为1024
worker_connections 1024 # 每个子进程的最大连接数为1024
accept_mutex是否打开负载均衡互斥锁。
accept_mutex on # 默认是off关闭的,这里推荐打开
accept_mutex on # 默认是off关闭的,这里推荐打开
server_name 指令指定虚拟主机域名。
域名匹配的四种写法:
匹配优先级:精确匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
server_name 配置实例:1、配置本地 DNS 解析 vim /etc/hosts ( macOS 系统)
[注意] 这里使用的是虚拟域名进行测试,因此需要配置本地 DNS 解析,如果使用阿里云上购买的域名,则需要在阿里云上设置好域名解析。
2、配置阿里云 Nginx ,vim /etc/nginx/nginx.conf
3、访问分析
[注意] root 会将定义路径与 URI 叠加, alias 则只取定义路径。
alias它也是指定静态资源目录位置,它只能写在 location 中。
[注意] 使用 alias 末尾一定要添加 / ,并且它只能位于 location 中。
location配置路径。
location [ = | ~ | ~* | ^~ ] uri { ...}
location [ = | ~ | ~* | ^~ ] uri { ...}
匹配规则:
= 精确匹配;~ 正则匹配,区分大小写;~* 正则匹配,不区分大小写;^~ 匹配到即停止搜索;
= 精确匹配;~ 正则匹配,区分大小写;~* 正则匹配,不区分大小写;^~ 匹配到即停止搜索;
匹配优先级:= > ^~ > ~ > ~* > 不带任何字符。实例:
location 中的反斜线
location /test { ...}location /test/ { ...}
location /test { ...}location /test/ { ...}
return停止处理请求,直接返回响应码或重定向到其他 URL ;执行 return 指令后, location 中后续指令将不会被执行。
rewrite根据指定正则表达式匹配规则,重写 URL 。
语法:rewrite 正则表达式 要替换的内容 [flag];上下文:server、location、if示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
语法:rewrite 正则表达式 要替换的内容 [flag];上下文:server、location、if示例:rewirte /images/(.*\.jpg)$ /pic/$1; # $1是前面括号(.*\.jpg)的反向引用
flag 可选值的含义:
last 重写后的 URL 发起新请求,再次进入 server 段,重试 location 的中的匹配;break 直接使用重写后的 URL ,不再匹配其它 location 中语句;redirect 返回302临时重定向;permanent 返回301永久重定向;
按照这个配置我们来分析:
if 指令
condition 判断条件:
$variable 仅为变量时,值为空或以0开头字符串都会被当做 false 处理;= 或 != 相等或不等;~ 正则匹配;! ~ 非正则匹配;~* 正则匹配,不区分大小写;-f 或 ! -f 检测文件存在或不存在;-d 或 ! -d 检测目录存在或不存在;-e 或 ! -e 检测文件、目录、符号链接等存在或不存在;-x 或 ! -x 检测文件可以执行或不可执行;
实例:
server { listen 8080; server_name localhost; root html; location / { if ( $uri = "/images/" ){ rewrite (.*) /pics/ break; } }}
server { listen 8080; server_name localhost; root html; location / { if ( $uri = "/images/" ){ rewrite (.*) /pics/ break; } }}
当访问 localhost:8080/images/ 时,会进入 if 判断里面执行 rewrite 命令。
autoindex用户请求以 / 结尾时,列出目录结构,可以用于快速搭建静态资源下载网站。autoindex.conf 配置信息:
server { listen 80; server_name fe.lion-test.club; location /download/ { root /opt/source; autoindex on; # 打开 autoindex,,可选参数有 on | off autoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩ autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间 }}
server { listen 80; server_name fe.lion-test.club; location /download/ { root /opt/source; autoindex on; # 打开 autoindex,,可选参数有 on | off autoindex_exact_size on; # 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出⽂件的确切⼤⼩ autoindex_format html; # 以html的方式进行格式化,可选参数有 html | json | xml autoindex_localtime off; # 显示的⽂件时间为⽂件的服务器时间。默认为off,显示的⽂件时间为GMT时间 }}
变量
Nginx 的配置还有非常多,以上只是罗列了一些常用的配置,在实际项目中还是要学会查阅文档。
Nginx 应用核心概念
正向代理
正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。
反向代理
反向代理*(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。
反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。
反向代理的优势:
隐藏真实服务器;负载均衡便于横向扩充后端动态服务;动静分离,提升系统健壮性;那么“动静分离”是什么?负载均衡又是什么?
动静分离
使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。
负载均衡
一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。
这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。
很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。
请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。
轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。最快响应时间策略:优先分配给响应时间最短的服务器。客户端 ip 绑定策略:来自同一个 ip 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。
Nginx 实战配置
在配置反向代理和负载均衡等等功能之前,有两个核心模块是我们必须要掌握的,这两个模块应该说是 Nginx 应用配置中的核心,它们分别是:upstream 、proxy_pass 。
在 upstream 内可使用的指令:
server 定义上游服务器地址;zone 定义共享内存,用于跨 worker 子进程;keepalive 对上游服务启用长连接;keepalive_requests 一个长连接最多请求 HTTP 的个数;keepalive_timeout 空闲情形下,一个长连接的超时时长;hash 哈希负载均衡算法;ip_hash 依据 IP 进行哈希计算的负载均衡算法;least_conn 最少连接数负载均衡算法;least_time 最短响应时间负载均衡算法;random 随机负载均衡算法;
server 定义上游服务器地址;zone 定义共享内存,用于跨 worker 子进程;keepalive 对上游服务启用长连接;keepalive_requests 一个长连接最多请求 HTTP 的个数;keepalive_timeout 空闲情形下,一个长连接的超时时长;hash 哈希负载均衡算法;ip_hash 依据 IP 进行哈希计算的负载均衡算法;least_conn 最少连接数负载均衡算法;least_time 最短响应时间负载均衡算法;random 随机负载均衡算法;
server定义上游服务器地址。
语法:server address [parameters]上下文:upstream
语法:server address [parameters]上下文:upstream
parameters 可选值:
weight=number 权重值,默认为1;max_conns=number 上游服务器的最大并发连接数;fail_timeout=time 服务器不可用的判定时间;max_fails=numer 服务器不可用的检查次数;backup 备份服务器,仅当其他服务器都不可用时才会启用;down 标记服务器长期不可用,离线维护;
keepalive限制每个 worker 子进程与上游服务器空闲长连接的最大数量。
keepalive connections;上下文:upstream示例:keepalive 16;
keepalive connections;上下文:upstream示例:keepalive 16;
keepalive_requests单个长连接可以处理的最多 HTTP 请求个数。
语法:keepalive_requests number;默认值:keepalive_requests 100;上下文:upstream
语法:keepalive_requests number;默认值:keepalive_requests 100;上下文:upstream
keepalive_timeout空闲长连接的最长保持时间。
语法:keepalive_timeout time;默认值:keepalive_timeout 60s;上下文:upstream
语法:keepalive_timeout time;默认值:keepalive_timeout 60s;上下文:upstream
配置实例
upstream back_end{ server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2; keepalive 32; keepalive_requests 50; keepalive_timeout 30s;}
upstream back_end{ server 127.0.0.1:8081 weight=3 max_conns=1000 fail_timeout=10s max_fails=2; keepalive 32; keepalive_requests 50; keepalive_timeout 30s;}
proxy_pass用于配置代理服务器。
URL 参数原则
接下来让我们来看看两种常见的 URL 用法:
这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:
不带 / 意味着 Nginx 不会修改用户 URL ,而是直接透传给上游的应用服务器;带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除;
不带 / 的用法:
分析:
用户请求 URL :/bbs/abc/test.html请求到达 Nginx 的 URL :/bbs/abc/test.html请求到达上游应用服务器的 URL :/bbs/abc/test.html
带 / 的用法:
分析
用户请求 URL :/bbs/abc/test.html请求到达 Nginx 的 URL :/bbs/abc/test.html请求到达上游应用服务器的 URL :/abc/test.html
并没有拼接上 /bbs ,这点和 root 与 alias 之间的区别是保持一致的。
配置反向代理
这里为了演示更加接近实际,作者准备了两台云服务器,它们的公网 IP 分别是:121.42.11.34与 121.5.180.193 。我们把 121.42.11.34 服务器作为上游服务器,做如下配置:
# /etc/nginx/conf.d/proxy.confserver{ listen 8080; server_name localhost; location /proxy/ { root /usr/share/nginx/html/proxy; index index.html; }}# /usr/share/nginx/html/proxy/index.html<h1> 121.42.11.34 proxy html </h1>
# /etc/nginx/conf.d/proxy.confserver{ listen 8080; server_name localhost; location /proxy/ { root /usr/share/nginx/html/proxy; index index.html; }}# /usr/share/nginx/html/proxy/index.html
配置完成后重启 Nginx 服务器 nginx -s reload 。把 121.5.180.193 服务器作为代理服务器,做如下配置:
本地机器要访问 proxy.lion.club 域名,因此需要配置本地 hosts ,通过命令:vim /etc/hosts 进入配置文件,添加如下内容:
121.5.180.193 proxy.lion.club
121.5.180.193 proxy.lion.club
配置负载均衡
配置负载均衡主要是要使用 upstream 指令。我们把 121.42.11.34 服务器作为上游服务器,做如下配置( /etc/nginx/conf.d/balance.conf):
server{ listen 8020; location / { return 200 'return 8020 \n'; }}server{ listen 8030; location / { return 200 'return 8030 \n'; }}server{ listen 8040; location / { return 200 'return 8040 \n'; }}
server{ listen 8020; location / { return 200 'return 8020 \n'; }}server{ listen 8030; location / { return 200 'return 8030 \n'; }}server{ listen 8040; location / { return 200 'return 8040 \n'; }}
配置完成后:
nginx -t 检测配置是否正确;nginx -s reload 重启 Nginx 服务器;执行 ss -nlt 命令查看端口是否被占用,从而判断 Nginx 服务是否正确启动。
把 121.5.180.193 服务器作为代理服务器,做如下配置( /etc/nginx/conf.d/balance.conf ):
配置完成后重启 Nginx 服务器。并且在需要访问的客户端配置好 ip 和域名的映射关系。
# /etc/hosts121.5.180.193 balance.lion.club
# /etc/hosts121.5.180.193 balance.lion.club
接下来,我们再来了解下 Nginx 的其它分发策略。
hash 算法通过制定关键字作为 hash key ,基于 hash 算法映射到特定的上游服务器中。关键字可以包含有变量、字符串。
hash $request_uri 表示使用 request_uri 变量作为 hash 的 key 值,只要访问的 URI 保持不变,就会一直分发给同一台服务器。
ip_hash根据客户端的请求 ip 进行判断,只要 ip 地址不变就永远分配到同一台主机。它可以有效解决后台服务器 session 保持的问题。
最少连接数算法各个 worker 子进程通过读取共享内存的数据,来获取后端服务器的信息。来挑选一台当前已建立连接数最少的服务器进行分配请求。
语法:least_conn;上下文:upstream;
语法:least_conn;上下文:upstream;
示例:
最后你会发现,负载均衡的配置其实一点都不复杂。
配置缓存
缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器( Nginx ),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都是非常重要的。下面让我们来学习 Nginx 中如何设置缓存策略。
proxy_cache存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游服务器的压力,加快整个访问速度。
proxy_cache_path设置缓存文件的存放路径。
参数含义:
path 缓存文件的存放路径;level path 的目录层级;keys_zone 设置共享内存;inactive 在指定时间内没有被访问,缓存会被清理,默认10分钟;
path 缓存文件的存放路径;level path 的目录层级;keys_zone 设置共享内存;inactive 在指定时间内没有被访问,缓存会被清理,默认10分钟;
proxy_cache_key设置缓存文件的 key 。
proxy_cache_valid配置什么状态码可以被缓存,以及缓存时长。
proxy_no_cache定义相应保存到缓存的条件,如果字符串参数的至少一个值不为空且不等于“ 0”,则将不保存该响应到缓存。
proxy_cache_bypass定义条件,在该条件下将不会从缓存中获取响应。
upstream_cache_status 变量它存储了缓存是否命中的信息,会设置在响应头信息中,在调试中非常有用。
MISS: 未命中缓存HIT:命中缓存EXPIRED: 缓存过期STALE: 命中了陈旧缓存REVALIDDATED: Nginx验证陈旧缓存依然有效UPDATING: 内容陈旧,但正在更新BYPASS: X响应从原始服务器获取
MISS: 未命中缓存HIT:命中缓存EXPIRED: 缓存过期STALE: 命中了陈旧缓存REVALIDDATED: Nginx验证陈旧缓存依然有效UPDATING: 内容陈旧,但正在更新BYPASS: X响应从原始服务器获取
配置实例我们把 121.42.11.34 服务器作为上游服务器,做如下配置( /etc/nginx/conf.d/cache.conf ):
server { listen 1010; root /usr/share/nginx/html/1010; location / { index index.html; }}server { listen 1020; root /usr/share/nginx/html/1020; location / { index index.html; }}
server { listen 1010; root /usr/share/nginx/html/1010; location / { index index.html; }}server { listen 1020; root /usr/share/nginx/html/1020; location / { index index.html; }}
把 121.5.180.193 服务器作为代理服务器,做如下配置( /etc/nginx/conf.d/cache.conf ):
缓存就是这样配置,我们可以在 /etc/nginx/cache_temp 路径下找到相应的缓存文件。对于一些实时性要求非常高的页面或数据来说,就不应该去设置缓存,下面来看看如何配置不缓存的内容。
HTTPS
在学习如何配置 HTTPS 之前,我们先来简单回顾下 HTTPS 的工作流程是怎么样的?它是如何进行加密保证安全的?
HTTPS 工作流程
这就是 HTTPS 的基本运作原理,使用对称加密和非对称机密配合使用,保证传输内容的安全性。
配置证书下载证书的压缩文件,里面有个 Nginx 文件夹,把 xxx.crt 和 xxx.key 文件拷贝到服务器目录,再进行如下配置:
如此配置后就能正常访问 HTTPS 版的网站了。
配置跨域 CORS先简单回顾下跨域究竟是怎么回事。
跨域的定义同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作。
不同源会有如下限制:
Web 数据层面,同源策略限制了不同源的站点读取当前站点的 Cookie 、 IndexDB 、 LocalStorage 等数据。DOM 层面,同源策略限制了来自不同源的 JavaScript 脚本对当前 DOM 对象读和写的操作。网络层面,同源策略限制了通过 XMLHttpRequest 等方式将站点的数据发送给不同源的站点。
Nginx 解决跨域的原理
例如:
其实也可以通过前端构建工具例如 webpack 、rollup 等在打生产包时就做好 Gzip 压缩,然后放到 Nginx 服务器中,这样可以减少服务器的开销,加快访问速度。关于 Nginx 的实际应用就学习到这里,相信通过掌握了 Nginx 核心配置以及实战配置,之后再遇到什么需求,我们也能轻松应对。接下来,让我们再深入一点学习下 Nginx 的架构。
Nginx 架构
进程结构
Master Process 用来管理子进程的,其本身并不真正处理用户请求。某个子进程 down 掉的话,它会向 Master 进程发送一条消息,表明自己不可用了,此时 Master 进程会去新起一个子进程。某个配置文件被修改了 Master 进程会去通知 work 进程获取新的配置信息,这也就是我们所说的热部署。子进程间是通过共享内存的方式进行通信的。
配置文件重载原理
reload 重载配置文件的流程:向 master 进程发送 HUP 信号( reload 命令);master 进程检查配置语法是否正确;master 进程打开监听端口;master 进程使用新的配置文件启动新的 worker 子进程;master 进程向老的 worker 子进程发送 QUIT 信号;老的 worker 进程关闭监听句柄,处理完当前连接后关闭进程;整个过程 Nginx 始终处于平稳运行中,实现了平滑升级,用户无感知;
Nginx 模块化管理机制
发表评论
暂时没有评论,来抢沙发吧~