Nginx 基础篇总结

摘要:Nginx 是一款强大而高效的服务器软件,被广泛应用于构建高性能的网络应用。它采用了基于事件驱动的模型和 I/O 多路复用技术,实现了并发处理和高吞吐量的能力。Nginx 在处理静态资源、反向代理、负载均衡等方面表现出色,同时具有高度的可定制性和可扩展性。它的配置简洁灵活,易于使用和管理。无论是小型网站还是大型分布式系统,Nginx 都是一个理想的选择。通过提供高效的请求处理和优化的性能,Nginx 成为了现代网络架构中不可或缺的一部分,为用户提供了卓越的体验。

基本使用

  ngixn的使用主要是看配置文件的使用。先看配置文件

  

worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
      listen 80;
      server_name localhost;
      
      location / {
           # proxy_pass http://www.zzuli.edu.cn;
            root   html;
            index  index.html index.htm;
        }
    }

}

这是保证ngixn可以使用的最小配置文件,ngixn是一个多进行程序,worker_processes 1是ngixn的一个工作进程,同时还有一个master进程负责管理配置文件。

接下来主要看http模块,这里的server模块下监控的是服务器的80端口,当你访问服务器地址时,会通过http请求携带一个请求头Host,携带的内容是你访问的域名,可以是localhost或者www.baidu.com。此时访问服务器的80端口,就会被nginx监听,然后location是为了根据你的uri路径的不同做出不同的匹配。由于直接访问一般是ip/或者ip/index.html都会被location匹配,此时会把根目录root下面的信息匹并返回,这里的root html是相对路径。所以就会返回index.html页面。

nginx模块组成

Nginx 的配置文件由多个模块组成,每个模块负责不同的功能和配置项。以下是常见的 Nginx 配置文件模块及其作用的概述:

  1. "main"模块:这是配置文件的顶级模块,包含全局配置项。它定义了 Nginx 的全局设置,如运行用户、工作进程数、事件模型等。

  2. events 模块:该模块用于配置与事件处理相关的参数。您可以设置事件驱动模型、最大连接数等。

  3. http 模块:这是配置 HTTP 服务的主要模块。它包含了 HTTP 相关的配置项,如代理、反向代理、负载均衡、缓存、日志等。

  4. server 模块:该模块用于配置虚拟主机(Server)的设置。在一个 http 块中可以包含多个 server 块,每个 server 块对应一个虚拟主机的配置。您可以在这里定义域名、监听端口、SSL/TLS 设置等。

  5. location 模块:这是用于配置请求处理逻辑的模块。在 server 块内部,可以包含多个 location 块,每个 location 块对应不同的 URL 路径或模式。您可以在这里定义代理规则、重定向、缓存策略、限流等。

  6. upstream 模块:该模块用于配置上游服务器或负载均衡集群。您可以定义后端服务器的地址、权重、健康检查等设置。upstream 模块通常与 location 模块一起使用。

  7. 其他模块:Nginx 还提供了许多其他模块,用于添加额外的功能和扩展,如 SSL 模块、反向代理模块、缓存模块、安全模块等。这些模块可以根据需要进行配置和加载。

虚拟主机

但是一个服务器中一个nginx只监控一个端口有些浪费,所以有了虚拟主机的概念就是出现多个server可以共同监听同一个端口,但是server_name 要求是不同的,不然启动会报错,这时首先根据端口进行过滤,在根据请求携带的请求头中的host字段进行精确的匹配,但是多个server模块要在http模块内部。

http协议和https协议

  当我们浏览器输入域名时首先会经过dns解析域名,找到其对应的ip,然后通过应用层协议http协议发送数据。http协议基于tcp/ip协议,这个协议的底层时socket就是基于二进制流传送数据,但是这种流的方式接收方可能不知道你想发送的数据到底是什么,比如你发了一句你好世界,接收方可能会认为“你”是一个词,好世界是一个词。这是因为双方没有达成一致,导致接收方不知道从哪里短断句,这时就出现了tcp/ip协议。这里主要讲述http协议

