Ngin入门套餐

快速了解Nginx

  • 一、代理
    • 1.1 正向代理
    • 1.2 反向代理
    • 1.3 正向代理和反向代理的区别
  • 二、Nginx负载均衡策略
    • 2.1 轮询(Round Robin)
    • 2.2 加权轮询(Weighted Round Robin)
    • 2.3 IP 哈希(IP Hash)
    • 2.4 最少连接(Least Connections)
    • 2.5 随机(Random)
  • 三、动静分离
  • 四、配置文件解析

Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的。

特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。

Nginx代码完全用C语言从头写成。官方数据测试表明能够支持高达 50,000 个并发连接数的响应。

一、代理

1.1 正向代理

正向代理是一种网络代理模式,代理服务器位于客户端和目标服务器之间。它的主要功能是接受客户端请求,并将这些请求转发到目标服务器,然后将响应返回给客户端。正向代理通常用于实现访问控制、隐私保护、缓存等功能。
在这里插入图片描述
工作原理:

  1. 客户端请求:客户端(例如浏览器)向正向代理服务器发送请求,而不是直接请求目标服务器。
  2. 代理处理请求:正向代理接收到请求后,会将其转发到目标服务器。这时,目标服务器并不知道是哪个客户端在请求。
  3. 目标服务器响应:目标服务器将响应发送回正向代理服务器。
  4. 代理服务器返回响应:正向代理接收到从目标服务器返回的响应,并将其转发给客户端。

应用场景:

  1. 访问控制,通过设置代理服务器规则实现外来请求是否能够访问目标服务器。
  2. 匿名访问,代理服务器作为访问中介,双方都只知道代理服务器的 ip 信息。
  3. 加速访问,代理服务器能够缓存常见请求的响应,减少通信延迟,提高访问速度。
  4. 跨地域访问,有些内容会因为地域限制而无法访问,用户可以通过正向代理伪装成其他地区的用户来访问被限制的内容。

1.2 反向代理

反向代理是一种服务器配置,它可以接收客户端的请求,并将这些请求转发到后端的一个或多个服务器上。反向代理通常用于负载均衡、安全性、缓存等目的。
在这里插入图片描述
工作原理:

  1. 客户端请求:客户端(如用户的浏览器)发送一个HTTP请求,请求的数据可能是网页、图像或其他资源。
  2. 到达反向代理服务器:请求首先到达反向代理服务器,而不是直接到达后端应用服务器。
  3. 请求转发:反向代理服务器根据配置的规则,决定将请求转发到哪一台后端服务器。这些规则可以基于URL路径、负载均衡策略等。
  4. 后端处理:被选中的后端服务器接收到请求并进行处理。这可能涉及查询数据库、计算、调用其他服务等。
  5. 返回响应:后端服务器完成请求处理后,将相应的数据(如HTML页面、JSON 数据、文件等)返回给反向代理服务器。
  6. 响应转发给客户端:反向代理服务器接收到后端服务器的响应后,可能会对其进行缓存、修改或记录日志,然后再将响应发送回客户端。
  7. 客户端接收响应:客户端最终收到来自反向代理服务器的响应,呈现给用户。

应用场景:

  1. 负载均衡,反向代理可以将客户端请求分发到多个后端服务器,从而实现负载均衡。这种方法可以提高系统的可用性和性能,确保没有单一服务器过载。
  2. SSL/TLS终止,反向代理可以处理HTTPS请求,为后端服务器减轻了SSL/TLS加密和解密的负担。通过集中管理证书,使得更新和维护变得更加简单。
  3. 安全防护,使用反向代理可以隐藏后端服务器的真实地址,提供额外的安全层。它可以过滤恶意请求、进行身份验证或防止DDoS攻击等。
  4. 跨跨域资源共享(CORS),在某些情况下,反向代理可以用于解决跨域请求的问题。通过设置适当的HTTP头,允许特定源访问后端资源。
  5. 微服务架构,在微服务架构中,反向代理可以帮助路由请求到不同的服务。它也可以充当API网关,统一管理所有的API请求。

1.3 正向代理和反向代理的区别

正向代理是客户端互联网之间的中介。客户端通过正向代理访问其他网站或服务,而不是直接访问目标服务器。

