Nginx应用核心概念、nginx配置缓存、HTTPS、nginx配置跨域CORS、nginx架构说明

    • 正向代理
  • 反向代理

  • 动静分离

  • 负载均衡

  • Nginx 实战配置

    • upstream
  • server

  • keepalive

  • keepalive_requests

  • keepalive_timeout

  • proxy_pass

  • 配置反向代理

  • 配置负载均衡

  • hash 算法

  • ip_hash

  • 最少连接数算法

  • 配置缓存

    • proxy_cache
  • proxy_cache_path

  • proxy_cache_key

  • proxy_cache_valid

  • proxy_no_cache

  • proxy_cache_bypass

  • upstream_cache_status 变量

  • 配置实例

  • HTTPS

    • HTTPS 工作流程
  • 配置证书

  • 配置跨域 CORS

    • 跨域的定义
  • 同源的定义

  • Nginx 解决跨域的原理

  • 配置开启 gzip 压缩

  • Nginx 架构

    • 进程结构
  • 配置文件重载原理

  • Nginx 模块化管理机制

nginx详细介绍说明&&nginx安装方法详细&&nginx常用命令使用

====================================================================================================

这些内容见这篇博客:

nginx详细介绍说明&&nginx安装方法详细&&nginx常用命令使用

Nginx 应用核心概念

===========================================================================

代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。

不管是正向代理还是反向代理,实现的都是上面的功能。

在这里插入图片描述

正向代理


  • 正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

  • 正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

  • 正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。

反向代理


  • 反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

  • 反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

  • 反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

  • 反向代理的优势:

  • 隐藏真实服务器;

  • 负载均衡便于横向扩充后端动态服务;

  • 动静分离,提升系统健壮性;

那么“动静分离”是什么?负载均衡又是什么?

动静分离


动静分离是指在 web 服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统访问的架构设计方法,进而提示整个服务的访问性和可维护性。

在这里插入图片描述

一般来说,都需要将动态资源和静态资源分开,由于 Nginx 的高并发和静态资源缓存等特性,经常将静态资源部署在 Nginx 上。如果请求的是静态资源,直接到静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用去处理,从而实现动静分离。

使用前后端分离后,可以很大程度提升静态资源的访问速度,即使动态服务不可用,静态资源的访问也不会受到影响。

负载均衡


一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端。

这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大时,服务器容易崩。

很明显这是由于服务器性能的瓶颈造成的问题,除了堆机器之外,最重要的做法就是负载均衡。

请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡,核心是「分摊压力」。Nginx 实现负载均衡,一般来说指的是将请求转发给服务器集群。

举个具体的例子,晚高峰乘坐地铁的时候,入站口经常会有地铁工作人员大喇叭“请走 B 口, B 口人少车空……”,这个工作人员的作用就是负载均衡。

在这里插入图片描述

  • Nginx 实现负载均衡的策略:

  • 轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。

  • 最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。

  • 最快响应时间策略:优先分配给响应时间最短的服务器。

  • 客户端 IP 绑定策略:来自同一个 IP 的请求永远只分配一台服务器,有效解决了动态网页存在的 session 共享问题。

Nginx 实战配置

=========================================================================

在配置反向代理和负载均衡等等功能之前,有两个核心模块是我们必须要掌握的,这两个模块应该说是 Nginx 应用配置中的核心,它们分别是: upstream、proxy_pass。

upstream


用于定义上游服务器(指的就是后台提供的应用服务器)的相关信息。

在这里插入图片描述

语法:upstream name {

}

上下文:http

示例:

upstream back_end_server{

server 192.168.100.33:8081

}

  • 在 upstream 内可使用的指令:

  • server 定义上游服务器地址;

  • zone 定义共享内存,用于跨 worker 子进程;

  • keepalive 对上游服务启用长连接;

  • keepalive_requests 一个长连接最多请求 HTTP 的个数;

  • keepalive_timeout 空闲情形下,一个长连接的超时时长;

  • hash 哈希负载均衡算法;

  • ip_hash 依据 IP 进行哈希计算的负载均衡算法;

  • least_conn 最少连接数负载均衡算法;

  • least_time 最短响应时间负载均衡算法;

  • random 随机负载均衡算法;

server


定义上游服务器地址。

语法: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_requests