我们发送数据给目标服务器数据要先经过路由器交换机等等才能发送到目的地,这个过程可能要经过数个网关,网关暂时理解为一个替你转发数据的管理者。这时你传输的数据可能在网关被不法分子给获取破译,以为用的时http协议进行的通讯,我只需要简单按照协议破解就行。这样就会造成数据泄露。那能不能对数据加密呢?加密的方法有很多种,比如简单的凯撒密码,就是把数据后移几位,比如说A->C,接受方只需要把数据前移就能得到数据C->A。但是这方法不太靠谱存在暴力破解的可能。这种加密数据对称加密,这种加密方式可以还原。这时https的出现就就解决了问题,相当于我把数据加密你进行解密,https采用了一个非对称加密的方式,非对称方式原理是每个发送方和接收方都创建一对公钥和私钥,公钥可以任意传播,私钥只能自己保存,这种加密的特性是利用公钥不能解密数据。当客户端和服务器端建立连接时,服务器发送自己的公钥给用户,用户使用公钥加密数据,发送到服务器,服务器用自己的私钥解密并利用客户的公钥相应数据。这样就保证了即使数据被拦截也无法解开。但是这种方式还存在一种漏洞,发送请求需要经过网关,比如网关一开始就劫持你的数据,然后网关给你一个网关的假密钥,然后网关依然把你的请求代理发送到服务器,然后服务器相应,网关拿着相应的数据再次发送给你,这样的话网关依旧可以在你不知情的情况下看到你的信息。这时间就有一个CA机构,

CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA机构的数字签名使得攻击者不能伪造和篡改证书。在SET交易中,CA不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。

CA是证书的签发机构,它是PKI的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

CA 也拥有一个证书(内含公钥)和私钥。网上的公众用户通过验证 CA 的签字从而信任 CA ,任何人都可以得到 CA 的证书(含公钥),用以验证它所签发的证书。

如果用户想得到一份属于自己的证书,他应先向 CA 提出申请。在 CA 判明申请者的身份后,便为他分配一个公钥,并且 CA 将该公钥与申请者的身份信息绑在一起,并为之签字后,便形成证书发给申请者。

如果一个用户想鉴别另一个证书的真伪,他就用 CA 的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。

为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国内、国际安全电子交易协议标准的电子商务安全证,并负责管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。

反向代理

反向代理就是隐藏了服务器端的信息,相当于给你一个接口你只需要发送请求去获得资源不需要知道资源具体在那个服务器上

反向代理的操作 在server模块的location下配置 proxy_pass  http://www.baidu.com

 server {
      listen 80;
      server_name localhost;
      
      location / {
            proxy_pass http://www.baidu.com;
           
        }
    }

当请求被server和location匹配后就会把请求转交给百度,比如输入192.158.88.130(虚拟机地址)/hello这时默认访问80端口,而且携带的请求头的host为localhost,这是就匹配server的规则实际请求就是http://www.baidu.com/hello

负载均衡

当有多个服务器时,为了使请求流量更加的均匀这是就要使用负载均衡了,负载均衡有许多种比如说轮询(就是每个服务器被请求就换下一个服务器请求)和权重(按照比例分配请求)

实操:

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;
    upstream cluster{
     server http:www.baidu.com:80;
     server http:www.jd.com:80;
    }

    server {
      listen 80;
      server_name localhost;
      
      location / {
            proxy_pass http://cluster;
            
        }
    }

}

首先把集群的ip或者域名放在http的upstream模块下,名字任意这里用的时cluster,然后反向代理把域名换成cluster,默认是轮询策略。

防盗链

  我们也看到了nginx可以用于反向代理,别人完全可以搭建一个网站然后反向代理使用你的资源,对于自己的服务器资源不想被来自其他的网页引用的话就要使用防盗链功能了。

