Nginx学习笔记
2022-3-27
| 2023-3-30
4320  |  Read Time 11 min
类型
状态
日期
链接
摘要
标签
分类
图标
密码
Property
Mar 30, 2023 10:54 AM

Nginx

1.nginx的基本概念

(1)nginx是什么?能做什么事情?

  • 是什么?
Nginx (engine x) 是一个高性能HTTP反向代理web服务器,其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,它专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率,能经受高负载的考研,有报告表明能支持高达50000个并发连接数。
  • 能做什么?
    • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
    • 无缓存的反向代理加速,简单的负载均衡和容错.
    • FastCGI,简单的负载均衡和容错.
    • 模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
    • 支持SSL 和 TLSSNI.

(2)反向代理

Nginx不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet,想象成一个巨大的资源库,则局域网中的客户端要访问Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
notion image
反向代理:反向代理,其实客户端对代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址。
notion image

(3)负载均衡

对于处理并发请求较多的情况下,单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
notion image

(4)动静分离

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

2.nginx安装和常用命令以及配置文件

(1)在linux系统中安装nginx

  • 使用远程连接工具连接Linux操作系统
    • ifconfig查询Linux系统IP地址
      • notion image
    • 在xshell中创建会话进行连接
      • notion image
  • 安装nginx所需的素材(依赖)
    • 安装pcre依赖
      • yum install -y pcre pcre-devel
    • 安装openssl、安装zlib等依赖
      • yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
  • 安装nginx
    • 把nginx安装文件压缩包放到Linux系统中
    • 解压压缩文件
    • 进入解压后目录,执行命令./configure
    • ```shell make && make install
    • - 安装完成后,usr文件夹下会多出来一个文件夹local/nginx,在nginx里sbin里有启动脚本 ![image-20220326121728686](https://fastly.jsdelivr.net/gh/zealerg/MyGraphicBed/img/202203261217758.png) <center>启动完成</center> - 虽说启动完成,但是我本地浏览器访问不了nginx界面,原因是没有开放80端口,执行以下语句将80端口放开并重启 - ```shell firewall-cmd --add-port=80/tcp --permanent firewall-cmd --reload
      执行完后就可以访问到了
    • 起初使用centos6进行操作时,遇到了很多问题,在这一步的时候没有防火墙,在网上找了一堆解决办法也没有解决,后面直接remark重新开始,搞了centos7,就没有遇到上面这个问题(),畅通无阻
      • 可能是版本的问题

(2)nginx操作的常用命令

{% note info::
使用nginx操作命令前提条件,必须进入nginx的目录/usr/local/nginx/sbin
%}
  1. 查看nginx的版本号
    1. ./nginx -v
      notion image
  1. 启动nginx
    1. ./nginx
      notion image
      image-20220326165238893
  1. 关闭nginx
    1. ./nginx -s stop
      notion image
      image-20220326165035592
  1. 重新加载nginx
./nginx -s reload
notion image

(3)nginx配置文件

  1. nginx配置文件位置
    1. /usr/local/nginx/conf/nginx.conf
      notion image
  1. nginx配置文件组成
    1. nginx配置文件有三部分组成:
    2. 第一部分 全局块
      1. 从配置文件开始到events 块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令,主要包括配置运行 Nginx服务器的用户(组)、允许生成的worker process 数,进程PID存放路径、日志存放路径和类型以及配置文件的引入等。
        比如 worker_processes 1;
        这是 Nginx服务器并发处理服务的关键配置,worker processes值越大,可以支持的并发处理量也越多但是会受到硬件、软件等设备的制约。
    3. 第二部分 events块
      1. events块涉及的指令主要影响Nginx服务器与用户的网络连接,常用的设置包括是否开启对多work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个work process可以同时支持的最大连接数等。
        比如 worker_connections 1024;
        上述例子就表示每个 work process 支持的最大连接数为1024.
        这部分的配置对Nginx的性能影响较大,在实际中应该灵活配置。
    4. 第三部分 http块
      1. 这算是Nginx服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是:http块也可以包括http全局块server 块
        • http全局块
          • http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
        • server块
          • 这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。 每个http 块可以包括多个server 块,而每个server 块就相当于一个虚拟主机。
            而每个server 块也分为全局server 块,以及可以同时包含多个 location块。
          • 全局server块
            • 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
          • location块
            • 一个server块可以配置多个location 块。 这块的主要作用是基于Nginx服务器接收到的请求字符串(例如server_name/uri-string ),对虚以主机名称(也可以是IP别名)之外的字符串(例如前面的/uri-string )进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