单个长连接可以处理的最多 HTTP 请求个数。

语法:keepalive_requests number;

默认值:keepalive_requests 100;

上下文:upstream

keepalive_timeout


空闲长连接的最长保持时间。

语法: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;

}

proxy_pass


用于配置代理服务器。

语法:proxy_pass URL;

上下文:location、if、limit_except

示例:

proxy_pass http://127.0.0.1:8081

proxy_pass http://127.0.0.1:8081/proxy

  • URL 参数原则:

  • URL 必须以 http 或 https 开头;

  • URL 中可以携带变量;

  • URL 中是否带 URI ,会直接影响发往上游请求的 URL;

  • 接下来让我们来看看两种常见的 URL 用法:

  • proxy_pass http://192.168.100.33:8081

  • proxy_pass http://192.168.100.33:8081/

  • 这两种用法的区别就是带 / 和不带 / ,在配置代理时它们的区别可大了:

  • 不带 / 意味着 Nginx 不会修改用户 URL,而是直接透传给上游的应用服务器;

  • 带 / 意味着 Nginx 会修改用户 URL ,修改方法是将 location 后的 URL 从用户 URL 中删除;

不带 / 的用法:

location /bbs/{

proxy_pass http://127.0.0.1:8080;

}

  • 分析:

用户请求 URL:/bbs/abc/test.html

请求到达 Nginx 的 URL:/bbs/abc/test.html

请求到达上游应用服务器的 URL :/bbs/abc/test.html

带 / 的用法:

location /bbs/{

proxy_pass http://127.0.0.1:8080/;

}

  • 分析:

用户请求 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.conf

server{

listen 8080;

server_name localhost;

location /proxy/ {

root /usr/share/nginx/html/proxy;

index index.html;

}

}

/usr/share/nginx/html/proxy/index.html

121.42.11.34 proxy html

配置完成后重启 Nginx 服务器 nginx -s reload。

把 121.5.180.193 服务器作为代理服务器,做如下配置:

/etc/nginx/conf.d/proxy.conf

upstream back_end {

server 121.42.11.34:8080 weight=2 max_conns=1000 fail_timeout=10s max_fails=3;

keepalive 32;

keepalive_requests 80;

keepalive_timeout 20s;

}

server {

listen 80;

server_name proxy.lion.club;

location /proxy {

proxy_pass http://back_end/proxy;

}

}

本地机器要访问 proxy.lion.club 域名,因此需要配置本地 hosts,通过命令:vim /etc/hosts 进入配置文件,添加如下内容:

121.5.180.193 proxy.lion.club

在这里插入图片描述

  • 分析:

  • 当访问 proxy.lion.club/proxy 时通过 upstream 的配置找到 121.42.11.34:8080;

  • 因此访问地址变为 http://121.42.11.34:8080/proxy;

  • 连接到 121.42.11.34 服务器,找到 8080 端口提供的 server;

  • 通过 server 找到 /usr/share/nginx/html/proxy/index.html 资源,最终展示出来。

配置负载均衡


配置负载均衡主要是要使用 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’;

}

}

  • 配置完成后:

  • nginx -t 检测配置是否正确;

  • nginx -s reload 重启 Nginx 服务器;

  • 执行ss -nlt命令查看端口是否被占用,从而判断 Nginx 服务是否正确启动。

把 121.5.180.193 服务器作为代理服务器,做如下配置(/etc/nginx/conf.d/balance.conf):

upstream demo_server {

server 121.42.11.34:8020;

server 121.42.11.34:8030;

server 121.42.11.34:8040;

}

server {

listen 80;

server_name balance.lion.club;

location /balance/ {

proxy_pass http://demo_server;

}

}

配置完成后重启 Nginx 服务器。并且在需要访问的客户端配置好 ip 和域名的映射关系。

/etc/hosts

121.5.180.193 balance.lion.club

在客户端机器执行 curl http://balance.lion.club/balance/命令:

在这里插入图片描述

不难看出,负载均衡的配置已经生效了,每次给我们分发的上游服务器都不一样。就是通过简单的轮询策略进行上游服务器分发。

接下来,我们再来了解下 Nginx 的其它分发策略。

hash 算法


通过制定关键字作为 hash key,基于 hash 算法映射到特定的上游服务器中。关键字可以包含有变量、字符串。

