Nginx

目录

基本介绍

Nginx核心功能

Nginx下载&安装&启动

配置防火墙

Nginx常用命令

Nginx配置文件

全局块

events块

http块

http全局块

[server 块](#server 块)

检查配置信息

快速入门

安装JDK

安装Tomcat

反向代理分析

Location语法规则

反向代理配置-Location实例

负载均衡规则

负载均衡-配置实例

动静分离

Nginx工作机制&参数设置

master-worker机制

参数设置

worker-processes

worker_connection

配置Linux最大打开文件数

搭建高可用集群

集群架构图

具体搭建步骤

搭建基础环境

集群配置

测试

自动检测Nginx异常,终止keeppalived

配置文件keepalived.conf详解


基本介绍

1、通过不同的URI来访问不同的服务(反向代理)

2、如果服务是集群,通过URI轮询访问(负载均衡)

3、动静分离

4、高可用集群(多个Nginx)

Gateway也可以做到

请求先到Nginx,再反向代理到网关,再找到真正服务的接口

Nginx核心功能

正向代理

反向代理

不希望公开目标服务器,只允许反向代理访问,提供一个统一的访问IP

客户端将请求发送到代理服务器,代理服务器去选择目标服务器获取数据,返回给客户端,这种代理方式为反向代理

反向代理帮助的对象是目标服务器,反向代理会屏蔽目标服务器的信息,实现负载均衡

负载均衡

当客服端向反向代理服务器(比如Nginx)发出请求,如果Nginx代理了多个Web服务器(集群),Nginx会将请求/负载分发到不同的服务器,也就是负载均衡

动静分离

加快网站的解析速度,把动态和静态资源由不同的服务器来解析,降低单个服务器的压力

静态资源也会发出Http请求,服务器压力很大,把静态资源剥离出来

Nginx下载&安装&启动

下载地址

安装 Nginx

首先安装依赖:yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

启动 Nginx

Linux浏览器输入localhsot,nginx默认端口是80

配置防火墙

让Windos访问Nginx:IP:端口(默认80,可以不写)
查看防火墙状态:firewall-cmd --list-all

设置开放的端口号:firewall-cmd --add-port=80/tcp --permanent

设置关闭的端口号:firewall-cmd --remove-port=80/tcp --permanent

**每次开启/关闭必须重启:**firewall-cmd --reload

Nginx常用命令

查看监听的端口:netstat -anp | more

Nginx配置文件

Nginx 的配置文件是在**/usr/local/nginx/conf** 目录中的nginx.conf 文件

Nginx 的配置文件分由三部分组成:全局块、events块、http块

Nginx配置文件nginx.conf详解

css 复制代码
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

全局块

从配置文件开始到 events 块之间的内容

主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。

java 复制代码
worker_processes 1;

这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。

events块

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

常用的设置包括是否开启对多 work process下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 wordprocess 可以同时支持的最大连接数等。

java 复制代码
events {
		worker_connections  1024;
	}

上述例子就表示每个 work process 支持的最大连接数为 1024,这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。

http块

这算是 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)进行匹配,对特定的请求进行处理。 比如地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。

检查配置信息

查看nginx.conf配置错误信息:nginx -t

快速入门

安装JDK

1、将压缩包上传到/opt/jdk并解压,移动到/usr/local/java

2、配置环境变量:vim /etc/profile,按 i 进入编辑模式,在最后添加配置

export JAVA_HOME=/usr/local/java/jdk1.8.0_261
export PATH=JAVA_HOME/bin:**PATH**

必须要带$PATH,保留原本的PATH路径

3、添加完成,按ESC键,退出insert,下方-- insert --会消失,然后再输入:wq,退出并保存

4、刷新环境变量:source /etc/profile,查看PATH:echo $PATH

5、查看JDK版本:java -version

安装Tomcat

1、将压缩包上传到/opt/tomcat并解压

2、进入解压目录\bin,启动tomcat:./startup.sh(也可以配环境变量,这里就不配了)

3、开放端口8080,可以在windows通过 IP:端口 访问tomcat页面

反向代理分析

关闭8080端口,windows浏览器输入www.hsp.com

Location语法规则

带^~不一定就是正则匹配,^~优先级比正则匹配高

一、精准匹配(成功直接返回,否则继续普通匹配)(location = /uri/{...})

二、普通匹配(不按顺序)(location /uri/{...})

1、含有^~,匹配成功直接返回,不做正则匹配

2、不含有^~,匹配成功记录下来(记录最长匹配结果),继续正则匹配

三、正则匹配(按顺序)

1、匹配成功直接返回

2、匹配不成功,返回普通匹配最长匹配结果

反向代理配置-Location实例

修改配置文件

创建Tomcat文件

默认访问webapps目录

linux新建product文件夹和hi.html

member新建product文件夹和hi.html