客户端在访问互联网时,使用正向代理服务器作为请求的发起端,这样目标服务器就无法识别到客户端的真实IP信息,对客户端的身份起到一定的保护作用。


反向代理是位于客户端一组后端服务器之间的中间层。客户端向反向代理发送请求,而反向代理将请求转发给适当的后端服务器。

客户端在访问后端服务器时,访问的并不是真实的后端服务器地址,而是反向代理服务器,所有的服务访问都通过反向代理服务进行范围,由其进行转发。这样后端服务器架构就能够被很好的保护起来。

反向代理和正向代理的主要区别在于它们的工作方向及其角色定位,而不是仅仅依赖于请求的发起者(客户端或后端服务器)。

正向代理代理的是客户端,反向代理代理的是服务器端。

二、Nginx负载均衡策略

为了让资源更多的服务器接收到更多的访问请求,让每台服务器能够利用好自身的资源。 Nginx 提供了多种负载均衡策略,可以根据不同的需求和场景选择合适的策略。

2.1 轮询(Round Robin)

这是 Nginx 的默认负载均衡方法。请求按照顺序分配给后端服务器,即第一个请求发送给第一台服务器,第二个请求发送给第二台,以此类推。如果有多个请求并发到达,则会循环遍历后端服务器。
在这里插入图片描述

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

适用于无状态的访问请求,即没有保留相关数据在目标服务器上的访问请求,如果请求存在状态保存在目标服务器,那么下次访问时可能相应的不是上次的服务器,导致状态丢失。

2.2 加权轮询(Weighted Round Robin)

与简单的轮询类似,指定轮询几率,weight和访问比率成正比,但每台后端服务器可以被分配不同的权重。权重越高,被分配到请求的概率就越大。这对于性能差异较大的服务器特别有效。
在这里插入图片描述

upstream backend {
    server backend1.example.com weight=3 down;  # 权重为3
    server backend2.example.com weight=2 backup;  # 权重为2
    server backend3.example.com weight=1;  # 权重为1
}

down:表示当前的server暂时不参与负载
weight:默认为1.weight越大,负载的权重就越大。
backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。

2.3 IP 哈希(IP Hash)

这种方法使用客户端的 IP 地址计算哈希值,将请求总是分配给同一台后端服务器。这样可以保证相同用户的请求始终落在同一服务器上,可以解决session不共享的问题,适合需要会话保持的场景(如购物车应用)。
在这里插入图片描述

IPHash的轮询方式确实能解决Session问题,但是考虑到服务器可能存在宕掉的风险导致数据丢失,因此一般采用Redis对Session进行共享。

