课件: nginx课件v1.0.pdf nginx课堂笔记.pdf

一、Nginx简介

  • Nginx是什么,做什么事情
  • 反向代理
  • 负载均衡
  • 动静分离

    1.1 Nginx概述

    Nginx (“engine x”) 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类型的网页服务器中表现较好。

    1.2 Nginx 作为 web 服务器

    Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 perl、php等。但是不支持 java。Java 程序只能通过与 tomcat 配合完成。Nginx 专为性能优化而开发,性能是其最重要的考量,实现上非常注重效率 ,能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数。

    1.3 正向代理

    如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
    在客户端(浏览器)配置地啊你服务器,通过代理服务器进行互联网访问。
    image.png

    1.4 反向代理

    反向代理中,客户端对代理无感知(客户端不知道进行了代理),因为客户端不需要进行任何配置就可以访问,我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
    通俗的来讲,反向代理服务器就类似于中介,请求尽管发给中介,然后中介给你反馈,至于中介是如何进行工作的,客户端不需要知道。
    image.png

    1.5 负载均衡

    客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕后,再将结果返回给客户端。这种模式在高并发情况下,服务器会崩溃。
    因此通过增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
    image.png

    1.6 动静分离

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

    二、Nginx的安装 Linux

    2.1 进入Nginx官网,下载

    官网:http://nginx.org/

    2.2 安装Nginx

    先查看是否安装了gcc gcc -v
    如果没有安装 执行 yum -y install gcc gcc-c++
    在安装Nginx之前需要的依赖:pcre、openssl、zlib
    通过yum直接安装以上即可,执行以下命令
    1. yum -y install pcre pcre-devel openssl openssl-devel zlib zlib-devel
    我把Nginx的压缩包放在了 /user/local/moudle 下
    cd到 /user/local/moudle
    解压下载的Nginx压缩包 tar -zxvf nginx-1.20.1.tar.gz
    cd到 nginx-1.20.1目录下
    然后分别执行以下命令
    1. ./configure
    2. make && make install
    然后Nginx就安装在了 /user/local/nginx 目录下
    image.png

2.3 nginx 常用的命令和配置文件

2.3.1 nginx 常用的命令:

nginx目录下的sbin文件夹中有nginx的启动脚本
image.png
启动命令:在/user/local/nginx/sbin目录下执行 ./nginx
关闭命令:在/usr/local/nginx/sbin 目录下执行 ./nginx -s stop
重新加载命令:在/usr/local/nginx/sbin 目录下执行 ./nginx -s reload
查看nginx版本号: ./nginx -v

nginx端口是80,启动nginx后,直接在浏览器输入虚拟机的ip访问
image.png
踩坑:
防火墙开启情况下,远程无法访问。可以关闭防火墙或者设置开放端口号

  • 关闭防火墙: systemctl stop firewalld

查看开放的端口号 firewall-cmd --list-all
设置开放的端口号80
firewall-cmd --add-service=http --permanent
sudo firewall-cmd --add-port=80/tcp --permanent
重启防火墙 firewall-cmd --reload
我之前使用了zookeeper,所以直接关闭了防火墙。

2.3.2 nginx.conf 配置文件

配置文档
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
image.png

通过编辑 nginx/conf 目录下的nginx.conf 文件可以设定访问端口号(默认80),可以根据自己的需要来进行配置
image.png
删除掉所有注释部分,精简内容如下:

  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. server {
  11. listen 80;
  12. server_name localhost;
  13. location / {
  14. root html;
  15. index index.html index.htm;
  16. }
  17. error_page 500 502 503 504 /50x.html;
  18. location = /50x.html {
  19. root html;
  20. }
  21. }
  22. }

根据上述文件,我们可以很明显的将 nginx.conf 配置文件分为三部分:

(1) 全局块:

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如第一行配置的worker_processes 1;这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约。
nginx这种显然是CPU密集型的 合理的工作线程数是CPU核数或CPU核数+1 两倍的是IO密集型的任务

