您的位置:首页 > 运维架构 > 反向代理

Nginx 的基本配置,实现反向代理、负载均衡、动静分离。

2020-06-06 06:56 127 查看

安装好 Nginx 后需要设置防火墙开放对应端口

# 列出所开通的端口
$ firewall-cmd --list-all

# 添加端口
$ firewall-cmd --add-service=http -permanent
$ sudo firewall-cmd --add-port=80/tcp --permanent

# 设置成功后需要重启防火墙生效
$ firewall-cmd --reload

Nginx 常用操作命令

如果没有配置环境变量需要进入到 nginx 的安装目录下进行操作

安装目录为 “/usr/local/nginx/sbin”(其他的有可能不一样)

操作命令 说明
nginx -v 查看 Nginx 版本号(小写 “v” 只显示版本号,大写 “V” 显示详细信息及配置参数的说明)
nginx 启动 Nginx
nginx -s stop 关闭 Nginx("-s" 有可能是表示安全关闭)
nginx -s reload 重新加载 Nginx

Nginx 配置文件的组成

  1. 全局块

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

    比如:worker_processes 1; worker_processes 值越大,可以支持的并发处理量也越多

  2. events 块

    events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接

    比如:worker_connections 1024; 支持的最大连接数

  3. http 块

    算是 Nginx 服务器配置中最频繁的部分

    http 块中包含 http 全局块和 server 块

Nginx 配置实例 - 反向代理

location 指令说明

该指令用于匹配 URL。

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

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

Nginx 配置实例-负载均衡

Step 1:在 http 块中新建 upstream server

负载均衡分配策略

  1. 轮询(默认)

    每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器宕机,将会自动剔除。例如:

    http {
    upstream myserver {
    server xxx.xxx.xxx.xxx:8080;
    server xxx.xxx.xxx.xxx:8081;
    ......
    }
    }
  2. 权重(weight)

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

    *指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。*例如:

    http {
    upstream myserver {
    server xxx.xxx.xxx.xxx:8080 weight=10;
    server xxx.xxx.xxx.xxx:8081 weight=10;
    ......
    }
    }
  3. ip_hash

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

    http {
    upstream myserver {
    ip_hash;
    server xxx.xxx.xxx.xxx:8080;
    server xxx.xxx.xxx.xxx:8081;
    }
    }
  4. fair(第三方)

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

    http {
    upstream myserver {
    server xxx.xxx.xxx.xxx:8080;
    server xxx.xxx.xxx.xxx:8081;
    fair;
    }
    }

Step 2:在 server 块中的 location 块中配置一下内容,引用 upstream myserver

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

Nginx 配置实例-动静分离

一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;

另外一种方法就是动态跟静态文件混合在-起发布,通过nginx 来分开。

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

location /pages/ {
root static;
index page1.html;	#默认首页
}

location /images/ {
root static;
autoindex on;		# 列出文件加中所有的内容
}

Nginx 配置实例-高可用服务器集群

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M0DHHjJa-1587277385731)(D:\Learn\笔记\Nginx-img\20200307111238.jpg)]

  • 配置高可用的准备工作
  1. 需要两台服务器
  2. 在两台服务器上安装 nginx
  3. 在两台服务器上安装 keepalived
  • 在两台服务器上安装 keepalived

使用 yum 命令进行安装

$ yum install keepalived -y

查看是否安装成功

$ rpm -q -a keepalived

keepalived 安装目录为:

/etc/keepalived

配置文件目录在:

/etc/keepalived/keepalived.conf

  • 完成高可用配置(主从配置)
  1. 修改

    /etc/keepalived/keepalived.conf
    配置文件

    global_defs {
    notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
    }
    notification_email_from Alexandre.Cassen@firewall.loc
    smtp_server 192.168.17.129
    smtp_connect_timeout 30
    router_id LVS_DEVEL	# 访问到的主机 在 HOSTS 文件中配置
    }
    
    vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh"
    interval 2 #(检测脚本执行的间隔)单位:秒
    weight 2 # 权重
    }
    
    vrrp_instance VI_1 {
    state BACKUP # 备份服务器上将 MASTER 改为 BACKUP
    interface ens33 //网卡 执行 ipconfig 查看
    virtual_router_id 51 # 主、备机的 virtual_router_id 必须相同
    priority 100 # 主、备机取不同的优先级,主机值较大,备份机值较小
    advert_int 1 # 发送心跳检测进程是否存活(单位:秒)
    authentication {	#认证方式
    auth_type PASS
    auth_pass 1111
    }
    virtual_ipaddress {		# 虚拟 IP
    192.168.17.50 // VRRP H 虚拟地址
    }
    }
  2. /usr/local/src
    添加建测脚本

    #!/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
  3. 启动两台服务上的 Nginx 和 Keepalived

    启动 Nginx:

    ./nginx

    启动 Keepalived:

    keepalived:systemctl start keepalived.service

Nginx 原理与优化参数配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zXWc5FBw-1587277385736)(D:\Learn\笔记\Nginx-img\20200307133255.jpg)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ss8gHXi-1587277385738)(D:\Learn\笔记\Nginx-img\20200307133332.jpg)]

master-workers 的机制的好处

首先,对于每个 worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,
同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会
影响,一个进程退出后,其它进程还在工作,服务不会中断,master 进程则很快启动新的
worker 进程。当然,worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当
前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

需要设置多少个 worker

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

io 多路复用机制 在 Windows 上不起作用

设置 worker 数量。

worker_processes 4
# work 绑定 cpu(4 work 绑定 4cpu)。
worker_cpu_affinity 0001 0010 0100 1000
# work 绑定 cpu (4 work 绑定 8cpu 中的 4 个) 。
worker_cpu_affinity 0000001 00000010 00000100 00001000

连接数 worker_connection

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: