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
    }
}
相关推荐
jessecyj3 小时前
Nginx中$http_host、$host、$proxy_host的区别
运维·nginx·http
skiy3 小时前
Nginx搭建负载均衡
运维·nginx·负载均衡
明天…ling3 小时前
Redhat 10 部署Nginx实现多IP/多端口/HTTPS访问(避坑实操+问题全解决)
tcp/ip·nginx·https
sunwenjian8863 小时前
Nginx 的 proxy_pass 使用简介
运维·nginx
xiaohe074 小时前
nginx 代理 redis
运维·redis·nginx
gechunlian884 小时前
Nginx多域名,多证书,多服务配置,实用版
运维·网络·nginx
qqty12174 小时前
Nginx反向代理出现502 Bad Gateway问题的解决方案
运维·nginx·gateway
NGINX开源社区8 小时前
使用 NGINX 作为 AI Proxy
大数据·人工智能·nginx
瀚高PG实验室1 天前
nginx中配置数据库连接
运维·数据库·nginx·瀚高数据库
小句1 天前
Nginx 配置完整指南
运维·nginx