Nginx 笔记

Nginx 是一款高性能的 HTTP 和 反向代理服务器,并发能力强。

  1. 反向代理
    ​正向代理是什么?
    ​在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问。
    ​反向代理,客户端对代理是无感知的,客户端不需要做任何配置,只需要将请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就算一个服务器,暴露的是代理服务器地址,隐藏了真实服务器的地址。

  2. 负载均衡
    ​单服务器解决不了,增加服务器数量,将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,多个服务器进行共同分担请求,就是将负载分发到不同服务器,这种方法叫负载均衡。

  3. 动静分离
    为了加快网站的解析速度,可以将动态资源 与 静态资源由不同的服务器来解析,加快解析速度,降低服务器压力。Nginx 的动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat处理动态页面。

    ​动静分离从目前实现角度来讲大致分为两种:

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

​通过设计来减少系统不能提供服务的时间。

将 Nginx 安装到 Linux 上

  1. 通过压缩包解压后安装 pcre

    • 先解压 pcre 的压缩包,然后进入解压后的文件目录,调用 ./configura 命令进行编译检查
    • 若以上命令没有报错则可以继续执行 make && make install 进行安装
  2. 通过 yum 下载安装 openssl、zlib

    1
    yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel
  3. 最后安装 Nginx,通过压缩包解压后安装或 yum 均可,方法同上

    • 安装完成后,在 /usr/local/nginx/sbin 下,有 Nginx 的可执行文件,执行此文件开启 Nginx 服务

    • 开启服务后,在 /usr/local/nginx/conf 目录下,有配置文件 nginx.conf,其中包含了 nginx 各种基本配置信息(例如默认端口 80)

    • 若想在 Windows 访问到 Linux 需要将 Linux 的防火墙关闭,或者设置开放的端口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 查看开放的端口号
      firewall-cmd --list-all

      # 设置开放的端口号
      firewall-cmd --add-service=http -permanent
      sudo firewall-cmd --add-port=80/tcp --permanent

      # 重启防火墙
      firewall-cmd -reload

PS:或者可以选择一次性安装四个依赖 gcc、pcre、zlib、openssl

1
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

Nginx 操作的常用命令

  1. 使用 nginx 操作命令需要进入 nginx 的 sbin 目录(若将此目录加入到环境变量中,则可以直接调用命令)
  2. ./nginx 启动 nginx 服务器
  3. ./nginx -v 可以获取 nginx 当前版本
  4. ./nginx -s stop 停止 nginx 服务器
  5. ./nginx -s reload 重新加载 nginx

Nginx 的配置文件

  1. 配置文件路径:/usr/local/nginx/conf/nginx.conf ,打开配置文件,可以看到文件主要分为三块:全局块、events 块、http 块

    • 全局块:从配置文件开始,到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker-process 数、进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

      • 例如:配置文件中worker_processes 1; 表示 Nginx 服务器并发处理服务的关键配置,该值越大,可以支持的并发处理也就越多,但是会受到硬件、软件等设备的制约
    • events 块:位于 events 括号中的配置内容,主要影响 Nginx 服务器与用户的网络连接,常用设置包括是否开启对多 work process 下的网络进行序列号、是否允许同时收到多个网络连接、选取哪种事件驱动模型来处理连接请求、每个 word process 可同时支持的最大的连接数(worker_connections)等。该部分的配置对 Nginx 性能影响较大,在实际应用中需要灵活配置。

    • http 块:位于 http 块大括号中的配置内容,这算是 Nginx 服务器配置中最频繁的部分,代理、缓存的日志定义等绝大多数功能和第三方模块的配置都在这里,需要注意的是:http 块也可以包括 http全局块、server 块。

      • http 全局块:

        • 位于 http 块中,server 块 括号外,此配置块主要配置的指令包括文件引入、MIME-TYPE 定义、日志定义、连接超时时间、单链接请求上限等。
      • server 块:

        • 位于 http 块中,server 块 括号内,此配置块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机完全一样的,该技术产生是为了节省互联网服务器硬件成本。

        • 每个 http 块中,可以包含多个 server 块,而每个 server 块也就相当于一个虚拟主机

        • 每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块

