nginx能扛得住5万并发,那更大呢,怎么办

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx能扛得住5万并发,那更大呢,怎么办相关的知识,希望对你有一定的参考价值。

在高并发连接的情况下,nginx是Apache服务器不错的替代品。Nginx同时也可以作为7层负载均衡服务器来使用。测试结果,Nginx
0.7.14 + php 5.2.6 (FastCGI) 可以承受3万以上的并发连接数,相当于同等环境下Apache的10倍。
根据经验,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们将占用3GB以上的内存,还得为系统预留1GB的内存。我曾经就有两台Apache服务器,因为在配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,导致服务器内存和Swap空间用满而崩溃。
而这台
Nginx 0.7.14 + PHP 5.2.6 (FastCGI)
服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。
在3万并发连接下,访问Nginx 0.7.14 + PHP 5.2.6 (FastCGI) 服务器的PHP程序,仍然速度飞快。
你说的5万可以实现 最高能达到10万并发 但是有一个问题你的服务器配置要跟得上才可以玩要不然弄到那个并发数也没啥意义
参考技术A 通过加机器,负载均衡等方式可以增加并发量
最常见的就是cdn,根据访问流量的地区线路选择最近的节点,将流量进行分流
参考技术B 如果Nginx是作为负载均衡器来使用的话,超过5万的并发如果是软件的话,建议使用LVS。要是比较有钱的话,可以使用硬件F5。 参考技术C 单机扛不住了,达到硬件的极限了,只能集群,分布式了 参考技术D 您好,如果用户数太多的话,可以考虑使用负载均衡,就是一台处理任务分发的主机(分发请求任务),和其他处理任务请求的从机(处理请求)

Nginx+Keepalive实现高可用

前言

在项目中为了提高并发,一般会采用集群部署,集群部署之后前端就需要一个总的代理,简单的架构图如下

由于Nginx的性能很高,一般中小型公司的流量使用单节点的Nginx,后面挂服务集群这种简单的架构都能扛得住。
当然也可以部署多个Nginx,每个Nginx使用一个公网IP,然后使用DNS轮询机制来做负载均衡,但这样会造成公网IP的浪费,且DNS的实时性不高。或者可以采用Nginx集群前面再挂一个统一的入口LVS。
不管你是使用统一的入口LVS还是采用Nginx,为了避免公网IP的浪费,你始终需要对外提供一个统一的入口,所以很多中小公司都会采用单节点的nginx来作为外网的统一入口,但很明显这样会存在单节点故障问题,那么就需要一套机制来保证系统的正常访问。

其主要思路是

使用主备Nginx,当主Nginx出现问题时,备Nginx能立马接替主Nginx,继续对外提供服务。这整套的恢复流程是自动化的,不需要人工参与的。

而keepalive就是实现这个自动化的一个工具

Nginx+Keepalive架构和思路

Nginx+Keepalive之后主备的架构图如下,以下简称Keepalive为KV

主备KV共享一个虚IP,或者叫VIP,我这里的例子这个VIP为:192.168.85.50,用户访问VIP时默认优先访问到主KV的机器,当主KV宕机时,备KV自动切换为主,用户访问VIP时又会访问这台备KV

安装配置Nginx+KV(基于centos8)

准备两台centos8的服务器,我这里的地址为(192.168.85.130(主),192.168.85.131(备)),执行以下步骤

1、关闭防火墙、关闭selinux

# 查看防火墙状态
firewall-cmd --state

# 关闭防火墙
systemctl stop firewalld.service

# 关闭开机自动启动
systemctl disable firewalld.service

关闭selinux参考:https://blog.csdn.net/J080624/article/details/79571986

2、安装keepalived,nginx

yum -y install keepalived
yum -y install nginx

3、编辑主keepalice配置文件

vi /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.85.130 #这里修改为本机IP
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   script_user root
   enable_script_security

#添加检测脚本
vrrp_script chk_http_port 
        script "/usr/local/nginx/nginx_check.sh"
        interval 2
        weight 2

vrrp_instance VI_1 
    state MASTER   #主机这里是MASTER 从机是BACKUP
    interface ens33  #网卡
    virtual_router_id 51  # 主、从机的virtual_router_id必须相同
    priority 100   # 主备机取不同的优先级,主机优先级大
    advert_int 1  #心跳检测间隔时间
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.85.50
    
    track_script 
        chk_http_port
    

3、编辑备keepalice配置文件

bal_defs 
   notification_email   #指定keepalived在发生事件时(比如切换)发送通知邮件的邮箱
     acassen@firewall.loc  #设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务
     failover@firewall.loc
     sysadmin@firewall.loc
   
   notification_email_from Alexandre.Cassen@firewall.loc   #keepalived在发生诸如切换操作时需要发送email通知地址
   smtp_server 192.168.85.131   #指定发送email的smtp服务器
   smtp_connect_timeout 30       #设置连接smtp server的超时时间
   router_id LVS_DEVEL            #运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。

vrrp_script chk_http_port 
        script "/usr/local/nginx/nginx_check.sh"
        interval 2   #检测脚本执行间隔时间
        weight 2    #设置当前服务器权重增量

vrrp_instance VI_1 
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication 
        auth_type PASS
        auth_pass 1111
    
    virtual_ipaddress 
        192.168.85.50
    
    track_script 
        chk_http_port
    

5、在主和备上都创建nginx脚本文件

vi /usr/local/nginx/nginx_check.sh
counter=$(ps -C nginx --no-heading|wc -l)
if [ "$counter" = "0" ]; then
    	systemctl restart nginx
    sleep 2
    counter=$(ps -C nginx --no-heading|wc -l)
    if [ "$counter" = "0" ]; then
        systemctl stop keepalived
    fi
fi

设置脚本的权限

chmod 744 /usr/local/nginx/nginx_check.sh

其语义为每2秒检测一次nginx进程的存在状态,如果不存在就尝试重新启动nginx,然后睡眠2秒再次检测,如果nginx进程还是不存在说明没有启动成功,这个时候就终止keepalived服务,主kv终止后备kv就会上位,这时,流量就会被备机nginx接收。
6、修改备nginx的首页以便在访问主机和备机时能够加以区分

cd /usr/share/nginx/html
vi index.html

随便加一点东西

访问192.168.85.131看看效果

6、启动KV和nginx

systemctl restart nginx
systemctl restart keepalived

7、测试

  1. 访问192.168.85.50,可以看到nginx的主页,说明搭建成功。

  2. 停止主机上的KV,systemctl stop keepalived,继续访问192.168.85.50,显示备机页面,说明备机自动切换为主机了。

  3. 启动主机的KV,再次访问192.168.85.50又能看到主页,说明主机启动之后又成为了主机,备机自动下位(图就不放了,类似的)

  4. 停止主机的Nginx,systemctl stop nginx,会发现Nginx又会被重启。说明脚本执行成功了。

8、其他

查看kv的日志

tail -f /var/log/messages|grep Keepalived

查看VIP是否绑定成功

ip address

参考

https://blog.csdn.net/J080624/article/details/107024434

以上是关于nginx能扛得住5万并发,那更大呢,怎么办的主要内容,如果未能解决你的问题,请参考以下文章

面试官:为什么单线程的Redis可以实现高并发访问

Redis 14 问,你扛得住吗?

日拱一卒进击大厂系列面试官:为什么单线程的Redis可以实现高并发访问

思考:网络性能优化:网络 -- cpu -- 线程数 -- 单个任务耗时 --- qps --- 并发

扛得住的MySQL数据库架构

MySQL提升课程 全面讲解MySQL架构设计 打造扛得住的MySQL数据库架构