upstream backend {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.4 最少连接(Least Connections)

策略将请求路由到当前连接数最少的后端服务器。这对于处理长连接或高延迟请求非常有效,因为它可以确保负载在所有服务器之间尽可能均匀分配。

upstream backend {
    least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

2.5 随机(Random)

这个策略随机选择一台后端服务器来处理请求。这种方式可以在负载相对均衡的情况下减轻某些特定服务器的压力。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
    # 配置随机负载均衡
    # 注意:Nginx 默认没有提供随机算法,需要使用第三方模块
}

三、动静分离

动静分离,在我们的软件开发中,有些请求是需要后台处理的,有些请求是不需要经过后台处理的(如:css、html、jpg、js等等文件),这些不需要经过后台处理的文件称为静态文件。

让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作。提高资源响应的速度。

静态内容:如 HTML 文件、CSS 文件、JavaScript 文件、图片等,这些资源不需要服务器端处理,可以直接由 Nginx 提供。
动态内容:如 PHP、Python、Node.js 等,通过后端应用程序生成的内容,这些内容通常需要 web 应用服务器进行处理。

在这里插入图片描述
文件配置:

server {
 	# 静态文件配置
 	当URL为/时,提供静态文件/var/www/html/index.html供访问
    location / {
        root /var/www/html;  # 指向静态文件目录
        index index.html index.htm;
        try_files $uri $uri/ =404;  # 如果文件不存在,返回 404
    }
    
    # 针对特定目录的静态文件处理
    当访问URL为/static/XX时,根据下边配置的静态资源文件夹中的文件提供访问
    location /static/ {
        alias /var/www/static/;  # 指向静态资源文件夹
    }
    # 动态内容处理(例如 PHP)
    location ~ \.php$ { #此处是可以使用正则表达式的
        include snippets/fastcgi-php.conf;  # 引入 FastCGI 配置
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;  # PHP-FPM 的 socket 地址
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;  # 包含 FastCGI 参数
    }
}

静态内容处理:
/ 路径下的请求会被直接处理为静态文件。如果请求的文件存在,则返回该文件;否则返回 404 错误。
/static/ 路径用于处理静态文件,使用 alias 指令将 URI 映射到实际文件系统的位置。

动态内容处理:
使用正则表达式匹配以 .php 结尾的请求,并通过 fastcgi_pass 将请求转发给 PHP-FPM(FastCGI Process Manager),以便处理 PHP 文件。
对于其他动态请求(如 API 请求),我们通过 proxy_pass 将请求代理到 Node.js 应用程序或其他后端服务。

具体可以看下边的配置文件解析哈

四、配置文件解析

#全局配置
user  www-data; #指定运行 Nginx 工作进程的用户和组,通常选择一个权限较低的用户(如 www-data)以增强安全性。
worker_processes  auto; #设置工作进程的数量。使用 auto 可以根据系统的 CPU 核心数自动调整,通常建议设置为 CPU 核心数,以提高性能。

#错误日志配置 # 
error_log  /var/log/nginx/error.log warn; #配置错误日志的路径及其日志级别,级别包括 debug, info, notice, warn, error, crit, alert, emerg
pid        /var/run/nginx.pid; #指定存放 Nginx 主进程 PID(进程标识符)的文件路径。

#处理事件配置
events {
    worker_connections  1024;  #表示每个工作进程能够同时处理的最大连接数
}

#定义上游服务器,用于负载均衡
upstream backend { #此处的backend名称可用于下边的server调用
        # 定义后端服务器
        server backend1.example.com;  # 服务器 1
        server backend2.example.com;  # 服务器 2
        server 192.168.1.100:8080;    # 服务器 3(IP 地址)
        # 可以指定权重,数字越大表示优先级越高
        server backend3.example.com weight=3;  # 权重为 3
}

#网络请求配置
http {
    include       mime.types;  	t-Type。
    default_type  application/octet-stream; #未明确指定类型时使用的默认 MIME 类型。

    #访问日志的格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main; #设置访问日志的存放路径和使用的日志格式。此处使用前面定义的 main 格式。

    sendfile        on;  # 启用高效的文件传输方式,将文件从磁盘直接发送到网络,而无需经过用户空间,减少 CPU 占用率,提高性能。
    tcp_nopush     on;  # 在发送大文件时,尽可能将数据一起发送,减少 TCP 分段,提高效率。
    tcp_nodelay    on;  # 禁用 Nagle 算法,以便尽快发送小的数据包,适用于交互型应用。
    keepalive_timeout  65;  #  设置 HTTP Keep-Alive 连接的超时时间,单位为秒。即在这段时间内,如果没有新的请求,则连接会被关闭。

    #GZip压缩设置
    gzip  on; #开启 Gzip 压缩功能,可以减小传输的数据量,提高加载速度。
    gzip_types text/plain application/json application/javascript text/css application/xml text/xml application/xhtml+xml; #指定哪些 MIME 类型的响应内容应进行 Gzip 压缩。
    gzip_min_length  1000; #指定 Gzip 压缩的最小响应体长度,只有当响应体长度超过该值时,才会进行压缩。

	#服务器访问设置
    server {
        listen       80;  #指定Nginx监听的 IP 地址和端口号,80 表示监听 HTTP 请求。
        server_name  localhost;  #定义服务器的名称,通常是域名或 IP 地址。当多个虚拟主机存在时,用于匹配请求的主机名。

		#用于定义如何处理特定 URI 的请求,可以根据请求的 URI 路径进行不同的处理。
        location / {
            root   /var/www/html;  #定义文档根目录,Nginx 将从该目录提供静态文件。
            index  index.html index.htm;  #定义默认的索引文件,例如 index.html 或 index.htm,当请求目录时会返回这些文件(/var/www/html/index.html)。
			try_files $uri $uri/ =404; #如果文件不存在,返回 404
        }

		#提供静态文件配置
		location /static/ {
        alias /var/www/static/;  #将 URI 映射到实际文件系统的位置。
		}

        error_page  404  /404.html; #定义特定错误代码(如 404)的定制错误页面,可用于改善用户体验。

		#当访问URL等于/404.html时,internal用于标记该位置块为内部重定向使用。
        location = /404.html {
            internal; #它不能直接通过 HTTP 请求访问。例如,如果用户在浏览器中直接访问 /404.html,Nginx 将返回 404 错误,而不是显示该页面。
        }

        #指定以 /api/ 开头的请求的处理方式,这里使用了反向代理。
        location /api/ { #当URL为 Nginx服务器:80/api 时触发反向代理
            proxy_pass http://127.0.0.1:3000;  #将请求转发到指定的后端服务器,通常用于将负载分发到应用程序服务器。
            proxy_set_header Host $host; #设置代理请求中的 HTTP 头部信息,用于传递原始请求的信息,例如请求头部的 Host 和用户的真实 IP 地址。
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

		#指定以 /server/ 开头的请求的处理方式。
        location /server/ { #当URL为 Nginx服务器:80/server 时触发负载均衡
            proxy_pass http://backend;  # 将请求转发到定义的 upstream, 即按照预定的规则(轮询,权重,随机等)转发到定义的集群中的对应节点
            proxy_set_header Host $host;  # 传递主机头信息
            proxy_set_header X-Real-IP $remote_addr;  # 传递真实用户 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 传递 X-Forwarded-For 头
        }
    }
}


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unite Shanghai 2024 团结引擎专场 | 团结引擎 OpenHarmony 工程剖析

在 2024 年 7 月 24 日的 Unite Shanghai 2024 团结引擎专场演讲中,Unity中国 OpenHarmony 技术负责人刘伟贤对团结引擎导出的 OpenHarmony 工程进行了细节剖析,详细讲解 XComponent 如何与引擎结合,UI 线程和引擎线程的关联以及 ts/ets 的代…

PostgreSQL学习笔记六:模式SCHEMA

模式(Schema) PostgreSQL中的模式(Schema)是一个命名的数据库对象集合,包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象,使得同一个数据库中可以包含…

Linux命令——ls

命令格式:命令本身选项命令的指向目标 1.ls命令作用为列出目录下的内容 #lls后的选项有[-a,-l,-h]##注意ls与选项间应用空格隔开. 如下图为(ls命令体-l选项/根文件)的命令行 # ls -a 为:列出所有文件(包括隐藏文件&…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

接口性能测试,这个还真有用啊。

一、概述 性能测试按照不同视角,可以分为以下几类: a. 用户视角的性能 用户角度感受到的网站响应速度的快和慢。从用户在浏览器输入网址/打开应用,到整个页面呈现给用户的耗时。包含了用户端发送请求,服务端收到并执行请求&…

【2024版】Pycharm安装教程+汉化教程(零基础小白都能学会)

PyCharm安装教程 点击右边链接→PyCharm安装包 以专业版为例,继续进行安装(安装内容没啥太大区别,所以两版本都适用) 2.打开解压后的文件夹,右击pycharm 2024.1.4 3.点击下一步。 4.更改安装位置,点击下一步…

海外云手机:出海电商养号智能化方案

随着出海电商的迅猛发展,使用海外云手机进行养号已经成为越来越多商家的新选择。尤其在社交电商推广和短视频引流方面,海外云手机不仅提高了流量的精准度,还助力商家实现业务的快速增长。本文将探讨海外云手机养号相较于传统模式的优势&#…

机载交互详解!

一、机载交互网络 机载交互网络是指飞机内部用于传输飞行员指令、飞行数据以及系统状态信息的通信网络。它通常由多个节点(如传感器、控制器、显示器等)和连接这些节点的通信链路组成。 节点: 传感器节点:负责采集飞机的各种飞…

基于YOLOv11的车辆行人实时检测系统(python+pyside6界面+系统源码+可训练的数据集+也完成的训练模型)

上百种【基于YOLOv8/v10/v11的目标检测系统】目录(pythonpyside6界面系统源码可训练的数据集也完成的训练模型)-CSDN博客 ............................................................................................ 摘要: 本文提出了…

人工智能AI与机器学习ML基础入门

小学生都能看懂的人工智能入门书籍 第一章 入门简介 TensorFlow 入门 如果你想入门人工智能(AI)?机器学习(ML)和深度学习是很好的起点。不过,一开始接触这些概念时,可能会被各种选项和新术语搞…

WebGl 使用uniform变量动态修改点的颜色

在WebGL中,uniform变量用于在顶点着色器和片元着色器之间传递全局状态信息,这些信息在渲染过程中不会随着顶点的变化而变化。uniform变量可以用来设置变换矩阵、光照参数、材料属性等。由于它们在整个渲染过程中共享,因此可以被所有使用该着色…

前端开发攻略---使用AJAX监控网络请求进度

1、XHR实现 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title></head&…

用AI生成rtl设计(a simple synchronous FIFO)的一个实验

目录 1. 前言 2. RTL and testbench generation 2.1 RTL generation Explanation: Assumptions: 2.2 Testbench generation Explanation: 2.3 Add fsdb dump to testbench 3. 仿真与调试 3.1 RTL中的语法问题 3.2 testbench的问题 3.3 RTL中empty/full状态…

VS Code创建VUE项目(一)工具安装与项目创建

一.安装与配置npm 1.下载安装Node.js 安装Node.js 下载地址&#xff1a; Node.js — 在任何地方运行 JavaScript (nodejs.org)或下载 | Node.js 中文网 下载后一步步安装就好&#xff08;安装过程基本一路直接“NEXT”就可以了&#xff0c;直到Finished&#xff09;&#x…

第十五届蓝桥杯C/C++学B组(解)

1.握手问题 解题思路一 数学方法 50个人互相握手 &#xff08;491&#xff09;*49/2 &#xff0c;减去7个人没有互相握手&#xff08;61&#xff09;*6/2 答案&#xff1a;1024 解题思路二 思路&#xff1a; 模拟 将50个人从1到50标号&#xff0c;对于每两个人之间只握一…

内嵌服务器Netty Http Server

内嵌式服务器不需要我们单独部署&#xff0c;列如SpringBoot默认内嵌服务器Tomcat,它运行在服务内部。使用Netty 编写一个 Http 服务器的程序&#xff0c;类似SpringMvc处理http请求那样。举例&#xff1a;xxl-job项目的核心包没有SpringMvc的Controller层&#xff0c;客户端却…

李德仁院士携实验室及大势文旅团队参加“湖北旅游、武当突破”名家谈,分享数智文旅发展新经验

10月12日上午&#xff0c;2024世界武当太极大会在湖北省十堰市武当山盛大开幕。 2023年国家科学技术最高奖获得者、中国科学院、中国工程院院士、武汉大学李德仁教授携测绘遥感信息工程国家重点实验室&#xff08;后简称“实验室”&#xff09;团队以及大势智慧文旅团队&#…

gcc学习

理论 在使用 GCC (GNU Compiler Collection) 进行 C 或 C 程序的编译时&#xff0c;可以将整个过程分为四个主要阶段&#xff1a;预处理、编译、汇编和链接。下面是每个阶段的命令示例&#xff1a; 1. 预处理-E 预处理阶段会处理所有的预处理指令&#xff08;如 #include 和…

Qt消息对话框

问题对话框 对应API [static] QMessageBox::StandardButton QMessageBox::question( QWidget *parent, const QString &title, const QString &text, QMessageBox::StandardButtons buttons StandardButtons(Yes | No), QMessageBox::StandardButton defaultButt…

「Java服务」快速接入SkyWalking方法指南

一、背景 背景&#xff1a;Apache SkyWalking 是一个开源的分布式应用性能监控&#xff08;APM&#xff09;系统&#xff0c;主要用于监控微服务、云原生和容器化应用的性能。接入SkyWalking可以排查以智能投放服务为主的服务响应问题 技术架构 SkyWalking 的核心架构包括以…