(2) events 块 :

  1. events {
  2. worker_connections 1024;
  3. }

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 worker process 可以同时支持的最大连接数等。
默认1024就表示每个work process支持的最大连接数为1024。
这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

(3) http 块 :

  1. http {
  2. include mime.types;
  3. default_type application/octet-stream;
  4. sendfile on;
  5. keepalive_timeout 65;
  6. server {
  7. listen 80;
  8. server_name localhost; # 注意此处不是主机名称,而是服务名称。nginx允许多个Server服务在一个nginx实例中。并允许Server有一个或多个名称,同时支持通配符等。具体参见Docs
  9. location / {
  10. root html;
  11. index index.html index.htm;
  12. }
  13. error_page 500 502 503 504 /50x.html;
  14. location = /50x.html {
  15. root html;
  16. }
  17. }
  18. }
  1. 这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。需要注意的是:http 块也可以包括 http 全局块、server 块。
  • http全局块:

http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。

  • server块:

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

  1. 全局server块

    最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。

  2. location块

    一个 server 块可以配置多个 location 块。
    image.png

    三、nginx 配置实例-反向代理

    3.1 前置准备——tomcat安装

    使用nginx反向代理,访问www.123.com 直接跳转到localhost:8080,再此之前需要在Linux上装tomcat。

  • tomcat安装文件放到Linux系统中,解压
  • 进入tomcat的bin目录,./startup.sh 启动tomcat服务器

log文件夹下执行tail -f catalina.out 可以查看日志
同样,这里需要在防火墙添加远程访问窗口(我直接把防火墙关闭了,所以不需要设置)

firewall-cmd —add-port=8080/tcp —permanent firewall-cmd –reload

通过windows的浏览器访问tomcat的主页,访问成功
image.png

3.2 配置反向代理实例(一)

3.2.1 访问过程分析:

image.png

3.2.2 具体操作

(1) 修改windows的hosts文件

修改windows端host文件,使www.123.com跟虚拟机上的Ip映射起来
image.png
image.png
前面的IP地址是我自己虚拟机的IP

(2) 在nginx进行请求转发的配置(反向代理配置)

image.png
修改完成后保存,重启nginx。

3.2.3 测试

访问www.123.com
image.png
测试成功!

3.3 配置反向代理实例(二)

实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中。
nginx 监听端口为 9001,
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8080
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8081

3.3.1 准备工作

准备两个tomcat服务器,一个8080端口,一个8081端口

在/usr/local 下新建一个tomcat8081,加tomcat解压到8081中。
进入tomcat8081的conf文件夹
image.png
image.png
保存后启动tomcat8081。然后再启动8080
image.pngimage.png
现在就有两个tomcat了。

创建文件夹和测试页面

在8080的tomcat /usr/local/apache-tomcat-8.5.72/webapps 下创建/edu文件夹
在里面创建一个a.html文件 touch a.html
写入

8080!!


image.png
同样,在8081的tomcat /webapps 下创建/vod文件夹 将a.html 复制过来 里面改成8081
image.png

3.3.2 nginx.conf 反向代理配置

/usr/local/nginx/conf 下nginx.conf 文件
之前我们配置了一个server
image.png
现在我们需要新加上一个server
image.png
~后面的/edu/跟 /vod/是正则表达式
image.png
同样需要开放9001端口号对外访问(关闭了防火墙就略过)

firewall-cmd —add-port=9001/tcp —permanent firewall-cmd —add-port=8081/tcp —permanent firewall-cmd –reload

重启nginx。

3.3.3 测试

image.png
image.png

四、 nginx 配置实例-负载均衡

浏览器访问http://www.123.com:9001/edu/a.html,实现负载均衡,将请求平均分摊到8080和8081上

4.1 准备工作

需要准备两台tomcat服务器,一台8080,一台8081,之前已经配置过了。
在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建
页面 a.html,用于测试。
image.png

