你信不信,五分钟快速学习Nginx

Nginx是什么?

Nginx 是一个高性能的HTTP和反向代理服务器。它是由俄罗斯程序员Igor Sysoev开发的,最初是为了解决俄罗斯大型的门户网站的高流量问题。

说到反向代理,那么有没有正向代理呢?
  • 正向代理:客户端非常明确要访问的服务器地址;服务器只知道请求来自哪个服务器(不知道哪个客户端);正向代理屏蔽或者隐藏了真实客户端。例如:当我们无法直接访问国外网站时,我们需要通过代理服务器(FQ)来访问,通过代理服务器去访问我们指定的网址。

  • 反向代理:多个客户端向反向代理服务器发送请求,Nginx 根据一定的规则将请求分发到不同的服务器;客户端不清楚请求将被分发到哪台服务器,反向代理隐藏了服务器的信息。

正向代理代理客户端的请求去访问目标服务器,目标服务器可能是一个反向服务器,反向代理了多台真实的服务器。

在这里插入图片描述
说到反向代理,不得不说下负载均衡,毕竟利用好反向代理,可以完美解决流量高并发的问题!

负载均衡

总说负载均衡,负载均衡是做什么用的?什么场景使用?

负载均衡是用来分配客户端请求到多个服务器的机制,常用于解决高负载和提高系统可用性的问题。

  • 负载量:客户端发送的请求数量,也是负载量。
  • 均衡规则:反向代理服务器根据一定的规则将请求分发到不同的服务器上处理。
  • 负载均衡可分为硬件负载均衡(成本较高)和软件负载均衡(成本较低)。
  • 软件负载均衡是利用现有的技术结合主机硬件实现的一种消息队列分发机制。

在这里插入图片描述

Nginx的核心要点

1、事件驱动

Nginx使用了一个高效的异步事件模型,基于I/O多路复用,特别是epoll(在Linux上)和kqueue(在BSD系统上)。这种模型允许Nginx同时处理大量的并发连接,而不会因为每个连接占用大量的内存资源。

在Nginx配置文件中,可以设置每个进程的最大连接数(worker_connections),以及如何处理并发连接:

events {worker_connections 1024; # 每个进程最多同时处理1024个连接
}
2、高度可扩展

Nginx能够支持同时处理成千上万个连接,这使得它非常适合大型网站和需要高并发处理能力的应用。

Nginx 可以为不同的虚拟主机设置不同的worker进程数,以增加并发处理能力:

http {worker_processes auto; # 根据系统CPU核心数自动设置worker进程数
}
3、轻量级

与传统的基于进程的Web服务器(如Apache)相比,Nginx在处理请求时占用的内存更少。这是因为Nginx使用事件驱动模型,每个连接只占用很小的内存空间。比如说可以设置每个worker进程的内存限制:

events {worker_rlimit_nofile 1024; # 每个worker进程的最大打开文件描述符数
}
4、热部署

Nginx支持热部署,即在不重启服务器的情况下更新配置和模块。要实现热部署,可以使用 nginx -s ``reload命令。在修改了Nginx配置文件后,可以通过以下命令热部署配置:

sudo nginx -s reload
5、负载均衡

Nginx内置了负载均衡功能,可以通过upstream模块在多个后端服务器之间分配客户端请求,以此提高整个服务系统的处理能力。以下是一个简单的upstream配置,它将请求轮询分配到三个后端服务器:

upstream backend {
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
}server {
location / {
proxy_pass http://backend; # 将请求转发到upstream定义的backend组
}
}
6、高性能

Nginx在多种标准的Web性能测试中表现出色,能够快速处理静态文件、索引文件和代理请求。配置Nginx作为反向代理服务器,为大型静态文件下载服务:

location /files/ {alias /path/to/files/; # 设置实际文件存储路径expires 30d; # 设置文件过期时间为30天
}
7、安全性,Nginx支持SSL/TLS协议

Nginx支持SSL/TLS协议,可以配置为安全的Web服务器或反向代理。

server {listen 443 ssl;ssl_certificate /path/to/fullchain.pem; # 证书路径ssl_certificate_key /path/to/privatekey.pem; # 私钥路径ssl_protocols TLSv1.2 TLSv1.3; # 支持的SSL协议
}

Nginx支持的复杂均衡调度算法

Nginx支持多种复杂的负载均衡调度算法,以适应不同的应用场景和需求。以下是几种常见的负载均衡算法的详细说明和示例:

1、weight轮询(默认)