盗链是直接使用正规网站保存图片、视频等的 URL 以获取相应的资源。最简单的防盗想法就是根据客户端请求资源时所携带的一些关键信息来验证请求的合法性,比如客户端 IP、请求 URL 中携带的 referer,如果不合法则直接拒绝请求。此外,由于这些基础信息都可以伪造,因此这样的基础手段也不一定安全。此外,还有登录认证、使用 cookie 等其他防盗连手段。另外,针对特定场景,比如流媒体直播中还有更为高级的防盗手段包括时间戳防盗链、swf 防盗链、回源鉴权防盗链等。

 server {
      listen 80;
      server_name localhost;

      
      location / {
            proxy_pass http://www.baidu.com;
           
        }
      location ~ \.(jpg|png|gif|jpeg)$ {
        valid_referers 192.168.88.130;
        if ($invalid_referer) {
            return 403;
        }
      }
    }
      
     
    

对于一下静态资源hpg/png等不想被访问,这里设置了valid_referers 192.168.88.130,也就是除了这个来源的jpg等请求别的来源的都会显示403

keepalive

是指计算机网络中的一种机制,用于确保网络连接的持续运行和可用性。无论是在客户端和服务器之间的通信,还是在网络设备之间建立连接,Keepalive机制都发挥着重要的作用。

Keepalive机制的基本原理是定期发送保持活动状态的信号或数据包,以监测连接的状态并防止连接被关闭。这些信号可以是空闲数据包、特定的控制信号或应用层协议中的心跳信号。发送这些信号的时间间隔通常是可配置的,可以根据具体的应用和网络环境进行调整。

如果不使用这种机制就会导致每次http请求都要建议tcp/ip协议,这个过程需要消费许多资源

   使用时机:

  1. 长时间的会话或持久连接:如果您的应用需要长时间的会话或持久连接,如远程登录会话或实时数据传输,启用Keepalive机制可以确保连接持续性,并防止连接因长时间空闲而被关闭。

  2. 高并发的Web应用:对于高并发的Web应用,启用Keepalive机制可以显著提高性能和吞吐量。通过在HTTP响应中设置Keepalive头信息,可以要求客户端在同一个连接上发送多个请求,而无需为每个请求都建立新的连接。这样可以减少连接建立和拆除的开销,提高请求响应速度。

  3. 对于只需要请求一次的资源就不需要开启,比如css,js等静态资源客户端请求一次就可以进行缓存,就不需要开启keepalive

   针对用户端: 

     配置方式:

         配置在http模块

    keepalive_timeout  65 65; 超过这个时间 没有活动,会让keepalive失效 
    keepalive_timeout = 0 即关闭
    keepalive_time 1h;  一个tcp连接总时长,超过之后 强制失效
  
    send_timeout 60; 默认60s 系统中若有耗时操作,超过 send_timeout 强制断开连接。 注意:准备过程中,不是传输过程


    keepalive_requests 1000; 一个tcp复用中 可以并发接收的请求个数

针对上游服务器

   upstream中

keepalive 100 //指最多和上游服务器保持100个长连接
keepalive_timeout 60
keepalive_requests 50

  server中

proxy_http_version 1.1;
配置http版本号
默认使用http1.0协议,需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持。
proxy_set_header Connection "";

由于1.0的http协议不支持长连接所以指定和服务器之间使用http1.1默认支持长连接

connection设置为“”或者keep-alive,对于一些不希望长连接的配置为close

通常情况下,Nginx 会根据与后端服务器的连接类型自动设置  Connection 头部字段。如果 Nginx 和后端服务器之间使用持久连接(keep-alive),Nginx 会将 Connection 头部字段设置为 "keep-alive" ;如果使用短连接(close),Nginx 会将 Connection 头部字段设置为close。

未完待续:后续会把高级部分补充 

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值