4.2 在 nginx 的配置文件中进行负载均衡的配置

在/usr/local/nginx/conf 目录下将nginx.conf配置文件复制为nginx_lb.conf配置文件,用来作为负载均衡的配置文件。
对负载均衡的配置进行修改,在http块中加上如下配置:

  1. http {
  2. ......
  3. # 负载均衡集群配置 命名为myserver
  4. upstream myserver {
  5. server 192.168.190.131:8080;
  6. server 192.168.190.131:8081;
  7. }
  8. ......
  9. server {
  10. location / {
  11. ......
  12. proxy_pass http://myserver; # 代理到我们创建的负载均衡集群上
  13. ......
  14. }
  15. }

image.png
cd 到nginx的sbin文件下
执行

./nginx -t -c /usr/local/nginx/conf/nginx_lb.conf

测试我们刚才编辑的配置文件有没有错误。
image.png
指定nginx以nginx_lb.conf配置启动

./nginx -c /usr/local/nginx/conf/nginx_lb.conf

测试,实现了负载均衡。

4.3 nginx提供了几种不同的负载均衡策略

4.3.1 轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。

4.3.2 weight

weight 代表权,重默认为 1,权重越高被分配的客户端越多;指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。

  1. upstream server_pool{
  2. server 192.168.5.21 weight=10;
  3. server 192.168.5.22 weight=10;
  4. }

4.3.3 ip_hash

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

  1. upstream server_pool{
  2. ip_hash;
  3. server 192.168.5.21:80;
  4. server 192.168.5.22:80;
  5. }

4.3.4 fair

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

  1. upstream server_pool{
  2. server 192.168.5.21:80;
  3. server 192.168.5.22:80;
  4. fair;
  5. }

五、nginx 配置实例-动静分离

5.1 动静分离的概念

Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求(通过tomcat查询数据库)静态请求(访问html文件)分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。
动静分离从目前实现角度来讲大致分为两种:

  • 一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
  • 另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。

image.png
通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200。

5.2 准备工作

在Linux系统中准备一些静态资源,用于访问。在根目录下创建data文件夹,data文件夹下创建两个文件夹image和page分别存放图片和网页
image.pngimage.png

5.3 具体配置

复制一份nginx.conf,重命名为nginx_ds.conf作为动静分离的配置文件。
修改配置文件
image.png
然后指定以nginx_ds.conf配置文件重启nginx

./nginx -c /usr/local/nginx/conf/nginx_ds.conf

5.4 测试

浏览器访问http://192.168.190.131/image/01.jpg http://192.168.190.131/page/a.html
image.png
image.png
我们访问http://192.168.190.131/image/ 可以看到把image文件夹下的文件列出来了
image.png
因为配置文件配置了 autoindex on 这个的意思就是列出当前文件夹中的内容,page文件夹就不行。

六、keepalived+nginx配置高可用集群

目前的nginx存在单点故障问题,即nginx反向代理服务器一旦故障,那么整个服务就会停摆
image.png
那么就需要用到nginx的集群来实现高可用。
image.png

6.1 准备工作

需要两台虚拟机的环境,两台服务器均需要安装nginx与keepalived。我直接克隆了装好nginx的虚拟机。两台IP分别是192.168.190.134跟192.168.190.133

6.1.1 keepalived安装

安装依赖包
yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
我这里报错:
image.png
解决办法
需要rpm安装mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm。因为之前我装了mysql(压缩文件安装的格式),cd到mysql rpm安装文件的解压目录,执行:
rpm -ivh mysql-community-client-plugins-8.0.22-1.el7.x86_64.rpm
解决 libmysqlclient.so.18()(64bit) 报错: cd到 /user/local下,执行以下命令

  1. wget http://www.percona.com/redir/downloads/Percona-XtraDB-Cluster/5.5.37-25.10/RPM/rhel6/x86_64/Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm
  2. rpm -ivh Percona-XtraDB-Cluster-shared-55-5.5.37-25.10.756.el6.x86_64.rpm

然后依赖就可以成功安装了。
然后执行 yum install keepalived -y 安装keepalived
安装之后,在/etc里面生成目录keepalived,有配置文件在/etc/keepalived/keepalived.conf
rpm -qa keepalived 查看是否成功安装keepalived
rpm -ql keepalived 查看keepalived安装目录

6.2 高可用(主从)配置

(1)主机(MASTER) 192.168.190.134

修改/etc/keepalived/keepalivec.conf 配置文件

  1. ! Configuration File for keepalived
  2. global_defs { # 全局定义
  3. notification_email {
  4. acassen@firewall.loc
  5. failover@firewall.loc
  6. sysadmin@firewall.loc
  7. }
  8. notification_email_from Alexandre.Cassen@firewall.loc
  9. smtp_server 192.168.190.134 # 主机IP地址
  10. smtp_connect_timeout 30
  11. router_id LVS_DEVEL
  12. }
  13. vrrp_script chk_http_port {
  14. script "/usr/local/src/nginx_check.sh" # 检测脚本的路径
  15. interval 2 #(检测脚本执行的间隔)
  16. weight 2
  17. }
  18. # 配置虚拟IP
  19. vrrp_instance VI_1 {
  20. state MASTER # 备份服务器上将 MASTER 改为 BACKUP,这里将192.168.190.134设为主机
  21. interface ens33 # 网卡名称
  22. virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
  23. priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
  24. advert_int 1
  25. authentication {
  26. auth_type PASS
  27. auth_pass 1111
  28. }
  29. virtual_ipaddress {
  30. 192.168.190.50 #VRRP H 虚拟地址
  31. }
  32. }

在/user/local/src/ 下创建名为nginx_check.sh 的脚本,这里脚本的路径和名称一定要跟keepalived.conf配置文件里配置的对应,不能有差错。

  1. #!/bin/bash
  2. A=`ps -C nginx --no-header |wc -l`
  3. if [ $A -eq 0 ];then
  4. /usr/local/nginx/sbin/nginx
  5. sleep 2
  6. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  7. systemctl stop keepalived
  8. fi
  9. fi
  • killall keepalived在我的虚拟机里没法执行,我换成了systemctl stop keepalived
  • 记得给脚本文件赋执行权限,但是不能赋777,会提示安全问题,导致脚本无法执行,744和755可以
  • 使用tail -f /var/log/messages可以查看Keepalived的启动日志,根据报错查看问题

    (2)从机(BACKUP) 192.168.190.133

    修改/etc/keepalived/keepalivec.conf 配置文件 ```shell ! 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.190.134 # 主机IP地址,主机是131 smtp_connect_timeout 30 router_id LVS_DEVEL }

vrrp_script chk_http_port {

script “/usr/local/src/nginx_check.sh” # 检测脚本的路径 interval 2 #(检测脚本执行的间隔) weight 2 }

配置虚拟IP

vrrp_instance VI_1 {
state BACKUP # 备份服务器上将 MASTER 改为 BACKUP,这里将192.168.190.133设为从机 interface ens33 # 网卡名称 virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同 priority 90 # 主、备机取不同的优先级,主机值较大,备份机值较小 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.190.50 #VRRP H 虚拟地址 } }

  1. 后面的步骤跟主机一样。
  2. <a name="fowLA"></a>
  3. ### (3) 测试
  4. cdnginxsbin目录,分别启动主机跟从机上的nginxkeepalived
  5. > **./nginx [-c nginx_xxxx.conf] #有需要就指定配置启动**
  6. > **systemctl start keepalived.service**
  7. 访问192.168.190.50 <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636035411217-800da86b-6387-4c13-9b7c-c3d2312da97f.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=127&id=u96ad277e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=127&originWidth=378&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9784&status=done&style=none&taskId=u82c40126-9a89-46a3-9614-27ddbe03230&title=&width=378)<br />我们访问一下tomcat /edu/a.html文件 看看是哪个服务器的<br />[http://192.168.190.50:8080/edu/a.html](http://192.168.190.50:8080/edu/a.html) 当前访问的MASTER<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636078664108-f9eaa739-220c-440e-868a-42a99e08c0ba.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=122&id=ucb45485f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=122&originWidth=429&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13200&status=done&style=none&taskId=u9db43590-83b7-4d9e-92e9-3e643d4d61e&title=&width=429)
  8. 将主服务器(192.168.190.134)的nginxkeepalived停止,再访问192.168.190.50 <br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636075232840-9aec8564-e3b2-4c75-9611-953cc5f14bb3.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=131&id=u324e64dd&margin=%5Bobject%20Object%5D&name=image.png&originHeight=131&originWidth=397&originalType=binary&ratio=1&rotation=0&showTitle=false&size=9912&status=done&style=none&taskId=uaaf5e071-0a30-44e6-a755-fcee858115b&title=&width=397)<br />任然可以访问nginx。<br />我们访问一下tomcat /edu/a.html文件 看看是哪个服务器的<br />[http://192.168.190.50:8080/edu/a.html](http://192.168.190.50:8080/edu/a.html) 当前访问的BACKUP<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636078781036-5fdb498b-7480-4bea-b19f-5fde1179b1f1.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=115&id=ua19351a8&margin=%5Bobject%20Object%5D&name=image.png&originHeight=115&originWidth=424&originalType=binary&ratio=1&rotation=0&showTitle=false&size=13160&status=done&style=none&taskId=u6ae7ccba-b3a4-4795-92c2-7b1d4c41c1c&title=&width=424)
  9. 执行`ip a` 可以看到虚拟IP绑定<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636078946261-9a80398f-ade0-4dea-a1ba-d33affa62ec4.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=239&id=u28145121&margin=%5Bobject%20Object%5D&name=image.png&originHeight=239&originWidth=737&originalType=binary&ratio=1&rotation=0&showTitle=false&size=30013&status=done&style=none&taskId=u0c3d4a20-78c6-4e68-a8a3-5262a1f6252&title=&width=737)
  10. 再把主机的nginxkeepalived启动,发现现在依然是从机抢占。关闭掉从机的nginxkeepalived,现在切换回主机
  11. <a name="uJuRP"></a>
  12. ### (4) keepalived配置文件详解
  13. 配置文件有三部分
  14. - global_defs:全局配置
  15. - vrrp_script chk_http_port
  16. - vrrp_instance VI_1
  17. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636079721176-bc5f5ed4-74ac-4a03-bac6-62abe37da9b0.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=233&id=u66ddd6d2&margin=%5Bobject%20Object%5D&name=image.png&originHeight=233&originWidth=850&originalType=binary&ratio=1&rotation=0&showTitle=false&size=22560&status=done&style=none&taskId=ub61f23b2-8626-4b0b-a0ce-1b242f58958&title=&width=850)<br />/etc/hosts<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636080250593-b9d7fb24-194e-4195-8aa2-d615f573bc85.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=79&id=uae3ba098&margin=%5Bobject%20Object%5D&name=image.png&originHeight=79&originWidth=596&originalType=binary&ratio=1&rotation=0&showTitle=false&size=6304&status=done&style=none&taskId=u34cd493c-35c5-4720-8313-d230fa712c8&title=&width=596)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636080555244-338a7382-a74d-4bed-bea9-885bab9f3a0b.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=129&id=u2272f30f&margin=%5Bobject%20Object%5D&name=image.png&originHeight=129&originWidth=686&originalType=binary&ratio=1&rotation=0&showTitle=false&size=11015&status=done&style=none&taskId=uf825e3ee-76a6-46c5-9737-f2d67324c75&title=&width=686)<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636080564647-5b57d684-1e58-4721-b3d1-3c28d1429dbc.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=311&id=u87613cb4&margin=%5Bobject%20Object%5D&name=image.png&originHeight=311&originWidth=956&originalType=binary&ratio=1&rotation=0&showTitle=false&size=33446&status=done&style=none&taskId=u176cb422-5d5e-4c2e-b584-d7e3e22235b&title=&width=956)
  18. <a name="jZJlL"></a>
  19. ## 6.3 高可用(主主)配置
  20. <a name="EBgSh"></a>
  21. # 七、nginx原理
  22. <a name="ASj0y"></a>
  23. ## 7.1 master & worker
  24. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636081696234-3e46bc3a-bb60-494b-9320-9a4e515fd5a0.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=511&id=u28baaf8e&margin=%5Bobject%20Object%5D&name=image.png&originHeight=511&originWidth=827&originalType=binary&ratio=1&rotation=0&showTitle=false&size=80027&status=done&style=none&taskId=ud1aeefbd-71b6-4a37-be6a-f0c8c9912e1&title=&width=827)<br />nginx一旦启动,就会存在master&worker两个进程<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636081768641-5e615f50-37e8-4d10-8599-427bf9c5f4fa.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=68&id=ub9dc6ecb&margin=%5Bobject%20Object%5D&name=image.png&originHeight=68&originWidth=614&originalType=binary&ratio=1&rotation=0&showTitle=false&size=8910&status=done&style=none&taskId=u505e284d-1dd0-47db-b45a-4aa66a44d99&title=&width=614)<br />master进程不执行任务,其充当管理员的角色将任务分配给worker进程,这里只有一个worker是因为在nginx.conf文件中 配置了 worker_process=1 可以修改这个值,配置多个worker。
  25. <a name="WBJVi"></a>
  26. ## 7.2 worker是如何进行工作的
  27. 当客户端发送请求给nginx,首先master收到请求通知worker,然后worker通过**争抢机制**获得请求执行权,然后worker通过反向代理等访问目标tomcat服务器进行数据库查询等系列操作获得结果。<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/22423156/1636082130007-89b4cdaa-902a-4645-91c8-59ed7084326a.png#clientId=u8cb65c5e-558c-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=422&id=u4eca2291&name=image.png&originHeight=422&originWidth=883&originalType=binary&ratio=1&rotation=0&showTitle=false&size=96075&status=done&style=none&taskId=uca4ff76f-b903-4298-a175-444035241b9&title=&width=883)
  28. <a name="BKbT6"></a>
  29. ## 7.3 优点及worker数量的设定
  30. - 每个 worker 进程都是独立的进程,不需要加锁,所以省掉了锁带来的开销。
  31. - 采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的worker 进程。
  32. - 可以使用 nginx s reload 热部署,利用 nginx 进行热部署操作
  33. <a name="oI8fB"></a>
  34. ### 7.3.1 worker的数量应该如何设置?
  35. Nginx redis 类似都采用了 **io 多路复用机制**,每个 worker 都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求。所以 **worker 数和服务器的 cpu总核心数相等是最为适宜的**。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
  36. ```shell
  37. grep processor /proc/cpuinfo | wc -l # 查看cpu总核心数量
  38. grep 'physical id' /proc/cpuinfo|sort|uniq | wc -l #查看cpu个数

image.png

7.3.2 连接数 worker_connection

  1. 发送请求,占用了 woker 的几个连接数?

2或4个。
两个的情况是访问静态资源,两个连接分别是客户端到worker的请求,以及worker给客户端的响应。占用的连接数就是两个
image.png
4个的情况是,访问动态资源,worker需要额外的与tomcat建立请求跟响应两个连接,加上与客户端的请求&响应的连接共计4个。
image.png

  1. nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的

最大并发数是多少?
一个nginx能建立的最大连接数 = worker_connections * worker_processes = 4 * 1024 = 4096个;

  • 对于http请求本地资源来说,能够支持的最大并发数量是worker_connections * worker_processes 4096
  • 如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2 2048
  • 如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections * worker_processes/4 1024