linux防火墙打开10000端口
linux访问Windows Tomcat(关闭Windows的防火墙)
启动linux和windows的Tomcat,可以使用
**netstat -anp | more****来查看是否启动
重新加载Nginx,Windows浏览器输入:**www.hspmall.com:10000/product/hi.html

负载均衡规则

Nginx分配服务器策略

Nginx的upstream配置技巧

1. 轮询(默认)

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

2. weight

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

css 复制代码
    upstream myserver {
        server 208.208.128.122:8081 weight=1;  
        server 208.208.128.122:8082 weight=10;
    }
    server {
        listen       80;
        server_name  208.208.128.122;
        location / {
            root   html;
            proxy_pass   http://myserver;
            index  index.html index.htm;
    }

3. ip_hash

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

css 复制代码
upstream myserver {
    	ip_hash;							
        server 208.208.128.122:8081 ;   
        server 208.208.128.122:8082 ;
    }
    server {
        listen       80;
        server_name  208.208.128.122;
        location / {
            root   html;
            proxy_pass   http://myserver;
            index  index.html index.htm;
    }

4. fair(第三方)

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

css 复制代码
    upstream myserver {					
        server 208.208.128.122:8081 ;   
        server 208.208.128.122:8082 ;
        fair; 		
    }
    server {
        listen       80;
        server_name  208.208.128.122;
        location / {
            root   html;
            proxy_pass   http://myserver;
            index  index.html index.htm;
    }

负载均衡-配置实例

修改配置文件

创建Tomcat文件

默认访问webapps目录

在Linux的Tomcat8080创建search文件夹和look.html

在当前目录拷贝一份:cp -rf ./apache-tomcat-8.5.59 ./apache-tomcat-8.5.59new

修改look.html

将端口修改成8081

redirectPort要和另一个Tomcat不一样

linux防火墙打开80端口
启动linux的两个Tomcat,可以使用
**netstat -anp | more****来查看是否启动
重新加载Nginx,Windows浏览器输入:**www.hspcrm.com/search/look.html

动静分离

创建Tomcat文件

其他配置在负载均衡已经配置过了

在Tomcat8080和8081的search目录下创建cal.jsp和image目录,即可通过传统方法实现功能

动静分离优化

在/usr/local/nginx/html目录下创建/search/image目录,图片的路径就是ip/search/image

重启Nginx

Nginx工作机制&参数设置

master-worker机制

nginx 启动后,是由两个进程组成的。master(管理者)和worker(工作者)。
一个nginx 只有一个master。但可以有多个worker

Master-Worker 模式

  1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。
  2. Master 进程接收来自外界的信号(Request请求),向各 worker 进程发送信号,每个进程都有可能来处理这个连接。
  1. Master 进程能监控 Worker 进程的运行状态,当 worker 进程退出后(异常情况下),会自动启动新的 worker 进程。

accept_mutex 解决 "惊群现象"

  1. 所有子进程都继承了父进程的 sockfd,当连接进来时,所有子进程都将收到通知并"争着"与它建立连接,这就叫"惊群现象"。
  2. 大量的进程被激活又挂起,只有一个进程可以 accept() 到这个连接,会消耗系统资源。
  3. Nginx 提供了一个 accept_mutex ,这是一个加在 accept 上的一把共享锁。即每个 worker 进程在执行 accept 之前都需要先获取锁 ,获取不到就放弃执行 accept()。有了这把锁之后,同一时刻,就只会有一个进程去 accpet(),就不会有惊群问题了。
  4. 当一个 worker 进程在 accept() 这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,完成一个完整的请求。
  1. 一个请求,完全由 worker 进程来处理,而且只能在一个 worker 进程中处理。

用多进程结构而不用多线程结构的好处

  1. 节省锁带来的开销, 每个 worker 进程都是独立的进程,不共享资源,不需要加锁。在编程以及问题查上时,也会方便很多。
  1. 独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后, 其它进程还在工作,服务不会中断,master 进程则很快重新启动新的 worker 进程

实现高并发的秘密-IO多路复用

  1. 对于 Nginx 来讲,一个进程只有一个主线程,那么它是怎么实现高并发的呢?
  2. 采用了 IO 多路复用的原理,通过异步非阻塞的事件处理机制,epoll 模型,实现了轻量级和高并发,worker获取到锁首先会注册事件(上图)
  3. nginx 是如何具体实现的呢,举例来说:每进来一个 request,会有一个 worker 进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发 request,并等待请求返回。那么,这个处理的 worker 不会这么傻等着,他会在发送完请求后,注册一个事件:"如果 upstream 返回了,告诉我一声,我再接着干"。 于是他就休息去了。此时,如果再有 request 进来,他就可以很快再按这种方式处理。而 一旦上游服务器返回了,就会触发这个事件,worker 才会来接手,这个 request 才会接着 往下走。由于 web server 的工作性质决定了每个 request 的大部份生命都是在网络传输中, 实际上花费在 server 机器上的时间片不多,这就是几个进程就能解决高并发的秘密所在
  4. 可以理解为去吃饭点菜,服务员通知厨师,不会一直在旁边等待

参数设置

worker-processes

  • 需要设置多少个 worker
    cpu 的性能发挥到极致。所以 worker 数和服务器的 cpu 数相等是最为适宜的。设少了会浪费 cpu,设多了会造成 cpu 频繁切换上下文带来的损耗。
  • 每个 worker 的线程可以把一个 设置 worker 数量, Nginx 默认没有开启利用多核 cpu,可以通过增加 worker_cpu_affinity 配置参数来充分利用多核 cpu 的性能

重启Nginx,输入:ps -ef | grep nginx

worker_connection

配置Linux最大打开文件数

搭建高可用集群

Keepalived+Nginx高可用集群(主从模式)

集群架构图

具体搭建步骤

搭建基础环境


查看虚拟机IP,原本是130,现在新的两个是131和132

修改nginx.conf,启动tomcat,重启nginx,目前是独立的两台Linux服务器


在两台Linux服务器安装keepalived,按照步骤安装好即可

keepalived下载

集群配置

修改192.168.102.131为Master:vi /etc/keepalived/keepalived.conf

修改192.168.102.132为BACKUP

测试

启动keepalived的指令:/usr/local/sbin/keepalived

命令:ip a 查看是否成功

查看进程:ps -ef | grep keepalived

杀掉进程:killall keepalived

重启:/usr/local/sbin/keepalived

保证Windows能ping通192.168.198.18(ping不同就使用192.168.102.133)

浏览器输入:192.168.198.18/search/cal.jsp

虚拟IP绑定到主nginx(根据优先级决定) ,找不到再绑定到从nginx(支持负载均衡)

自动检测Nginx异常,终止keeppalived

如果直接停止主Nginx,但keepalived没有关闭,仍会访问keepalived,浏览器返回错误信息

需求,自动检测,如果Nginx关闭,就自动关闭对应的keepalived,让虚拟IP重新绑定

bash 复制代码
#!/bin/bash
num=`ps -C nginx --no-header | wc -l`
if [ $num -eq 0 ];then
   killall keepalived
fi

修改配置文件:vi /etc/keepalived/keepalived.conf

配置文件keepalived.conf详解

Puppet 复制代码
#这里只注释要修改的地方
global_defs {
    notification_email {
    test@foxmail.com #接收通知的邮件地址
    }
    notification_email_from Alexandre.Cassen@firewall.loc #发送邮件的邮箱
    smtp_server 192.168.200.1 #smtp server 地址
    smtp_connect_timeout 30
    router_id Node132 #Node132 为主机标识
    vrrp_skip_check_adv_addr
    #vrrp_strict #这里需要注释,避免虚拟 ip 无法 ping 通
    vrrp_garp_interval 0
    vrrp_gna_interval 0
}
vrrp_instance VI_1 {
    state MASTER #主节点 MASTER 备用节点为 BACKUP
    interface ens33 #网卡名称
    virtual_router_id 51 #VRRP 组名,两个节点的设置必须一样,指明属于同一 VRRP 组
    priority 100 #主节点的优先级(1-254 之间),备用节点必须比主节点优先级低
    advert_int 1 #组播信息发送间隔,两个节点设置必须一样
    authentication { #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #指定虚拟 IP, 两个节点设置必须一样
    192.168.200.16
    }
}
相关推荐
BUG研究员_5 小时前
LoadBalancer负载均衡和Nginx负载均衡区别理解
nginx·rpc·负载均衡
见欢.6 小时前
Nginx解析漏洞靶场通关(nginx_parsing&CVE-2013-454)
nginx
2401_8504108311 小时前
LVS简介
运维·nginx·tomcat·lvs
Say-hai17 小时前
nginx-rtmp服务器搭建
服务器·nginx·音视频
liuyunshengsir19 小时前
Nginx的stream模块代理四层协议TCP的流量转发
运维·tcp/ip·nginx
过过过呀Glik1 天前
在 Ubuntu 上安装 Nginx 的详细指南
nginx·ubuntu
托尼沙滩裤1 天前
【MAC】深入浅出 Homebrew 下 Nginx 的安装与配置指南
运维·nginx·macos
夜半被帅醒1 天前
网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时
服务器·nginx·tomcat
你疯了抱抱我2 天前
【自用】通信内网部署rzgxxt项目_02,前端pipeCloud部署(使用 nginx 部署 + NSSM 控制非窗口运行)
运维·前端·nginx
等一场春雨2 天前
react 项目打包部署nginx
前端·nginx·react.js