3.nginx配置实例—反向代理

反向代理实例1

  1. 实现效果
      • 打开浏览器,在浏览器地址栏输入地址:www.123.com,跳转到linux系统tomcat主页面中。
  1. 准备工作
      • 在Linux系统中安装tomcat,使用默认端口8080
        • tomcat压缩包放到Linux系统中,解压
        • 进入tomcat的bin目录中,./starup.sh启动tomcat服务器
      • 对外开放访问的端口并重新加载防火墙
        • firewall-cmd --add-port=8080/tcp --permanent firewall-cmd --reload
      • 在Windows系统中通过浏览器访问tomcat服务器
        • notion image
  1. 访问过程的分析
    1. notion image
  1. 具体配置
      • 第一步 在Windows系统的host文件进行域名和ip对应关系的配置
        • notion image
          添加内容到hosts文件中
          ip地址 域名
          notion image
      • 第二步 在nginx进行请求转发的配置(反向代理配置)
        • notion image
  1. 最终测试
    1. notion image

反向代理实例2

  1. 实现效果
    1. 使用nginx反向代理,根据访问的路径跳转到不同端口的服务中. nginx.监听端口为9001,. 访问http://192.168.136.130:9001/edu/直接跳转到127.0.0.1:8080
      访问http://192.168.136.130:9001/vod/直接跳转到127.0.0.1:8081
  1. 准备工作
      • 准备两个tomcat服务器,一个8080端口,一个80801端口
      • 创建文件夹和测试页面
  1. 具体配置
      • 找到nginx配置文件,进行反向代理配置
        • notion image
      • 开放对外访问的端口号 9001 8080 8081
  1. 最终测试
    1. notion image
      notion image
  1. location指令说明
      • =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
      • ~:用于表示uri包含正则表达式,并且区分大小写。
      • ~*:用于表示 uri包含正则表达式,并且不区分大小写。
      • ^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的 location后,立即使用此 location 处理请求,而不再使用location块中的正则uri I和请求字符串做匹配。
      • 注意:如果uri包含正则表达式,则必须要有~或者~*标识。·

4.nginx配置示例—负载均衡

  1. 实现效果
      • 浏览器地址栏输入地址 http://192.168.136.130/edu/edu.html,负载均衡效果,平均分担到8080和8081端口中去
  1. 准备工作
  • 准备两台tomcat服务器,一台8080,一台8081
  • 在两台tomcat里面webapps目录中,创建名称是edu文件夹,在edu文件夹中创建页面a.html,用于测试
  1. 在nginx的配置文件中进行负载均衡的配置
    1. notion image
      notion image
  1. 随着互联网信息的爆炸性增长,负载均衡(load balance)已经不再是一个很陌生的话题,顾名思义,负载均衡即是将负载分摊到不同的服务单元,既保证服务的可用性,又保证响应足够快,给用户很好的体验。快速增长的访问量和数据流量催生了各式各样的负载均衡产品,很多专业的负载均衡硬件提供了很好的功能,但却价格不菲,这使得负载均衡软件大受欢迎,nginx,就是其中的一个,在linux.下有Nginx、LVS、Haproxy,等等服务可以提供负载均衡服务,而且 Nginx,提供了几种分配方式(策略):
      • 轮询(默认)
        • 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
      • weight
        • weight代表权重,默认为1,权重越高被分配的客户端越多指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
          例如:
          notion image
      • ip_hash
        • 每个请求按访问io.的 hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session 的问题。 例如:
          notion image
      • fair(第三方)
        • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
          notion image

