• Nginx学习总结


    前言

    Nginx学完已经有一段时间了,现在有点忘记了,真的是鱼的记忆~~~于是今天把它总结一遍,就当作是复习。

    一、Nginx的基本概念

    Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。其特点是占有内存少,并发能力强,有报告表明能支持高达50000个并发连接数。

    1、反向代理

    说到反向代理,不得不说说正向代理,什么是正向代理,如果把局域网外的Internet想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务器就称为正向代理。简单来说,就是访问一个网址,先给浏览器配置代理服务器(区别与反向代理),通过代理服务器再去帮我们访问网址比如说:翻墙~~~


    反向代理: 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器,目标服务器处理完后返回数据,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址比如说Nginx。如图:

     

     

     正向代理和反向代理区别:

    正向代理代理的是客户端,帮客户端发送请求给目标服务器,服务器响应后,由代理服务器将响应内容返回给客户端,使客户端对目标服务器不可见

    反向代理代理的是目标服务器,负责收发请求,目标服务器对客户端来说是不可见的

    2、负载均衡

    在我们传统单一的web项目中,完整的一个过程是:客户端发起请求 --> 服务器 --> 数据库-->返回客户端,在并发量少时,这样是没问题的,但随着使用人群的增多,并发量变大,项目就会出现性能瓶颈,经常出现宕机的情况。为了解决这个问题,我们有许多解决方案,最直接的就是提高硬件设施的性能,但这样做不但成本高,而且随着项目的复杂度、访问量等继续增大,带来的问题也越来越多。我们打个比喻,开始2个人同时吃饭(并发),我们拿个小锅就可以解决,然后到10个,我们可以换成大一点的,如果到100个人,我们就不太可能买一口能够做100份食物的锅了,这时,我们可以买10口做10个人的饭的锅,这样也能满足我们的需求。负载均衡也一样,我们通过多台服务器(集群)来解决大并发的问题,Nginx自动帮我们将请求分配到各个服务器。

    3、动静分离

    用来加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析的速度,降低原来单个服务器的压力。如图:

     

    二、Nginx在Linux下的安装

    Nginx下载官网

    这里附上Nginx的下载官网,网上的安装教程很多,大家可以自行选择版本进行安装,我就不赘述了。

    三、Nginx的基本操作

    1、基本命令

    注意,使用Nginx操作命令的前提条件,必须进入到Nginx的目录--这里是我的安装目录,大家进入自己的安装目录即可

    /usr/local/nginx/sbin

    常用命令如下

    1. # 查看版本号
    2. ./nginx -v
    3. # 启动nginx
    4. ./nginx
    5. # 关闭nginx
    6. ./nginx -s stop
    7. # 重新加载nginx(修改配置文件使其生效)
    8. ./nginx -s reload

    2、配置文件

    Nginx的配置文件在Nginx目录下的conf目录,全名为nginx.conf
    Nginx的配置文件由三部分组成

    全局块

    从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令

    比如配置:worker_processes 1;
    这是Nginx服务器并发处理服务的关键配置,它的值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。

    events块

    events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个worker process可以同时支持的最大连接数等

    比如配置:worker_connections 1024;
    单个worker进程支持的最大连接数为1024,这部分配置对于Nginx的性能影响较大,在实际中应灵活配置

    http块

    这是Nginx配置中最频繁的一部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是,http块包括http全局块和server块

    http全局块
    这部分包括文件引入,MIME-TYPE定义,日志自定义、连接超时时间、单链接请求数上限等。

    server块
    这块和虚拟主机有密切关系,从用户角度看,虚拟主机和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。


    全局 server 块
    最常见的配置是本虚拟主机的监听配置和本虚拟主机的名称或IP配置
    比如配置监听80端口,服务名称为localhost

    1.      listen  80;
    2.      server_name  localhost;

    location 块
    一个 server 块可以配置多个 location 块。这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理,包括地址定向、数据缓存和应答控制等功能,还有许多第三方模块也在这里配置。
    比如如下配置:

    1. location /{
    2.     root    html;
    3.     index   index.html main.html
    4. }

    用Word画了一张图帮大家更好地理解配置文件中的各个模块的关系

    四、Nginx实例配置

    (一)反向代理

    1、准备工作
    安装tomcat
     A 在linux系统安装tomcat,使用默认端口8080

    (1)将tomcat的压缩包放到/usr/src目录下(可以使用filezilla工具通过拖动的方式来上传)

    (2)进入目录,将tomcat解压,命令:tar -xvf 压缩包名称

    (3)启动tomcat:进入tomcat目录,有一个startup.sh,执行命令:./startup.sh,启动成功后会看到 Tomcat started的提示,也可以通过日志查看启动效果,进入到 logs 目录下,输入命令:tail -f catalina.out 即可查看
    B 对外开放访问的端口

    1. 在这里我们先添加开放的端口号:8080
    2. # 添加开放端口:8080
    3. firewall-cmd --add-port=8080/tcp --permanent
    4. # 重新加载
    5. firewall-cmd --reload
    6. 查看开放的端口号
    7. firewall-cmd --list-all


    C 在windows系统中通过浏览器访问tomcat

    在浏览器输入:服务器ip:8080,如果访问到的是tomcat的主页面,则是成功了,我们进入下一步

    2、实例实现
    实现的效果为,在浏览器地址输入 www.666.com 就跳转到linux系统的tomcat主页面中

    A 配置域名

    先在C:\Windows\System32\drivers\etc目录下配置自己的域名(如果不是买的~~),这个域名可以随便取名,配置格式为:服务器ip+空格+域名,这样你的机子就知道这个域名对应的ip是啥了,不然就只有买一个,让你的机子去DNS服务器上找(大学生穷啊),例如:192.168.146.100 www.666.com,配置好后,我们可以通过 www.666.com:8080访问到tomcat

    B Nginx请求转发的配置

    进入到Nginx的配置文件,进行配置

    1. server {
    2.     #监听端口
    3.     listen  80;
    4.     #监听ip
    5.     server_name 192.168.146.100;
    6.     
    7.     location / {
    8.         root html;
    9.         #代理的目标地址
    10.         proxy_pass http://127.0.0.1:8080;
    11.         index index.html main.html;
    12.     }
    13. }

    修改后保存(esc键 :wq),并运行nginx:./nginx
    C 验证是否生效
    输入www.666.com,如果来到了tomcat的主页面,则是成功了

    (二)负载均衡

    实现效果,浏览器地址栏访问:http://192.168.146.100/edu/cs.html,负载均衡效果,平均到 8080端口和8081端口中

    1、准备工作

    准备两台tomcat服务器,一台8080,一台8081
    在两台tomcat服务器的webapps目录中,创建名称是edu的文件夹,再创建不同的html页面(用于区分)

    2、Nginx配置
    进入到Nginx的配置文件,开始配置
    配置后保存退出

    1. upstream myserver {
    2.     server 192.168.146.100:8080;
    3.     server 192.168.146.100:8081;
    4. }
    5. server {
    6.     listen 80;
    7.     server_name 192.168.146.100;
    8.     location / {
    9.         #代理的目标地址就是我们前面配置的myserver
    10.         proxy_pass http://myserver;
    11.     }
    12. }

    3、 测试效果

    保存配置文件后应重启Nginx,然后访问 http://192.168.146.100,请求多次,如果相应的结果是交替的(轮询),则是成功了

    4、Nginx负载均衡策略
    前面的测试中,我们发现Nginx的默认策略是轮询,那它还有哪些策略呢,这里我进行一些补充

    weigh(权重)
    默认值为1,权重越高的被分配的机会越大,被请求的次数也越多(成正比)
    示例配置如下

    1. upstream myserver {
    2.     server 192.168.146.100:8080 weight=3;
    3.     server 192.168.146.100:8081 weight=5;
    4. }

    ip_hash
    每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
    示例配置如下

    1. upstream myserver {
    2.     ip_hash
    3.     server 192.168.16.168:8881;
    4.     server 192.168.16.168:9991;
    5. }

    fair(第三方)
    按照后端服务器的响应时间来分配(服务器配置高的多接收点响应),响应时间短的优先分配
    示例配置如下

    1. upstream myserver {
    2.     server 192.168.146.100:8080;
    3.     server 192.168.146.100:8081;
    4.     fair
    5. }

    (三)动静分离

    在前面Nginx的介绍部分,我们讲到了什么是动静分离,从目前实现角度来讲,大致分为两种:
    (1)将静态文件独立成单独的域名,放在独立的服务器上,这是主流的方案
    (2)将静态和动态的文件放在一起,通过Nginx来分开。我们通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可, 所以不会产生额外的流量。此种方法非常适合不经常变动的资源。

     

     

     

    五、Nginx基本原理

    1、master&worker机制
    Nginx 启动后,由两个进程组成,一个是master(管理者),一个是worker(工作者)
    一个Nginx:master只有一个,worker可以有多个,master的工作包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程。

    可以通过命令查看相关进程

    ps -ef | grep nginx

    master就相当于领导,不做实质工作,只分配工作,worker是员工,负责处理工作,当一个请求进来,master进行管理,worker通过争抢(妥妥的卷王)的方式去获取请求,图示:

     

    2、master&worker机制的优势
    (1)首先,每个 worker是独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多
    (2)可以使用 nginx –s reload 热部署(不需要停机,边工作,边加载新的配置)
    (3)采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的 worker 进程


    3、相关问题
    worker的数量:
    Nginx 同 redis 类似都采用了 io 多路复用机制,每个 worker 都是一个独立的进程,每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。每个 worker 的线程可以把一个 cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗


    连接数worker_connection
    发送一个请求需要占用两个或者四个worker,静态资源为两个(一来一回),动态资源(服务器)为四个(Nginx还要去访问tomcat等服务器,拿到信息后返回,占用两个)


    Nginx支持的最大并发数
    Nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的最大并发数是多少?

    普通的静态访问最大并发数是: worker_connections * worker_processes / 2

    而如果是 HTTP 作为反向代理来说,最大并发数量是 worker_connections *worker_processes / 4

    这个值是表示每个worker 进程所能建立连接的最大值,所以,一个Nginx 能建立的最大连接数,应该是 worker_connections * worker_processes。当然,这里说的是最大连接数,对于 HTTP请求 本地资源来说 , 能 够支持的最大并发数量是worker_connections * worker_processes,如果是支持 http1.1的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes / 2,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes / 4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。

    创作不易,老铁们点赞收藏加关注~~~~

  • 相关阅读:
    JavaWeb -- MySQL
    LeetCode | 168.Excel表列名称
    解决-linux 一次 高并发处理过程。
    震撼来袭,最具中国特色的微服务组件:新一代SpringCloud Alibaba
    计算机毕业设计ssm餐饮外卖系统v22fo系统+程序+源码+lw+远程部署
    SpringBoot集成Quartz实现定时任务
    30个Python操作小技巧
    vue实现在页面拖拽放大缩小div并显示鼠标在div的坐标
    windows本地文件上传linux 或 linux输入rz命令后出现receive.**B0100000023be50
    机器学习开源工具BatteryML,一站式分析与预测电池性能
  • 原文地址:https://blog.csdn.net/qq_52297656/article/details/127697280