Nginx

Nginx

概述

概述

  • Nginx是高性能的HTTP和反向代理的服务器,处理高并发能力十分强大,能经受高负载的考验

正向代理

  • 为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标,然后代理向原始服务器转交请求并将获得的内容返回给客户端

反向代理

  • 对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源

负载均衡

  • 将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器

动静分离

  • 动态请求跟静态请求分开,使用Nginx处理静态页面,Tomcat处理动态页面,大致分为两种
    • 把静态文件独立成单独的域名,放在独立的服务器上(主流使用)
    • 动态跟静态文件混合在一起发布,通过nginx来分开

配置命令

常用命令

  • 进入nginx目录:cd /usr/local/nginx/sbin
  • 查看nginx版本号:./nginx -v
  • 启动nginx:./nginx
  • 停止nginx:./nginx -s stop
  • 重新加载nginx:./nginx -s reload

配置文件

  • 位置:/usr/local/nginx/conf/nginx.conf
  • 内容
    • 全局块:配置服务器整体运行的配置指令
      • 比如worker_processes 1:处理并发数的配置
    • events块:影响Nginx服务器与用户的网络连接
      • 比如worker_connections 1024:支持的最大连接数为1024
    • http块:配置最频繁的部分
      • http全局块:文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
      • server块
        • 全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
        • location块:基于服务器接收到的请求字符串,对虚拟主机名称/IP别名之外的字符串进行匹配,对特定的请求进行处理

location指令

  • =:用于不含正则表达式的uri前,要求请求字符串与uri严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求
  • ~:用于表示uri包含正则表达式,并且区分大小写
  • ~*:用于表示uri包含正则表达式,并且不区分大小写
  • ^~:用于不含正则表达式的uri前,要求Nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求,而不再使用location块中的正则uri和请求字符串做匹配
  • 注意:如果uri包含正则表达式,则必须要有~或者~*标识

反向代理

实例1

  • nginx:localhost:80
  • tomcat:localhost:8081
  • 通过反向代理,实现访问localhost:80转到localhost:8081
1
2
3
4
5
6
7
8
9
10
server {
listen 80;
server_name localhost;

location / {
root html;
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}

实例2

  • 使用nginx反向代理,根据访问的路径跳转到不同端口的服务中
  • 访问localhost/edu/直接跳转到localhost:8080
  • 访问localhost/vod/直接跳转到localhost:8081
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Docker
# TomcatTest8080 172.17.0.3
# TomcatTest8081 172.17.0.4

server {
listen 80;
server_name localhost;

location ~ /edu/ {
proxy_pass http://172.17.0.3:8080;
}

location ~ /vod/ {
# 172.17.0.4 主机映射8081,若改成http://172.17.0.4:8081则502
proxy_pass http://172.17.0.4:8080;
}
}

负载均衡

nginx分配服务器策略

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除

  • weight:默认为1,权重越高被分配的客户端越多

    1
    2
    3
    4
    upstream myserver {
    server 172.17.0.3:8080 weight=5;
    server 172.17.0.4:8080 weight=10;
    }
  • ip_hash:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享问题

    1
    2
    3
    4
    5
    upstream myserver {
    ip_hash;
    server 172.17.0.3:8080;
    server 172.17.0.4:8080;
    }
  • fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配

    1
    2
    3
    4
    5
    upstream myserver {
    fair;
    server 172.17.0.3:8080;
    server 172.17.0.4:8080;
    }

实例

  • 浏览器地址栏输入地址localhost/edu/,负载均衡效果,平均8080和 8081端口中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    http {
    ……
    # 负载均衡服务器列表
    upstream myserver {
    server 172.17.0.3:8080;
    server 172.17.0.4:8080;
    }

    server {
    listen 80;
    server_name localhost;

    location / {
    # 需要设置为负载均衡服务名
    proxy_pass http://myserver;
    }
    }
    ……
    }

动静分离

效果

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

案例

  • 8081存放静态资源在/data/images和/data/www目录中

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

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

    location /images/ {
    root /data/;
    # 列出访问目录
    autoindex on;
    }
    }

高可用集群

1
2
3
4
5
6
7

keepalived
↗ → MASTER nginx1 → tomcat1
clint 虚拟IP ×
↘ → keepalived → tomcat2
BACKUP nginx2

案例

  • 两台服务器安装nginx和keepalived

  • 配置/etc/keepalived/keepalivec.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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #docker run的时候一定要加--privileged=true!!!!

    #全局配置
    global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 172.17.0.2
    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 {
    # 备份服务器上将MASTER改为BACKUP
    state BACKUP
    # ifconfig网卡名
    interface eth0
    # 主、备机的virtual_router_id必须相同
    virtual_router_id 51
    # 主、备机取不同的优先级,主机值较大,备份机值较小
    priority 90
    # 心跳时间间隔
    advert_int 1
    # 校验方式
    authentication {
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {
    # VRRP-H虚拟地址
    172.17.0.255
    }
    }
  • 脚本配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    !/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
    killall keepalived
    fi

    fi
  • service keepalived restart

原理

master和worker

1
2
3
4
5
6
7
8
9
10
11
12
13
						  					 管理员

[信号]

+- master进程
| ↙ ↓ ↘
|nginx [信号] [信号] [信号]
| ↓ ↓ ↓
+- worker进程 worker进程 worker进程
↗ ↖ ↗ ↖ ↗ ↖
[连接] [连接] [连接] [连接] [连接] [连接]
↑ ↑ ↑ ↑ ↑ ↑
client client client client client client
  • client的请求被master收到会通知给worker们,由worker们争抢,由争抢到的woker干具体工作

一个master和多个woker的好处

  • 可以使用nginx –s reload热部署,利用nginx进行热部署操作
  • 每个woker是独立的进程,如果有其中的一个woker出现问题,其他woker不受影响而继续进行争抢实现请求过程,不会造成服务中断

worker数和服务器的cpu数相等是最为适宜的

  • Nginx同redis类似都采用了io多路复用机制,每个worker都是一个独立的进程,但每个进程里只有一个主线程,通过异步非阻塞的方式来处理请求

连接数worker_connection

  • 发送请求占用woker的2或4个连接数

    • 静态资源:2
      • worker收到请求
      • worker返回请求
    • 动态资源:4
      • worker收到请求
      • worker发送给tomcat
      • worker收到tomcat信息
      • worker返回请求
  • 若nginx有一个master,四个woker,每个woker支持最大的连接数1024,支持的最大并发数为:

    • 普通的静态访问最大并发数:worker_connections * worker_processes / 2
    • HTTP作为反向代理最大并发数:worker_connections * worker_processes / 4

Nginx
http://docs.mousse.cc/Nignx/
作者
Mocha Mousse
发布于
2024年11月26日
许可协议