5.nginx配置示例—动静分离

  1. 什么是动静分离
    1. Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用NMginw.处理静态页面,Tomcat处理动态页面。动静分离从目前实现角度来讲大致分为两种,一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。 通过location 指定不同的后缀名实现不同的请求转发。通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
      notion image
  1. 准备工作
  • 在Linux系统中准备静态资源,用于进行访问
    • notion image
  1. 具体配置
      • 在nginx配置文件中进行配置
        • notion image
  1. 最终测试
  • 在浏览器地址栏输入地址
    • http://192.168.136.131/image/01.png
    • 因为配置文件 autoindex on 即列出你当前文件夹中的内容
    • notion image
      notion image
  • 在浏览器地址栏输入地址
    • http://192.168.136.131/www/a.html
      notion image

6.nginx配置高可用集群—保证高并发

  1. 什么是nginx高可用
    1. notion image
      • 需要两台nginx服务器
      • 需要keepalived
      • 需要虚拟id
  1. 配置高可用的准备工作
  • 需要两台服务器 192.168.136.131和192.168.136.132
  • 在两台服务器安装nginx
  1. 在两台服务器上安装keepalived
      • 使用yum命令进行安装
        • yum install keepalived -y
      • 安装之后,在etc里面生成目录keepalived,有文件keepalived.conf
  1. 完成高可用配置(主从配置)
      • 修改/etc/keepalived/keepalived.conf配置文件
        • ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover@firewall.loc sysadmin@firewall.loc } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 192.168.200.1 smtp_connect_timeout 30 router_id LVS_DEVEL vrrp_skip_check_adv_addr vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 } vrrp_script chk_http_port { script "/usr/local/src/nginx_check.sh" interval 2 weight 2 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.136.50 } } virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
      • 在/usr/local/src添加检测脚本nginx_check.sh
        • #!/ bin/ bash A=`ps -C nginx -no-header |wc -l` if[ $A -eq o ] ; then /usr/local/nginx/sbin/nginx sleep 2 if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then killall keepalived fi fi
      • 把两台服务器上的nginx和keepalived启动
        • 启动nginx:./nginx
          启动keepalived:systemctl start keepalived.service
      • 最终测试
        • 在浏览器地址栏中输入 虚拟ip地址 192.168.136.50
          • notion image
            notion image
        • 把主服务器(192.168.136.131)nginx和keepalived停止,在浏览器地址栏再次输入虚拟ip地址
          • notion image
            notion image
            notion image

7.Nginx的原理

notion image
  1. master和worker
    1. notion image
  1. worker是如何工作的
notion image
  1. 一个master和多个worker有哪些好处
    1. 首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有 bug了,异常退出,会导致当前worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。v
      • 执行nginx -s reload热部署时,已有任务的worker不会进行重新加载,而是等到它任务完成后才进行重新加载,这样利于nginx进行热部署,不会影响到原有的服务进程。
      • 对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。
      • 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。
      • 如果worker进程的异常退出,肯定是程序有 bug了,异常退出,会导致当前worker 上的所有请求失败,不过不会影响到nginx上的所有请求,所以降低了风险。
  1. 设置多少个worker合适
    1. Nginx同redis,类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主进程,通过异步非阻塞的方式来处理请求,即使是成千上万个请求也不在话下,每个worker的线程可以把一个cpu的性能发挥到极致。所以worker数和服务器的cpu数相等是最为适宜的。设少了会浪费cpu,设多了会造成cpu频繁切换带来损耗。
  1. 连接数 worker_connection
    1. 第一个:发送请求,占用了worker的几个连接数?
      答案:2 或者 4个(与客户端交互往返或者与客户端交互往返+与tomcat交互往返)
      第二个:nginx有一个master,有四个worker,每个worker支持最大的最大连接数1024,支持的最大并发数是多少?
      答案:4*1024/2或者4*1024/4
      普通的静态访问最大并发数是:worker_connections*workerprocesses/2, 而如果是HTTP作为反向代理来说,最大并发数量应该worker.connection*worker_processes/4。
  • 工具
  • 笔记
  • Java反射机制Java对接腾讯云IM
    Loading...
    Light Mode