Nginx动静分离、缓存配置、性能调优、集群配置

news2024/11/23 21:47:37

一. Nginx动静分离

1. 准备

 1个web程序:部署在7061端口,启动 【dotnet NginxWeb.dll --urls="http://*:7061" --ip="127.0.0.1" --port=7061】

Nginx程序:监听7000端口

2. 目的

 比如单独启动部署在7061端口下的web程序,进行访问,我们会发现,除了请求的加载,还有很多静态 css、js、图片等资源的加载,这些资源的加载也是占服务器带宽的,假设带宽为1m,几个大图片直接就占满了。

所以这里引入动静分离,将静态资源单独隔离出来,不占据主服务器的带宽,同时也有利于静态资源做缓存处理。 

3. 实操

方案1:在Nginx同一个Server实现动静分离

剖析:

将wwwroot文件夹从发布包中单独处理出来,然后通过location配置绝对地址,实现静态资源的分离。

缺点:动静资源在一个虚拟主机中,那么静态资源和动态资源共享同一个资源,如果静态或者动态资源访问量比较大,把资源消耗殆尽,动态和静态资源互相会进行影响,导致系统整体上性能下降。

代码分享:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       7000;        #监听端口
        server_name  test1;         #随意配置一个地址即可,优先走代理
        
        #动态资源
        location / {
             proxy_pass http://localhost:7061;   #代理地址
        }	
        #静态资源
        location ~ \.(ico|js|css|png|jpg|mp4)$ {
            root C:/Users/Administrator/Desktop/publish/wwwroot;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

方案2:在Nginx多个Server下实现动静分离

剖析:

  使用主机7000端口监听动态资源,使用主机7001端口监听静态资源,在7000的主机下通过代理的形式链接 静态资源: proxy_pass http://localhost:7001; #代理地址

缺点:虽然是两个Sever,但这都是虚拟,还是在一台服务器上,一台服务器的承受能力毕竟是有限的。

代码分享:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    #1.动态资源Server
    server {
        listen       7000;        #监听端口
        server_name  test1;         #随意配置一个地址即可,优先走代理

        #动态资源
        location / {
             proxy_pass http://localhost:7061;   #代理地址
        }
        #静态资源--指向静态代理Server
        location ~ \.(ico|js|css|png|jpg|mp4)$ {
            proxy_pass http://localhost:7001;   #代理地址
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
	
    #2.静态资源Server
    server {
        listen       7001;        #监听端口
        server_name  test2;         #随意配置一个地址即可,优先走代理
        #静态资源
        location ~ \.(ico|js|css|png|jpg|mp4)$ {
            root C:/Users/Administrator/Desktop/publish/wwwroot;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

方案3:在多个Nginx下实现动静分离

代码分享:

  即两个Nginx程序,部署在不同服务器,一个处理动态资源,一个处理静态资源,在动态资源的nginx中通过 proxy_pass http://xxxxx:xxxx; 代理到静态资源的服务器上即可。

  nginx_dynamic

  nginx_static

剖析:

多个nginx部署在多个服务器上,减轻压力,避免同一台服务器上进行资源竞争。

更多C++后台开发技术点知识内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。

C/C++Linux服务器开发高级架构师/C++后台开发架构师​免费学习地址

【文章福利】另外还整理一些C++后台开发架构师 相关学习资料,面试题,教学视频,以及学习路线图,免费分享有需要的可以点击领取

二. Nginx缓存配置

1. 背景

 分析一个电商网站的详情页面,如下图,设计到很多微服务:商品详情页HTML页面渲染、价格服务、促销服务、库存状态/配送至服务、广告词服务、预售/秒杀服务、评价服务、试用服务、推荐服务、商品介绍服务、各品类相关的一些特殊服务。

常见的解决方案:

 前端通过ajax动态加载,服务端则把这些文案以html的形式缓存到Redis中,如下图:

剖析:

 一个详情页html 主体达平均150 kb, 那么在500QPS 已接近千M局域网宽带极限,所以必须减少内网通信。

2. Nginx缓存

相关模块【ngx_http_proxy_module】 http://nginx.org/en/docs/http/ngx_http_proxy_module.html

 针对上面占满内网带宽的情况,可以在Ngxin这一层做静态文件缓存,然后后台维护商品的时候删除缓存(修改商品→删除缓存),架构图如下:

3. 配置说明

其它补充:

proxy_set_header Host $host; #用于后端的real server区分不同的虚拟主机;

proxy_set_header X-Real-IP $remote_addr; #记录客户端真实ip地址,而不是代理服务器地址,需要后端web服务器开启日志相应功能接收;

proxy_cache_methods GET HEAD; #表示对客户端请求的GET 和 HEAD方法进行缓存;

proxy_cache_revalidate on; #本地缓存过期会检查后端服务器该缓存是否存在,避免后端重传占据带宽;

proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_valid any 1m; #针对于不同的响应码进行缓存不同的时间设定;

proxy_cache_min_uses 1; #某一个请求被响应多少次才会被缓存,默认是1,可以将该值设置为大一些;

proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; #指明哪种场景可以使用过期缓存,提升用户体验;

4. 实操

这里对一个web页面进行缓存,不进行redis的存储。

剖析:

 (1). 首先在nginx的根目录下创建文件夹 ypfCache/nginx , 用来存放缓存。

(2). 启动7061端口的web程序,启动nginx程序,访问nginx,发现缓存目录下多了个文件。

(3). 关闭7061端口的web程序,重新访问nginx,继续可以访问,说明缓存成功了。

代码分享:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

	#缓存声明
	proxy_cache_path ypfcache/nginx/ levels=1:2 keys_zone=mycache:64m;

    server {
        listen       7000;        #监听端口
        server_name  test1;         #随意配置一个地址即可,优先走代理

        location / {
             proxy_pass http://localhost:7061;   #代理地址
			 
            #缓存相关配置
            proxy_cache mycache;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_cache_methods GET HEAD;
            proxy_cache_revalidate on;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_valid any 1m;
            proxy_cache_min_uses 1;
            proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
        }
		
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }  
    }
}

三. Nginx性能调优

1. worker_processes number

每个worker进程都是单线程的进程,它们会调用各个模块以实现多种多样的功能。如果这些模块确认不会出现阻塞式的调用,那么,有多少CPU内核就应该配置多少个进程;反之,如果有可能出现阻塞式调用,那么需要配置稍多一些的worker进程。例如,如果业务方面会致使用户请求大量读取本地磁盘上的静态资源文件,而且服务器上的内存较小,以至于大部分的请求访问静态资源文件时都必须读取磁盘(磁头的寻址是缓慢的),而不是内存中的磁盘缓存,那么磁盘I/O调用可能会阻塞住worker进程少量时间,进而导致服务整体性能下降。

2. 每个worker 进程的最大连接数

语法:worker_connections number; 默认:worker_connections 1024

3. worker_cpu_affinity cpumask[cpumask……]绑定Nginx worker进程到指定的CPU内核

为什么要绑定worker进程到指定的CPU内核呢?假定每一个worker进程都是非常繁忙的,如果多个worker进程都在抢同一个CPU,那么这就会出现同步问题。反之,如果每一个worker进程都独享一个CPU,就在内核的调度策略上实现了完全的并发。 例如,如果有4颗CPU内核,就可以进行如下配置: worker_processes 4; worker_cpu_affinity 1000 0100 0010 0001; 注意 worker_cpu_affinity配置仅对Linux操作系统有效。

4. Nginx worker 进程优先级设置

语法:worker_priority nice; 默认:worker_priority 0; 优先级由静态优先级和内核根据进程执行情况所做的动态调整(目前只有±5的调整)共同决定。nice值是进程的静态优先级,它的取值范围是–20~+19,–20是最高优先级,+19是最低优先级。因此,如果用户希望Nginx占有更多的系统资源,那么可以把nice值配置得更小一些,但不建议比内核进程的nice值(通常为–5)还要小

5. Nginx worker进程可以打开的最大句柄描述符个数

语法: worker_rlimit_nofile limit; 默认:空 更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。

6. 是否打开accept锁

语法:accept_mutex[on|off] 默认:accept_mutext on; accept_mutex是Nginx的负载均衡锁,当某一个worker进程建立的连接数量达到worker_connections配置的最大连接数的7/8时,会大大地减小该worker进程试图建立新TCP连接的机会,accept锁默认是打开的,如果关闭它,那么建立TCP连接的耗时会更短,但worker进程之间的负载会非常不均衡,因此不建议关闭它。

7. 使用accept锁后到真正建立连接之间的延迟时间

语法:accept_mutex_delay Nms; 默认:accept_mutex_delay 500ms; 在使用accept锁后,同一时间只有一个worker进程能够取到accept锁。这个accept锁不是堵塞锁,如果取不到会立刻返回。如果只有一个worker进程试图取锁而没有取到,他至少要等待accept_mutex_delay定义的时间才能再次试图取锁。

四. Nginx集群

1. 准备两台服务器

【192.168.140.1】

【192.168.140.2】

2. Nginx的安装

两台服务器上均进行nginx的安装,步骤详见 https://www.cnblogs.com/yaopengfei/p/13766324.html

3. Keepalive的安装

(1). 两个服务器均进行安装keepalive

【yum install keepalived】

(2). 修改配置文件

【cd /etc/keepalived/keepalived.conf】

查看代码

global_defs {

   notification_email { # keepalived服务宕机异常出现的时候,发送通知邮件 可以是多个   acassen@firewall.loc  #  收件人邮箱1

 failover@firewall.loc #  收件人邮箱2

 sysadmin@firewall.loc #  收件人邮箱3
   }

   notification_email_from Alexandre.Cassen@firewall.loc  #邮件发件人

   smtp_server 192.168.200.1  # 邮件服务器地址

   smtp_connect_timeout 30   # 超时时间

   router_id LVS_DEVEL   # 机器标识 局域网内唯一即可

   vrrp_skip_check_adv_addr # 默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。

   #vrrp_strict   # 严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。

   vrrp_garp_interval 0  # 小数类型,单位秒,在一个网卡上每组gratuitous arp消息之间的延迟时间,默认为0,一个发送的消息=n组 arp报文

   vrrp_gna_interval 0 # 小数类型,单位秒, 在一个网卡上每组na消息之间的延迟时间,默认为0

}
vrrp_instance VI_1 {
state MASTER  # 服务器状态 MASTER是主服务器  BACKUP是备份服务器 主服务器的priority要比备份服务器大

interface ens33 # 通信端口 通过ip addr可以看到 根据自己的机器配置

virtual_router_id 51  # vrrp实例id  keepalived集群,实例id必须一致

priority 100  # 权重比 主服务器的priority要比备份服务器大

advert_int 1  # 心跳间隔  单位秒  keepalived多机器集群 通过心跳检测,如果发送心跳没反应 就立刻接管;

authentication { # 服务器之间通信密码

    auth_type PASS

    auth_pass 1111

}

virtual_ipaddress { # 自定义虚拟IP 

    192.168.91.199

}
}

(3). 进行启动

【systemctl start keepalived.service】 启动 【systemctl stop keepalived.service】 关闭 【systemctl restart keepalived.service】重启

(4). 日志查看 【tail -f /usr/local/nginx/logs/access.log】 【tail -f /var/log/messages】 (5). 进程查看 【ps -ef|grep keep】

4. 配置Nginx重启脚本

(1). 创建脚本,nginx_restart.sh

#!/bin/bash
echo 'xxxxxx'
count_nginx=`ps -ef|grep -w nginx|grep -v grep|wc -l`
echo $count_nginx
if [ $count_nginx -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -ef|grep -w nginx|grep -v grep|wc -l` -eq 0 ];then
    systemctl stop keepalived.service
fi  
fi

(2). keepalived配置中添加如下内容

vrrp_script chk_http_port {
     script "/root/nginx_restart.sh" #脚本地址
     interval 2 #检测脚本执行的间隔
     weight 2 #比重
}

原文链接:第三节:Nginx动静分离、缓存配置、性能调优、集群配置 - Yaopengfei - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/58582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ 静态库,动态库的制作和使用

文章目录1.什么是库?2.静态库的制作1.静态库的命名规则2.静态库的制作与使用1.静态库的制作2.静态库的使用3.动态库的制作1.动态库的命名规则2.动态库的制作与使用1.动态库的制作2.动态库的使用3.动态库加载失败的原因4.静态库和动态库的对比1.程序编译成可执行文件…

[附源码]Python计算机毕业设计Django基于Java的失物招领平台

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

时序数据库选型

目录一、当前主流的时序数据库二、各库特性1、Influxdb2、Timescale3、Druid4、Kdb5、Graphite6、RRDtool7、OpenTSDB8、TDengine9、DolphinDB三、优缺点对比因为个人用的go,所以调研及对比主要针对适配了go语言的数据库。 一、当前主流的时序数据库 排名参考于h…

基于PHP+MySQL动漫专题网站系统的设计与实现

随着时代的发展,人们兴趣爱好也越来越广泛,动漫是当前年轻人比较钟爱的一个兴趣爱好之一,每年都会有大量的动漫爱好者定期的举办一些交流活动等,但是线下的这种交流方式明显不能满足当前动漫爱好者的需求,为此我开发了…

Zen of Python(python之禅)

在python中导入import this就会显式: 以下是中文英文翻译: Beautiful is better than ugly. 优美比丑陋好 Explicit is better than implicit. 清晰比晦涩好 Simple is better than complex. 简单比复杂好 Complex is better than complicated. 复杂比错…

【全干工程师必学】一文搞懂Vue2.0

一文搞懂Vue2.0一、前端工程化二、WebPack是什么基本使用实现奇偶行变色1.初始化包管理工具2.安装jquery3.在项目中安装webpack4.在项目中配置webpack5.运行代码mode 的可选值developmentproductionwebpack.config.js 文件的作用webpack 中的默认约定自定义打包的入口与出口web…

uni-app开发常用操作速查记录

记录一下uni-app中常用的使用方法或是操作步骤,方便后期速查使用. 1.设置对象属性 2.组件中数据变化监听方法 3.微信开发者工具中全局搜索与局部搜索 4.Page对象与Componet对象组成 5.tabbar页面切换方法 6.组件中自定义函数的参数传递 7.m…

Android Jetpack Compose的基本介绍

目录一、引言:Android Jetpack1.Jetpack是什么?2. 常用的Jetpack库二、Compose的基本概念1.什么是Jetpack Compose2.Compose的编程思想三、 Compose简单的案例: 一个倒计时效果1.构建一个Compose项目2.声明一个倒计时的UI3.利用线程使其动起来4.实现效果…

快速了解Docker

目录 1.简介 2.Docker的安装及环境配置 2.1.查看是否是root用户 2.2.查看当前内核版本 2.3.更新yum源 2.4.安装Docker所需要的工具包 2.5.设置yum源 2.6.下载安装Docker 2.7.启动Docker并且设置开机自启动 2.8.测试是否安装成功 3.Docker阿里云镜像仓库配置 4.Docker常…

C++ vector

目录 1.vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.3 vector 增删查改 1.2.4 vector 迭代器失效问题。(重点) 1.2.5 vector 在OJ中的使用 2.vec…

【Linux】Linux的常见指令详解(上)

目录 前言 ls pwd cd mkdir touch rm man tree nano cp mv cat echo more/less 前言 🧁Linux作为相较于windows的另一种操作系统,同时基于其开源的优越性,使得其在各各企业的使用率极高。因此学好Linux操作系统对我们来说是…

Mongoose应用和文件文件的上传和下载

一、Express框架访问MongoDB数据库 1、目的: ​ (1)mongoose模块的使用 ​ (2)学会代码的封装:dao层、service层、接口层 ​ (3)MVC设计思想:M(Model)、V(View)、C(C…

[附源码]Python计算机毕业设计Django基于SpringBoot的演唱会购票系统论文2022

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,我…

c#与mysql连接和操作教程(增、删、改、查)

一、mysql的连接(使用的是vs2019) 1. 在一个项目中选择 工具 > NgtGet包管理器 > 管理解决方案的NuGet程序包 2. 搜索MySql.Data,然后下载,并在右边选着对应的项目进行安装(ps:每个项目要连接数据库…

【身份证识别】基于BP神经网络实现身份证识别附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

代码随想录刷题|LeetCode 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

目录 300.最长递增子序列 思路 1、dp[i]的定义 2、递推公式 3、dp数组初始化 4、确定遍历顺序 5、推导dp数组 最长递增子序列 674. 最长连续递增序列 思路 最长连续递增序列 动态规划 贪心算法 718. 最长重复子数组 思路 1、确定dp数组的含义 2、确定递推公式 3、dp数组初始化…

docker 命令

目录 Docker 环境信息命令 docker info docker version 系统日志信息常用命令 docker events docker logs docker history 容器的生命周期管理命令 docker create docker run 常用选项 系统 网络 健康检查 命名空间选项 cgroup资源限制选项 CPU CPUset devi…

李宏毅《DLHLP》学习笔记7 - Voice Conversion 1

视频链接:https://www.youtube.com/watch?vJj6blc8UijY&listPLJV_el3uVTsO07RpBYFsXg-bN5Lu0nhdG&index9&ab_channelHung-yiLee 课件链接:https://speech.ee.ntu.edu.tw/~tlkagk/courses/DLHLP20/Voice%20Conversion%20(v3).pdf 1. 语音转…

永磁同步电机恒压频比(V/F)开环控制系统Matlab/Simulink仿真分析及代码生成到工程实现(二)

文章目录前言一、SVPWM二、永磁同步电机恒压频比开环控制系统Matlab/Simulink仿真分析2.1.仿真电路分析2.1.1.恒压频比控制算法2.1.2.输出处理2.1.3.主电路2.2.仿真结果分析三、永磁同步电机恒压频比开环控制系统代码生成及工程实现3.1.恒压频比开环控制算法代码生成3.2.仿真验…

计算机毕业论文Java项目源码下载基于SSM的旅游资讯网站含前台与后台

💖💖更多项目资源,最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 《ssm地方旅游资讯网站》该项目采用技术:jsp 、springmvc、spring、mybatis 、css、js、jQuery、bootstrap、easyui等相关技术&#x…