Nginx 的配置实例

  1. Nginx 配置实例 - 反向代理

    实例1

    1. 实现效果:打开浏览器,在浏览器地址栏输入 www.UangSC666.com,跳转到 Linux 系统的 Tomcat 主页

    2. 准备工作:

      • 在 Linux 中安装 Tomcat,使用默认端口 8080

        • 解压安装后,进入 Tomcat 安装目录的 bin 目录中,执行 ./startup.sh 来启动 Tomcat 服务器

        • 如果使用 Windows 想访问到 Linux 虚拟机,记得将防火墙关闭,或者将 8080 端口对外开放

          1
          2
          firewall-cmd --add-port=8080/tcp --permanent
          firewall-cmd -reload
      • 将本地 hosts 文件中添加上域名映射(192.168.40.100 www.UangSC666.com)

    3. 将 nginx 中的配置文件两处进行更改

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      server {
      listen 80;
      # 第一处修改为 Linux 的 IP 地址
      server_name 192.168.40.100;

      location / {
      root html;
      # 第二处,在此处添加 proxy_pass 对应地址为原服务地址
      proxy_pass http://localhost:8080;
      index index.html index.htm;
      }
      ......
      }

    实例2

    1. 实现效果:使用 Nginx 的方向代理,根据访问路径跳转到不同的端口的服务中
     
    监听 9001 端口,当浏览器访问 `http://192.168.40.100:9001/edu/` 直接跳转到 `127.0.0.1:8080`,访问路径为  `http://192.168.40.100:9001/vod/` 跳转到 `127.0.0.1:8081`
     
    2. 准备工作
     
        1. 准备创建两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
        2. 创建文件夹和测试页面
     
    3. 具体配置
     
        1. 找到 nginx 配置文件,添加 server 块
     
        
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    server {
    listen 9001;
    server_name 192.168.40.100;

    # 当访问路径下包含 /demo1/ 时,请求此处
    location ~ /demo1/ {
    proxy_pass http://localhost:8080;
    }

    # 当访问路径下包含 /demo2/ 时,请求此处
    location ~ /demo2/ {
    proxy_pass http://localhost:8081;
    }
    }
    2. Windows 访问同样需要记得关闭防火墙或者将端口开放
  2. Nginx 配置实例 - 负载均衡

    实例

    1. 实现效果

      浏览器地址栏输入地址 http://192.168.40.100/demo1/a.html,平均分发到 8080 和 8081 端口中去

    2. 准备两台 Tomcat 服务器,端口分别为 8080 和 8081,在 webapps 部署 demo/a.html 网页文件

    3. 去 Nginx 配置文件中进行具体配置

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      # 在 http 块中添加以下代码
      upstream myserver{
      # ip_hash; # 开启 ip_hash 策略
      # fair; # 开启 fair 策略
      server 192.168.40.100:8080 weight=1; # weight 设置权重
      server 192.168.40.100:8081 weight=1;
      }

      server {
      ...

      listen 80;
      server_name 192.168.40.100;


      location / {
      root html;
      proxy_pass http://myserver;
      index index.html index.htm;
      }
      ...
      }
      • Nginx 分配服务器策略

        • 轮询策略(默认)

          每个请求按照时间顺序逐一分配到不同服务器,如果后端服务器宕机,能够自动剔除

        • weight 权重策略

          weight 表示权重,默认值为 1,权重越高也就越容易分配到该服务器,该值与访问比率成正比,用于后端服务器性能不均的情况

        • ip_hash 策略

          每个请求按照访问的 ip 哈希值结果进行分配,这样每个访客访问的就是固定的后端服务器,可以解决 session 问题

        • fair (第三方)

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

  3. Nginx 配置实例 - 动静分离

    实例

    1. 准备工作:在 Linux 中准备一些静态资源,用于测试访问

    2. 具体配置,在 Nginx 配置文件中进行以下配置:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      server {
      listen 80;
      server_name 192.168.40.100;


      location /www/ {
      root /data/;
      index index.html index.htm;
      }

      location /image/ {
      root /data/;
      autoindex on;
      }
      ......
      }
  4. Nginx 配置实例 - 高可用

    实例

    1. 准备工作

      • 配置两台 Nginx 服务器
      • 在两台服务器安装 Keepalived
    2. 具体配置

      1. 修改 Keepalived 配置文件内容(配置文件路径 /etc/keepalived/keepalived.conf)

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        global_defs {
        script_user root
        enable_script_security
        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_script chk_http_port {
        script "/usr/local/src/nginx_check.sh"
        interval 2 # 检测脚本执行的间隔
        weight 2
        }

        vrrp_instance VI_1 {
        state BACKUP // BACKUP 备份服务器 MASTER 主服务器
        interface ens33 // 网卡
        virtual_router_id 51
        priority 90 // 主、备机取不同优先级,主机优先级较大、备份机优先级较小
        advert_int 1
        authentication {
        auth_type PASS
        auth_pass 1111
        }
        virtual_ipaddress {
        192.168.50.100 //VRRP 虚拟地址
        }
        }
      2. 编写检测脚本 nginx_check.sh,存放于 Keepalived 配置文件中配置的文件地址

        1
        2
        3
        4
        5
        6
        7
        8
        9
        #!/bin/bash
        A=`ps -C nginx --no-header |wc -l`
        if [ $A -eq 0]; then
        /usr/local/nginx/sbin/nginx
        sleep 2
        if [ `ps -C nginx --no-header |wc -l` -eq 0]; then
        systemctl stop keepalived
        fi
        fi
    3. 将两台服务器的 Nginx 和 Keepalived 都启动

      1
      2
      3
      4
      # 启动 Nginx:Nginx 安装目录下的 sbin 文件夹下执行
      ./nginx
      # 启动 Keepalived
      systemctl start keepalived.service
    4. 最终测试

      1、在浏览器地址栏输入虚拟 IP 地址,进行访问

      2、访问成功后将 Keepalived 服务 和 主服务器 Nginx 一起停止服务,模仿现实宕机情况

      3、若主服务器宕机后,输入虚拟 IP 仍能进行访问,则就提高了服务提供时间,也就是成功实现高可用