upstream demo_server {

hash $request_uri;

server 121.42.11.34:8020;

server 121.42.11.34:8030;

server 121.42.11.34:8040;

}

server {

listen 80;

server_name balance.lion.club;

location /balance/ {

proxy_pass http://demo_server;

}

}

hash $request_uri 表示使用 request_uri 变量作为 hash 的 key 值,只要访问的 URI 保持不变,就会一直分发给同一台服务器。

ip_hash


根据客户端的请求 ip 进行判断,只要 ip 地址不变就永远分配到同一台主机。它可以有效解决后台服务器 session 保持的问题。

upstream demo_server {

ip_hash;

server 121.42.11.34:8020;

server 121.42.11.34:8030;

server 121.42.11.34:8040;

}

server {

listen 80;

server_name balance.lion.club;

location /balance/ {

proxy_pass http://demo_server;

}

}

最少连接数算法


各个 worker 子进程通过读取共享内存的数据,来获取后端服务器的信息。来挑选一台当前已建立连接数最少的服务器进行分配请求。

语法:least_conn;

上下文:upstream;

示例:

upstream demo_server {

zone test 10M; # zone可以设置共享内存空间的名字和大小

least_conn;

server 121.42.11.34:8020;

server 121.42.11.34:8030;

server 121.42.11.34:8040;

}

server {

listen 80;

server_name balance.lion.club;

location /balance/ {

proxy_pass http://demo_server;

}

}

最后你会发现,负载均衡的配置其实一点都不复杂。

配置缓存

===================================================================

缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器(Nginx),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都是非常重要的。下面让我们来学习 Nginx 中如何设置缓存策略。

proxy_cache


存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游服务器的压力,加快整个访问速度。

语法:proxy_cache zone | off ; # zone 是共享内存的名称

默认值:proxy_cache off;

上下文:http、server、location

proxy_cache_path


设置缓存文件的存放路径。

最后

针对以上面试题,小编已经把面试题+答案整理好了

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

最新大厂必问微服务面试题汇总:SpringCloud、Boot、Dubbo

面试专题

image

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

image

image

image

location /balance/ {

proxy_pass http://demo_server;

}

}

最后你会发现,负载均衡的配置其实一点都不复杂。

配置缓存

===================================================================

缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器(Nginx),乃至上游服务器都多少会涉及到缓存。可见缓存在每个环节都是非常重要的。下面让我们来学习 Nginx 中如何设置缓存策略。

proxy_cache


存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游服务器的压力,加快整个访问速度。

语法:proxy_cache zone | off ; # zone 是共享内存的名称

默认值:proxy_cache off;

上下文:http、server、location

proxy_cache_path


设置缓存文件的存放路径。

最后

针对以上面试题,小编已经把面试题+答案整理好了

[外链图片转存中…(img-LoUaxcpU-1714432198179)]

[外链图片转存中…(img-tnv1E3iZ-1714432198180)]

[外链图片转存中…(img-o07HxeYq-1714432198181)]

面试专题

[外链图片转存中…(img-Xfu4Kqjn-1714432198181)]

除了以上面试题+答案,小编同时还整理了微服务相关的实战文档也可以分享给大家学习

[外链图片转存中…(img-WmLvt6D2-1714432198181)]

[外链图片转存中…(img-s48DGM45-1714432198182)]

[外链图片转存中…(img-5Cqk50JP-1714432198182)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Nginx配置CORS源资源共享),您需要编辑Nginx配置文件并添加相关配置。 首先,打开Nginx配置文件。默认情况下,该文件通常位于以下位置之一: - /etc/nginx/nginx.conf - /etc/nginx/conf.d/default.conf 找到您希望启用CORS的服务器块或位置块,并在其中添加以下配置: ``` location / { # 允许的来源(名) if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Max-Age' 1728000; add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; } if ($request_method = 'POST') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } if ($request_method = 'GET') { add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; } # 其他配置... } ``` 在上面的配置中,我们允许所有来源('*')访问。您可以根据需要更改为特定的名。 配置完成后,保存文件并重新加载Nginx配置,以使更改生效。您可以使用以下命令重新加载Nginx: ``` sudo service nginx reload ``` 现在,您的Nginx服务器应该已经启用了CORS,并允许访问。请确保您的应用程序也正确处理CORS 头部。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值