weight轮询(Round Robin)是Nginx默认的负载均衡算法。它按顺序将请求逐一分配到不同的服务器上。通过设置服务器权重(weight)来调整不同服务器上请求的分配率。如果某一服务器宕机,Nginx会自动将该服务器从队列中剔除,请求代理会继续分配到其他健康的服务器上。

upstream backend {server backend1.example.com weight=3; # 设置backend1的权重为3server backend2.example.com; # backend2的权重为默认值1server backend3.example.com weight=5; # 设置backend3的权重为5
}
2、IP Hash

IP Hash算法根据客户端请求的IP地址的哈希值进行匹配,将具有相同IP哈希值的客户端分配到指定的服务器。这样可以确保同一客户端的请求始终被分配到同一台服务器,有助于保持用户的会话状态。

upstream backend {ip_hash; # 启用IP哈希算法server backend1.example.com;server backend2.example.com;
}
3、fair

fair 调度算法是一种根据服务器处理请求的响应时间和处理效率进行负载均衡的方法。它结合了轮询和IP哈希的优点,但Nginx默认不支持公平调度算法,需要安装额外的模块(upstream_fair)来实现。

upstream backend {fair; # 启用公平调度算法server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
4、URL Hash

URL Hash 算法根据访问的URL的哈希结果分配请求。每个请求的URL会被分配到指定的服务器,这有助于提高缓存效率。但这种方法需要安装Nginx的hash软件包。

upstream backend {hash $request_uri; # 启用URL哈希算法server backend1.example.com;server backend2.example.com;
}
# 根据请求的URL哈希值来决定将请求发送到backend1还是backend2。

Nginx实践

Nginx 通过配置 .conf 静态文件运行(如/usr/local/nginx/conf/vhost/admin.conf)。
upstream backend_servers {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}server  {listen 80;  # 服务端口号client_max_body_size 100m;  # body请求数据大小index index.html;  # 项目地址root  /user/project/admin;  # 项目根目录地址# 路由配置location ~ /* {proxy_pass  http://127.0.0.1:3001;  # 代理服务地址 proxy_pass http://backend_servers;proxy_redirect     off; proxy_set_header   Host             $host;proxy_set_header   X-Real-IP        $remote_addr;proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;proxy_max_temp_file_size 0;proxy_connect_timeout      90;proxy_send_timeout         90;proxy_read_timeout         90;proxy_buffer_size          4k;proxy_buffers              4 32k;proxy_busy_buffers_size    64k;proxy_temp_file_write_size 64k;}location ~ .*.(gif|jpg|jpeg|png|swf)$ {expires      1d;}location ~ .*.(js|css)?$ {expires      24h;}location ~ /.well-known {allow all;}location ~ /. {deny all;}access_log  /user/logs/admin.log; # 记录日志
}

配置详情如下:

server:定义一个虚拟主机的配置块,一个 HTTP 中可以配置多个 server。

listen 80:设置服务端监听的端口号为 80。

client_max_body_size 100m:设置请求中允许的最大 body 大小为 100 MB。

index index.html:设置项目地址的默认文件为 index.html。

root /user/project/admin:指定项目根目录的路径。

location /:配置请求路径为 / 的 location 块。

  • proxy_pass http://127.0.0.1:3001:将请求代理到地址的后端服务器。
  • proxy_redirect off:关闭代理重定向。
  • proxy_set_header:设置代理请求头。
  • proxy_next_upstream:定义当后端服务器返回错误时,Nginx 将如何处理请求。
  • proxy_max_temp_file_size:设置允许的最大临时文件大小。
  • proxy_connect_timeout、proxy_send_timeout、proxy_read_timeout:定义代理连接、发送和读取超时时间。
  • proxy_buffer_size、proxy_buffers、proxy_busy_buffers_size:设置代理缓冲区的大小。
  • proxy_temp_file_write_size:设置代理临时文件的写入大小。

location ~ .*.(gif|jpg|jpeg|png|swf)$:配置请求以 .gif、.jpg、.jpeg、.png 或 .swf 结尾的文件的 location 块。

  • expires 1d:设置这些文件的过期时间为 1 天。

location ~ .*.(js|css)?$:配置请求以 .js 或 .css 结尾的文件的 location 块。

  • expires 24h:设置这些文件的过期时间为 24 小时。

location ~ /.well-known:配置请求以 /.well-known 开头的路径的 location 块。

  • allow all:允许所有请求访问该路径。

location ~ /. :配置以 . 开头的路径的 location 块。

  • deny all:禁止所有请求访问该路径。

access_log /user/logs/admin.log:指定记录日志的路径为 /user/logs/admin.log。

Nginx 配置的实战案例通常涉及多种场景,包括但不限于静态资源服务、反向代理、负载均衡、HTTPS 配置、安全防护等。以下是一些常见的 Nginx 配置实战案例:

静态资源服务
server {listen 80;server_name example.com;location / {root /path/to/your/static/files;index index.html index.htm;}location ~* \.(jpg|png|gif|jpeg)$ {expires 30d;add_header Cache-Control "public";}
}

在这个案例中,Nginx 配置为服务静态文件,如 HTML、CSS、JavaScript 和图片等。通过设置 root 指令,指定了静态文件的根目录。同时,对于图片文件,通过 expires 指令设置了缓存时间为 30 天,减少了服务器的负载和用户等待时间。

反向代理
server {listen 80;server_name api.example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}

这个案例展示了如何配置 Nginx 作为反向代理服务器。当客户端请求 api.example.com 时,Nginx 会将请求转发到后端服务器集群。通过设置 proxy_set_header,可以修改客户端请求的头部信息,确保后端服务器能够正确处理请求。

负载均衡
http {upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;}server {listen 80;server_name example.com;location / {proxy_pass http://backend;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}}
}

在这个负载均衡的案例中,Nginx 将请求分发给多个后端服务器。通过 upstream 指令定义了一个服务器组,然后在 location 块中使用 proxy_pass 指令将请求代理到这个服务器组。Nginx 支持多种负载均衡策略,如轮询(默认)、IP 哈希等。

HTTPS 配置
server {listen 443 ssl;server_name example.com;ssl_certificate /path/to/your/fullchain.pem;ssl_certificate_key /path/to/your/private.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';ssl_prefer_server_ciphers on;location / {root /path/to/your/https/static/files;index index.html index.htm;}
}

这个案例展示了如何配置 Nginx 以支持 HTTPS。通过指定 SSL 证书和私钥的路径,以及设置 SSL 协议和加密套件,可以确保数据传输的安全。同时,建议使用 HTTP/2 协议以提升性能。

安全防护
server {listen 80;server_name example.com;location / {# ... 省略其他配置# 防止 SQL 注入等攻击rewrite ^/(.*)$ /index.php?param=$1 break;# 限制请求方法,只允许 GET 和 POSTif ($request_method !~ ^(GET|POST)$ ) {return 444;}# 防止跨站请求伪造add_header X-Frame-Options "SAMEORIGIN";add_header X-Content-Type-Options "nosniff";add_header X-XSS-Protection "1; mode=block";}
}

在这个安全防护的案例中,Nginx 配置了多种安全增强措施。通过 rewrite 指令,可以防止一些常见的 Web 攻击,如 SQL 注入。通过限制请求方法,可以减少服务器被恶意利用的风险。同时,添加了一些 HTTP 头部来增强浏览器安全,如防止点击劫持、MIME 类型嗅探和跨站脚本攻击(XSS)。
这些案例仅是 Nginx 配置的冰山一角。N

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/825018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift Publisher 5 for mac:打造精美版面

Swift Publisher 5 for mac:打造精美版面 Swift Publisher 5是一款专业的版面设计和编辑工具,为Mac用户提供了强大的设计功能和直观的操作界面。以下是关于Swift Publisher 5的功能介绍: 直观易用的界面:用户能够轻松地使用Swift …

每日两题 / 189. 轮转数组 560. 和为 K 的子数组(LeetCode热题100)

189. 轮转数组 - 力扣&#xff08;LeetCode&#xff09; 向右轮转将使尾部k个元素顶到头部 将整个数组反转&#xff0c;再分别反转前k个元素和剩下的元素即可 class Solution { public:void rotate(vector<int>& nums, int k) {k % nums.size();reverse(nums.begi…

MOM系统框架及其主要功能

MOM系统&#xff08;Message-Oriented Middleware&#xff09;是一种基于消息传递的中间件系统&#xff0c;用于在分布式系统中实现异步通信和消息传递。MOM系统架构是指MOM系统的组成部分和它们之间的关系&#xff0c;下面我们将对MOM系统架构进行全面解析。 MOM系统的架构通…

C# 自动填充文字内容到指定图片

目录 需求 开发运行环境 方法设计 实现代码 AddText方法 图片转Base64 调用示例 小结 需求 在我们的一些发布系统项目应用中&#xff0c;会经常发布一些链接图标&#xff0c;该图标基本上以模板背景为主&#xff0c;并填充项目文字内容。解决方式一般会让美工进行制作…

Qt 拖放功能详解:理论与实践并举的深度指南

拖放&#xff08;Drag and Drop&#xff09;作为一种直观且高效的用户交互方式&#xff0c;在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持&#xff0c;允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理&#xff0c;结合详…

代码随想录阅读笔记-回溯【N皇后】

题目 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案&#xff0c;该方案中 Q 和 . 分别代表…

【2024】使用Rancher管理k8s集群和创建k8s集群

Rancher管理k8s集群及创建k8s集群。 Rancher版本为:2.8.2目录 rancher管理k8s集群rancher创建k8s集群rancher管理k8s集群 使用rancher管理已经存在的k8s集群。 本部分内容需要自行准备好k8s集群及rancher平台,部署请看本人其他文章 。 登录到rancher平台后,点击集群管理,…

C#:闰年判断

任务描述 编写程序&#xff0c;完成如下功能&#xff1a;从键盘输入任意年份year&#xff0c;判别该年份是否闰年。 为避免出现格式错误&#xff0c;请直接拷贝粘贴题目中给的格式字符串和提示信息到你的程序中。 ####输入 从键盘任意输入一个年份 输出 根据是否闰年进行输出…

JavaScript eval() 函数

定义和用法 eval() 函数计算 JavaScript 字符串&#xff0c;并把它作为脚本代码来执行。 如果参数是一个表达式&#xff0c;eval() 函数将执行表达式。如果参数是Javascript语句&#xff0c;eval()将执行 Javascript 语句。 语法 eval(string) 实例 执行JavaScript代码或…

部署wordpress

查看别名type ll ll 是 ls -l --colorauto 的别名 设置别名alias alias ymyum install -y 使用别名ym nginx 取消别名unalias ym 基于LNMP做一个wordpress nginx mysql 5.7 PHP 7.4 1、linux基本环境 修改主机名 hostnamectl set-hostname $name 关闭防火墙及selinux …

关于FastJson转换map集合为json字符串解析时格式出错的问题

在Java中使用Fastjson将包含Map类型key的Map集合转换为String时&#xff0c;如果直接使用Fastjson的JSON.toJSONString()方法&#xff0c;可能会因为JavaScript的安全性限制&#xff08;例如对象的key必须是字符串&#xff09;而在前端JavaScript解析时出现问题。 因为当 转换时…

113 如何排查 cpu 过高的业务进程

前言 又是一个面试问题, 呵呵 之前碰到的 一个 java 进程 cpu 占用率过高, 应该如何排查? 对于这种问题, 第一反应就是 jstack, pstack, 然后仔细观察多次堆栈信息结果的 重复率较高的代码 因此 我给出的思路是, 写脚本 多次 jstack 目标进程, 然后 再统计分析一下 出现频…

LLM理解v1

答疑 什么是知识库&#xff1f; LLM&#xff08;Large Language Models&#xff0c;大型语言模型&#xff09;如GPT系列&#xff0c;通常是基于海量的文本数据进行训练的。它们通过分析和理解这些数据来生成回答、撰写文章、解决问题等。当我们提到LLM的“本地知识库”时&…

Stable Diffusion 模型分享:CyberRealistic XL(真实)cyberrealisticXL_v11VAE.safetensors

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八下载地址模型介绍

mybatisPlus数据字段填充

这里用到的时实体类User import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import lombok.…

揭秘Arthas:如何轻松查看入参的命令

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 大家好&#xff0c;我是你们的博主。今天我要和大家分享一个非常实用的技术技巧&#xff0c;那就是如何使用Arthas来查看入参的命令。我相信这个技巧对于那些想要提升自己Java开发技能的程序员来说&#xff0c;一定是…

压缩感知的概述梳理(1)

参考文献 An efficient visually meaningful image compression and encryption scheme based on compressive sensing and dynamic LSB embedding 基本内容 基本关系梳理 压缩感知核心元素 信号 x 长度&#xff1a;N动态稀疏或可用变换表示&#xff1a;x &#x1d74d;s …

如何将低分辨率的视频变高清,使用AI工具分辨率画质增强至1080P、4K或者8K(附工具)

环境&#xff1a; Topaz Video AI 5.0 问题描述&#xff1a; 如何将低分辨率的视频变高清&#xff0c;使用AI工具分辨率画质增强至1080P、4K或者8K 原视频 增强1080P 解决方案&#xff1a; 1.打开软件&#xff0c;导入要处理的视频&#xff08;工具在本文最后附上&#xf…

C 排序算法

冒泡排序 冒泡排序&#xff08;英语&#xff1a;Bubble Sort&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序&#xff08;如从大到小、首字母从A到Z&#xff09;错误就把他们交换过来。 过程演示&…