精华内容
下载资源
问答
  • 我首先就去php.ini里修改了_memory_limit = 4000M ,够了吧,服务器是8G的物理内存,已用为2.8G,运行我程序的时候最多最多已用空间都没超过4GB,而且我特意从phpinfo里看到了memory__limit = 4000M,这能证明修改...
  • 虚拟机:资源全部隔离,cpu、内存、磁盘相互独立,一台宿主机中可以安装的虚拟机数量是一定的,有限的,移植性不强(文件很,拷贝传输困难)。 Docker:部分共享部分隔离,共享cpu,内存,磁盘甚至操作系统...

    1.docker是啥

    Docker 提供轻量的虚拟化,通过docker镜像能创建出多个容器,一个容器相当于一个虚拟机。可以把镜像快速部署到无数台服务器上。

    2.docker与虚拟机对比

    1. 虚拟机:资源全部隔离,cpu、内存、磁盘相互独立,一台宿主机中可以安装的虚拟机数量是一定的,有限的,移植性不强(文件很大,拷贝传输困难)。
    2. Docker:部分共享部分隔离,共享cpu,内存,磁盘甚至操作系统,极为轻量,如图所示:

    3.Docker五大要素

    1. 沙箱:隔离,将应用之间的必要资源隔离开,防止互相影响,应用之间互相独立。
    2. 镜像:模板,使用dockerfile制作镜像,通过镜像创建容器。
    3. 容器:镜像的实例,镜像只读,容器可写,容器中可以保存应用产生的零时文件
    4. 数据卷:挂载到容器上,用于保存必要数据。比如容器中数据库的数据,但是不建议用,因为重启容器需要挂载同步数据,效率较慢,解决方式:数据库拆分
    5. 仓库:与maven仓库概念一致,应用都会保存在仓库中,创建容器是根据镜像的规定进行拉取,可以共享。

    docker的仓库和镜像:

    阿里云

    网易云

    4.docker的版本及要求

    Docker分为docker-ce(社区版-开源)和docker-ee(企业级-收费)

    Docker基于linux3.8及以上版本64bit内核开发,所以在使用docker前需要确认linux内核版本,一般centos7以上。

    查看linux版本命令:

    uname -a

     

    5.docker安装

    如不想安装可以直接下载.

    https://download.csdn.net/download/weixin_42610529/11267286

    1.	卸载老版本的 docker 及其相关依赖
    sudo yum remove docker docker-common container-selinux docker-selinux docker-engine
    2.	安装 yum-utils,它提供了 yum-config-manager,可用来管理yum源
    sudo yum install -y yum-utils
    3.	添加yum源
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    4.	更新索引
    sudo yum makecache fast
    5.	安装 docker-ce
    sudo yum install docker-ce
    6.   验证docker是否安装好
         执行docker version 命令查看docker的版本。
    [root@localhost /]# docker version
        Client:
     Version:	17.12.1-ce
     API version:	1.35
     Go version:	go1.9.4
     Git commit:	7390fc6
     Built:	Tue Feb 27 22:15:20 2018
     OS/Arch:	linux/amd64
    
    Server:
     Engine:
      Version:	17.12.1-ce
      API version:	1.35 (minimum version 1.12)
      Go version:	go1.9.4
      Git commit:	7390fc6
      Built:	Tue Feb 27 22:17:54 2018
      OS/Arch:	linux/amd64
      Experimental:	false
    

     

    6.启动docker

    //查看docker状态
    systemctl status docker
    Active: inactive (dead)
    
    //启动docker
    systemctl start docker
    
    systemctl status docker
    
    //停止docker	
    service docker stop			
    
    //重启docker
    service docker restart	
    

    7.docker命令

     

    命令

    用法

     yum -y install docker-ce

    下载最新版的docker

    service docker start

    启动Docker服务

    service docker stop

    停止Docker服务

    service docker restart

    重新启动Docker服务

    docker version

    查看Docker的版本号

    docker pull 镜像地址:版本

    从镜像仓库中下载

    docker save a2a69ca5184a > jt-centOS6.tar

    根据镜像id导出镜像

    docker save -o redis-3.2.8.tar redis:3.2.8

    根据镜像名称导出镜像

    docker load -i docker-centos-6.5.tar

    指定jar包导入镜像文件

    docker rmi a2a69ca5184a

    根据Id号删除镜像文件

    docker rmi -f a2a69ca5184a

    强制删除镜像文件    删除镜像前需要先关闭容器

    docker images

    查询所有镜像文件

    docker inspect index.alauda.cn/tutum/centos:6.5

    查看镜像文件细节信息

    docker tag 旧镜像名称和端口 redis-ali:0.0.1

    修改镜像的名称

    docker build -t 镜像名称:版本号

    根据dockerfile来创建镜像文件

    docker run -d --name 容器名 镜像名:版本号

    根据镜像名称启动容器

    docker run -d --name 容器名(自定) 镜像id号

    根据镜像id启动容器

    docker run -d -p 虚拟机端口:镜像端口 --name 容器名 镜像名:版本号

    启动容器,并指定暴露端口

    docker ps

    查看活动的docker容器进程

    Docker ps -a/-all

    查看全部的容器

    docker exec -it 容器id bash

    进入指定的容器

    docker stop 容器Id号

    停止指定容器

    docker start 容器Id号

    启动创建好的容器

    docker stop $(docker ps -q) & docker rm $(docker ps -aq)

    关闭和删除所有的容器

    docker rm 容器Id

    删除指定的容器

    8.docker中安装redis

    将redis镜像上传到/usr/local/src/redis中然后执行下列命令:

    redis的镜像请自己下载

    https://download.csdn.net/download/weixin_42610529/11267332

    
    cd /usr/local/src/redis
    
    docker load -i redis-3.2.8.tar
    

    9.创建容器

    docker run -d --name redis7000 -p 7000:6379 redis:3.2.8
    参数说明:
    -d,则containter将会运行在后台模式(Detached mode)
    --name 实例名称
    -p 对外程序访问端口7000,宿主机映射的redis端口6379
    最后的redis为镜像的名称
    
    查看容器
    docker ps -a

    10.删除容器

    docker stop redis7000
    //容器状态是exit
    docker ps -a
    docker rm redis7000
    docker ps -a
    docker run -d --name redis7000 -p 7000:6379 redis:3.2.8
    docker stop redis7000
    docker start redis7000
    

     

    展开全文
  • 服务器运维的软硬件维护

    千次阅读 2018-11-19 20:48:39
    这要看网站打算做什么,每天访问量有多大。 然后可以测试环境用软件检测在自己的真实环境下的服务器压力,比如在2000人在线的情况下,服务器的CPU占用多少,内存占用多少。 那么咱们可以得到大致的配置,其实市面...

    为了保持服务器长时间的正常运行也要进行定期的维护,那么服务器要怎么维护呢?具体工作内容都有哪些呢?
    一、服务器性能日常检查具体内容:
    1、服务器电源状态检查;
    2、服务器风扇状态检查;
    3、服务器硬盘健康状态检查;
    4、服务器系统日志检查…
    查看更多 。
    二、硬件维护内容
    1、增加内存和硬盘容量的工作。这个是很常见的事情,企业发展不是一成不变的,但企业扩大了内存和硬盘容量就相对
    不够了,所以需要增加内存和硬盘容量。要注意对应好型号等问题,不是什么凑在一起就可以使用了的。
    2、拆服务器时注意阅读说明书,因为有些厂商的服务器机箱比较特殊,再来就是做好防尘的工作了,否则尘埃多了也会
    三、软件维护内容
    1、操作系统的维护
    常打开事件查看器,在各种日志中查看有没有存在什么异常现象。并检查软件需不需要更新及时补上,以免出现安全漏洞。
    2、网络服务的维护
    网络服务的维护有哪些呢?其中包括:WWW、DNS、DHCP、SMTP、FTP等。随着服务器提供的服务越来越多,系统也容易混
    乱、安全性也将降低,此时可能需要重新设定各个服务的参数,打开防火墙,使之安全而正常的运行。
    3、数据库服务
    数据库是重要的数据源,经过一定时期的运行使用后,需要调整数据库性能,使之进入最优化状态。还有就是定期做好
    数据库的备份,以防万一。
    4、用户数据
    随着使用时间的增加,服务器数据库中可能存放了大量的数据。这些数据相对来说应该都是非常宝贵的资源,所以需要加以整理,并刻成光盘永久保存起来,即使服务器有故障,也能很快恢复数据。

    展开全文
  • 一.原理 arena是LevelDB内部实现的内存池。 我们知道,对于一个高性能的服务器端程序来说,内存的使用非常重要。C++提供了new/delete来管理内存的申请和释放,...一旦碎片到达一定程度,即使剩余内存总量够用...

    一.原理

            arena是LevelDB内部实现的内存池。

            我们知道,对于一个高性能的服务器端程序来说,内存的使用非常重要。C++提供了new/delete来管理内存的申请和释放,但是对于小对象来说,直接使用new/delete代价比较大,要付出额外的空间和时间,性价比不高。另外,我们也要避免多次的申请和释放引起的内存碎片。一旦碎片到达一定程度,即使剩余内存总量够用,但由于缺乏足够的连续空闲空间,导致内存不够用的假象。
            C++ STL为了避免内存碎片,实现一个复杂的内存池,LevelDB中则没有那么复杂,只是实现了一个"一次性"内存池arena。在leveldb里面,并不是所有的地方都使用了这个内存池,主要是memtable使用,主要是用于临时存放用户的更新数据,由于更新的数据可能很小,所以这里使用内存池就很合适。

            为了避免小对象的频繁分配,需要减少对new的调用,最简单的做法就是申请大块的内存,多次分给客户。LevelDB用一个vector<char *>来保存所有的内存分配记录,默认每次申请4k的内存块,记录下当前内存块剩余指针和剩余内存字节数,每当有新的申请,如果当前剩余的字节能满足需要,则直接返回给用户。如果不能,对于超过1k的请求,直接new一个指定大小的内存块并返回,小于1K的请求,则申请一个新的4k内存块,从中分配一部分给用户。当内存池对象析构时,分配的内存均被释放,保证了内存不会泄漏。

    头文件

    class Arena {
     public:
      Arena();
      ~Arena();
     
      // Return a pointer to a newly allocated memory block of "bytes" bytes.
      // 分配bytes大小的内存块,返回指向该内存块的指针
      char* Allocate(size_t bytes);
     
      // Allocate memory with the normal alignment guarantees provided by malloc
      // 基于malloc的字节对齐内存分配
      char* AllocateAligned(size_t bytes);
     
      // Returns an estimate of the total memory usage of data allocated
      // by the arena (including space allocated but not yet used for user
      // allocations).
      // 返回整个内存池使用内存的总大小(不精确),这里只计算了已分配内存块的总大小和
      // 存储各个内存块指针所用的空间。并未计算alloc_ptr_和alloc_bytes_remaining_
      // 等数据成员的大小。
      size_t MemoryUsage() const {
        return blocks_memory_ + blocks_.capacity() * sizeof(char*);
      }
     
     private:
      char* AllocateFallback(size_t bytes);
      char* AllocateNewBlock(size_t block_bytes);
     
      // Allocation state
      // 当前内存块(block)偏移量指针,也就是未使用内存的首地址
      char* alloc_ptr_;
      // 表示当前内存块(block)中未使用的空间大小
      size_t alloc_bytes_remaining_;
     
      // Array of new[] allocated memory blocks
      // 用来存储每一次向系统请求分配的内存块的指针
      std::vector<char*> blocks_;
     
      // Bytes of memory in blocks allocated so far
      // 迄今为止分配的内存块的总大小
      size_t blocks_memory_;
     
      // No copying allowed
      Arena(const Arena&);
      void operator=(const Arena&);
    };

    源文件

     1 inline char* Arena::Allocate(size_t bytes) {
     2   // The semantics of what to return are a bit messy if we allow
     3   // 0-byte allocations, so we disallow them here (we don't need
     4   // them for our internal use).
     5   // 如果允许分配0字节的内存,那么返回值在语义上会比较难以理解,因此这里禁止bytes=0
     6   // 如果需求的内存小于当前内存块中剩余的内存,那么直接从当前内存快中获取
     7   assert(bytes > 0);
     8   if (bytes <= alloc_bytes_remaining_) {
     9     char* result = alloc_ptr_;
    10     alloc_ptr_ += bytes;
    11     alloc_bytes_remaining_ -= bytes;
    12     return result;
    13   }
    14   // 因为alloc_bytes_remaining_初始为0,因此第一次调用Allocate实际上直接调用的是AllocateFallback
    15   // 如果需求的内存大于内存块中剩余的内存,也会调用AllocateFallback
    16   return AllocateFallback(bytes);
    17 }
    18 char* Arena::AllocateFallback(size_t bytes) {
    19   // 如果需求的内存大于内存块中剩余的内存,而且大于1K,则给这内存单独分配一块bytes大小的内存。
    20   // 这样可以避免浪费过多的空间(因为如果bytes大于1K也从4K的内存块去取用,那么如果当前内存块中刚好剩余
    21   // 1K,只能再新建一个4K的内存块,并且取用bytes。此时新建的内存块是当前内存块,后续操作都是基于当前内
    22   // 存块的,那么原内存块中的1K空间就浪费了)
    23   if (bytes > kBlockSize / 4) {
    24     // Object is more than a quarter of our block size.  Allocate it separately
    25     // to avoid wasting too much space in leftover bytes.
    26     char* result = AllocateNewBlock(bytes);
    27     return result;
    28   }
    29   // 如果需求的内存大于内存块中剩余的内存,而且小于1K,则重新分配一个内存块,默认大小4K,
    30   // 原内存块中剩余的内存浪费掉(这样虽然也会浪费,但是浪费的空间小于1K)。并在新内存块
    31   // 中取用bytes大小的内存。
    32   // We waste the remaining space in the current block.
    33   alloc_ptr_ = AllocateNewBlock(kBlockSize);
    34   alloc_bytes_remaining_ = kBlockSize;
    35  
    36   char* result = alloc_ptr_;
    37   alloc_ptr_ += bytes;
    38   alloc_bytes_remaining_ -= bytes;
    39   return result;
    40 }
    41 // 提供了字节对齐内存分配,一般情况是4字节或8个字节对齐分配,
    42 // 对齐内存的好处简单的说就是加速内存访问。
    43 // 首先获取一个指针的大小const int align = sizeof(void*),
    44 // 很明显,在32位系统下是4 ,64位系统下是8 ,为了表述方便,我们假设是32位系统,即align = 4,
    45 // 然后将我们使用的char * 指针地址转换为一个无符号整型(reinterpret_cast<uintptr_t>(result):
    46 // It is an unsigned int that is guaranteed to be the same size as a pointer.),通过与操作来
    47 // 获取size_t current_mod = reinterpret_cast<uintptr_t>(alloc_ptr_) & (align-1);当前指针模4
    48 // 的值,有了这个值以后,我们就容易知道,还差 slop = align - current_mod多个字节,内存才是对齐的,
    49 // 所以有了result = alloc_ptr + slop。那么获取bytes大小的内存,实际上需要的大小为needed = bytes + slop。
    50 char* Arena::AllocateAligned(size_t bytes) {
    51   const int align = sizeof(void*);    // We'll align to pointer size
    52   assert((align & (align-1)) == 0);   // Pointer size should be a power of 2
    53   size_t current_mod = reinterpret_cast<uintptr_t>(alloc_ptr_) & (align-1);    //这里就判断出了当前指针地址和字节对齐整数倍所差的个数
    54   size_t slop = (current_mod == 0 ? 0 : align - current_mod);
    55   size_t needed = bytes + slop;
    56   char* result;
    57   if (needed <= alloc_bytes_remaining_) {
    58     result = alloc_ptr_ + slop;
    59     alloc_ptr_ += needed;
    60     alloc_bytes_remaining_ -= needed;
    61   } else {
    62     // AllocateFallback always returned aligned memory
    63     result = AllocateFallback(bytes);
    64   }
    65   assert((reinterpret_cast<uintptr_t>(result) & (align-1)) == 0);
    66   return result;
    67 }
    // 分配新的内存块
    char* Arena::AllocateNewBlock(size_t block_bytes) {
      char* result = new char[block_bytes];
      blocks_memory_ += block_bytes;
      blocks_.push_back(result);
      return result;
    }
    // 释放整个内存池所占内存
    Arena::~Arena() {
      for (size_t i = 0; i < blocks_.size(); i++) {
        delete[] blocks_[i];
      }
    }

     

    转载于:https://www.cnblogs.com/wangshaowei/p/9415868.html

    展开全文
  • Nginx在部署网站时,可以说是小伙伴们的首选,当然不能说全部项目都使用,对于一些小项目,直接IIS(.Net)、Tomcat(Java)等就搞定了,但对于项目或微服务架构,Nginx肯定是少不了啦,一张图看清Nginx有火: ...

    前言

    Nginx("engine x")是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。

    Nginx在部署网站时,可以说是小伙伴们的首选,当然不能说全部项目都使用,对于一些小项目,直接IIS(.Net)、Tomcat(Java)等就搞定了,但对于大项目或微服务架构,Nginx肯定是少不了啦,一张图看清Nginx有多火:

    图片

    Nginx之所以招人喜爱,那是它本身性能好,支持并发量大,内存消耗少,配置简单,提供功能给力,最重要是开源免费。接下来会挑重要的来说说,了解我的小伙伴都应该知道,我喜欢边实操,边说理论;走起来~~~

    正文

    关于安装我就不一步一步来演示啦,如果需要详细安装步骤,点这里,菜鸟教程很详细了,接下来就重点说说平时用得比较多的功能。

    以下演示是通过阿里云服务器演示,系统为Centos7,nginx版本为1.18.0。用到连接云服务器的工具为Xshell6,上传文件为Xftp 6.

    1. 配置文件解读

    Nginx和Redis一样,只需简单的文件配置,就能轻松实现吊炸天的功能,所以先来了解一下配置文件内容,不用太急着知道怎么用,接下来在功能实操的时候还会用到。

    nginx.conf文件是经常需要配置的,我这里安装完成之后,该配置文件的路径见下图:

    图片

    文件主要内容如下:

    #指定用户,可以不进行设置
    #user  nobody;
    #Nginx进程,一般设置为和CPU核数一样
    worker_processes  1;   
    #错误日志存放目录,可以根据后面的日志级别指定到不同目录
    error_log  /var/log/nginx/error.log info;
    #进程pid存放位置
    pid        /var/run/nginx.pid;
    
    events {
        # 单个后台进程的最大并发数
        worker_connections  1024; 
    }
    
    http {
        #文件扩展名与类型映射表,指定为当前目录下的 mime.types
        include       mime.types;
        #默认文件类型
        default_type  application/octet-stream;  
        #设置日志显示格式
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        #nginx访问日志存放位置
        access_log  /var/log/nginx/access.log  main;   
    
        #开启高效传输模式
        sendfile        on;   
        #tcp_nopush     on;    
        #保持连接的时间,也叫超时时间
        keepalive_timeout  65;  
        #开启gzip压缩
        #gzip  on;  
        #server的配置可以单独为一个子配置文件,避免单个配置文件过大
        server {
            #配置监听端口
            listen       80;  
            #配置域名
            server_name  localhost;  
            #charset koi8-r;     
            #access_log  /var/log/nginx/host.access.log  main;
            location / {
                #指定默认目录
                root   html;
                #默认访问页面
                index  index.html index.htm;    
            }
            # 指定http code 配置404页面
            #error_page  404              /404.html;   
    
            # redirect server error pages to the static page /50x.html
            #错误状态码的显示页面,配置后需要重启
            error_page   500 502 503 504  /50x.html;   
            location = /50x.html {
                root   html;
            }
       }
    } 
    

    在上面配置文件中,有几个点需要注意:

    • http配置块中可以配置多个server块,而每个server块就相当于一个虚拟主机(后续会说到);

    • 在server块中可以同时包含多个location块

    • 在http配置块中可以使用 include 目录/*.conf; 指定子配置文件的位置,然后自动加载配置内容进来,避免单文件配置过大。

    2. 常用命令

    这里演示没有配置环境变量,所以需要进入nginx的安装目录(/usr/local/nginx/sbin)中进行操作,进入可以执行以下命令:

    • 开启nginx

      ./nginx #启动
      
    • 停止nginx

      # 方式1
      ./nginx -s stop # 立即停止
      # 方式2
      ./nginx -s quit # 进程完成当前工作后在停止
      # 方式3
      killall nginx # 直接杀死进程
      
    • 重新加载配置文件

      ./nginx -s reload
      
    • 查看nginx的启动情况

      ps aux|grep nginx
      
    • 查看端口号占用情况

      netstat -tlnp # 查看整体端口占用情况
      netstat -tlnp|grep 端口号  # 查看指定端口的占用情况
      

    3. 常用功能实战

    3.1 反向代理

    经常有小伙伴要用google搜索资料,被无情的拒绝了,所以只能百度;如果非要用google进行搜索咋弄?翻墙(需要配置相关信息),其实本质是本机电脑借助代理服务器转到对应目标服务器(小伙伴机器和代理服务器在同一个LAN内),然后就可以间接获取到信息啦,这种形式就叫正向代理。如下图:

    图片

    反向代理与正向代理刚好相反,反向代理和目标服务器在同一个LAN内,小伙伴直接访问反向代理服务器地址,由反向代理将请求转发给目标服务服务器,然后将结果返回给小伙伴。如下图:

    图片

    案例演示:

    新建一个API项目,然后部署到云服务器上,通过nginx进行反向代理,隐藏项目的真实地址,为了运行API项目,这里需要安装.NetCore3.1的运行环境(不是开发就不用安装SDK啦);

    #第一步,注册 Microsoft 密钥和存储库。安装必需的依赖项。
    rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
    #第二步,安装 .NET Core3.1 运行时,不是开发环境,就不需要安装sdk
    yum install aspnetcore-runtime-3.1
    

    然后执行dotnet --version 命令,如果显示对应版本就可以继续部署程序啦;

    创建一个TestWebAPI项目,将编译之后的项目文件通过Xftp拷贝到云服务器上,然后将其启动,如下:

    运行之后,由于阿里云云服务器的安全组没有对外开放5000端口,所以外网是访问不了的,但可以在服务器内通过curl命令测试站点是否启动,如下:

    我这个服务器,80端口是对外开放的,可以访问到的,如下:

    所以现在我们通过nginx能访问的80端口,反向代理到我们内部开启的测试项目,即5000那个端口。nginx配置如下:

    图片

    重启nginx之后,就可以访问啦,如下:

    图片

    关键知识:

    • 在Server块中指定对外的端口和server_name(域名或IP);

    • 配置对应Server块中的location块;配置location可以进行正则匹配,语法如下:

      location [ = | ~ | ~* |^~] uri{
      
      } # 匹配的路径
      

      =:表示uri不包含正则表达式,要求请求字符串与uri严格匹配,只要匹配成功立即处理该请求,不在继续寻求匹配的规则;

      ~:用于表示uri中包含正则表达式,区分大小写;

      ~*:用于表示uri中包含正则表达式,不区分大小写;

      ^~:表示uri不包含正则表达式,找到请求字符串与uri匹配度最高的location后,然后立即处理请求。

      例:

      实操如下:

    • 在location中使用proxy_pass配置需要转发到的目标服务器地址;

    nginx反向代理好处:

    • 屏蔽目标服务器的真实地址,相对安全性较好;

    • nginx的性能好,便于配置负载均衡和动静分离功能,合理利用服务器资源。

    • 统一入口,当做负载均衡时,不管目标服务器怎么扩展部署,调用者只访问代理服务器入口即可。

    3.2 负载均衡

    系统的高可用是比较重要的,所以站点会通常以集群的方式进行部署, 但为了让请求均匀分配到各服务器上,则就要用到负载均衡策略啦,不管是软件的方式还是硬件的方式都可以实现(这里就不详细列举啦),大概模式如下图:

    图片

    案例演示

    案例采用一个nginx做为反向代理,并通过简单的配置实现负载均衡功能;由于设备有限,目标服务器采用端口不同的形式进行模拟,端口分别是5000和6000,然后在原来的项目中增加一个获取端口的接口,用于便于案例演示,代码如下:

    图片

    然后将编译完成之后的项目文件通过xFtp拷贝到云服务器上,然后用以不同端口的形式分别在不同终端启动,命令如下:

    图片

    另外打开一个终端,如上图一样启动项目,只是配置端口为5000打开,这样项目就启动了两个(集群),接下来就通过配置nginx来实现负载均衡的功能。如下图:

    图片

    nginx负载均衡策略

    如上演示,默认情况下,nginx的负载均衡策略为轮询,在实际应用场景中可以根据需要配置其他策略,如下:

    • 轮询:默认就是,指每个请求按照请求顺序逐一分配到不同到目标服务器,如果目标服务器有宕机的,还能自动剔除。

    • 权重(weight):通过配置权重来实现请求分配,目标服务器配置的权重越高,被分配的请求越多。

      # 其他不变,只是在每个目标服务器后面增加权重即可
      upstream testloadbalance {
            server 127.0.0.1:5000 weight=5;
            server 127.0.0.1:6000 weight=10;
        }
      

      按照上面配置重启nginx,多次请求测试,请求会更多的转发到6000上面。

    • ip_hash:每个请求有对应的ip,通过对ip进行hash计算,根据这个结果就能访问到指定的目标服务器;这种方式可以保证对应客户端固定访问到对应的目标服务器;

      # 其他不变,只是增加一个策略进行
      upstream testloadbalance {
            ip_hash; # 指定策略为通过ip进行hash之后转发
            server 127.0.0.1:5000;
            server 127.0.0.1:6000;
        }
      
    • fair:按目标服务器的响应时间来分配请求,响应时间短的优先被分配。

      关于这种模式需要额外安装nginx-upstream-fair,然后配置一下策略即可,安装就不具体演示,点击上面连接进入看说明;配置内容如下:

      # 其他不变,只是增加一个策略进行
      upstream testloadbalance {
            fair; # 指定策略为fair
            server 127.0.0.1:5000;
            server 127.0.0.1:6000;
        }
      

    负载均衡的功能的配置是不是很简单~~~,动动手感觉就是舒坦。

    3.3 动静分离

    前后端分离开发的模式最近几年是火的不行,在部署方面,为了提高系统性能和用户体验,也会将动静分离部署,即将静态资源(如html、js、css、图片等)单独部署一个站点,关于WebAPI获取和处理信息单独部署为一个站点。本质还是通过location匹配规则,将匹配的请求进行不同的处理即可。

    环境准备

    在nginx安装目录下创建一个static目录,用于存放相关静态资源:

    图片

    结构如下:

    图片

    动静分离配置

    图片

    重启nginx(或重新加载配置文件),然后访问看效果

    图片

    动静分离思想就是这样直观,小伙伴可以根据自己的需要,定义location的匹配规则即可。

    4. 其他功能

    除了以上常用的功能,可能还有一些小功能也会常用到哦,比如根据http状态码配置指定页面、访问权限控制、适配PC或移动端等,以下挑几个平时比较常用的演示一把,如下:

    • 根据状态码配置指定页面

      就拿平时常见的404举例,默认可能就是简单的页面提示,如下:

      图片

      但是对于很多企业都喜欢做自己个性化的页面,还有一些用来做公益广告等等;nginx配置很简单,如下:

      图片

      其他http状态码也可以通过上面的方式进行自定义页面展示。

    • 访问权限控制

      为了系统安全,会针对请求增加访问权限控制,比如使用黑白名单的方式来进行控制,将访问IP加入到白名单就可以访问,加入到黑名单就不可以访问啦,如下:

      图片

      上图是拒绝指定IP,如果是允许指定IP,可进行如下配置,如下:

      location /weatherforecast/ {
       proxy_pass http://testloadbalance;
       # 这个ip是百度输入ip查看到的,也可以通过nginx日志可以看
       allow 223.88.45.26; 
      }
      

      注:如果在同一location块中同时配置deny和allow,配置在最前面的会覆盖下面的,如下:

      location /weatherforecast/ {
        proxy_pass http://testloadbalance;
        # deny all 放在前面,就所有不能访问,deny all 会覆盖下面配置
        #deny all; 
        allow  223.88.45.26;
        # deny all 放在后面,被上面allow进行覆盖
        deny all; 
      }
      
    • 适配PC或移动端

      现在的移动端好多都是采用H5的形式进行开发,或者是混合模式,所以也需要针对移动端部署对应的站点,那用nginx如何自动适配PC还是移动端页面呢?

      准备环境

      在nginx安装目录中创建pcandmobile目录,如下:

      图片

      目录里面内容如下:

      图片

      两个index.html中的就只有一个h1标签,分别显示“PC端页面”和“移动端页面” 文字。

      nginx配置

      location / {
      root pcandmobile/pc; # 默认在pc目录中找页面
      # 当请求头中User-Agent中匹配如下内容时,就去mobile目录找页面
      if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry)') {
          root pcandmobile/mobile;
      }
      index index.html;
      }
      

      运行效果如下:

      图片

      本质就是判断请求头中User-Agent,只要匹配到移动端,就去找指定移动页面就行啦。

    总结

    nginx的常用功能就先说到这吧,分享的功能对于搞开发的小伙伴来说应该是随便够用了,如果需要深入,还得下下功夫;下次来说说如何配置nginx的高可用:主从模式、双主模式。

    展开全文
  • 常见类型有突发性能实例t5,共享基本型xn4,共享计算型n4,计算网络增强型sn1ne,通用网络增强型sn2ne等,同时这几款也是日常部分业务的常用机型,可以说你手里的业务使用这几款机型都够用了。 一、突发性能实例t5...
  • 基于网游服务器的场景,H2引擎考虑到单台物理机的处理能力当前克服单一服的需求,所以将H2的架构设计为部署在同机上,这样大大简化了服务器的架构,门的架构实际上预期rpg刚兴起的年代,那时候服务器内存有限,...
  • 常见类型有突发性能实例t5,共享基本型xn4,共享计算型n4,计算网络增强型sn1ne,通用网络增强型sn2ne等,同时这几款也是日常部分业务的常用机型,可以说你手里的业务使用这几款机型都够用了。 一、突发性能实例 ...
  • 使用以太网从服务器上拉取json字符串,接收之后进行解析,但是cjson的包在使用malloc和free的时候经常出现问题,在研究stm32的内存分配问题之后,网上很说是要自己写内存管理,但是实际使用会产生很问题,但是...
  • 一.原理  arena是LevelDB内部实现的内存池。  们都知道,对于一个高性能的服务器端程序来说,内存的使用非常重要。C++提供了new/delete来管理内存的申请和释放,但是...一旦碎片到达一定程度,即使剩余内存总量够用
  • 性能测试总结

    2021-03-22 10:05:46
    2)用户数量增加,系统负债增加,进行系统性能测试,知道系统承受的并发用户数量,带宽是否够用,cpu是否够用内存是否够用,硬盘速度是否跟得上。从服务端来看,测试服务器是否能承载用户并发,系统是否稳定,从...
  • 树莓派4B开发板入门

    千次阅读 2020-10-08 20:51:24
    树莓派4B即使是1G版本,整体性能也可达3B+的3倍以上,在内存够用情况下,内存对运算速度影响相对较小,因此可根据项目用途所需选择适当内存。 1GB 适用于无需图形用户界面,且不需要运行大量的应用程序的用户,如...
  • 目录 一、什么是swap? 二、为什么需要swap? 三、swap的缺点? ...四、到底要不要swap?...4.1.内存勉强够用 ...4.2.内存充裕 ...4.3.服务器环境 ...如果一定要设置,设置多大比较合适? swap space是...
  • MySQL分库分表方案

    千次阅读 2018-08-01 00:02:45
    读到的数据量太以至于撑爆内存,并且大多数读操作开始直击硬盘而不是从内存中读数据 库:database 表:table 分库分表:sharding 数据库架构演变: 开始单机数据库就够用了,后来随着业务增长,请求增多,开始...
  • 那个时候,更的去使用静态网页html,服务器根本没有太的压力。 思考一下这个时候整个网站的瓶颈是什么? 数据量太,一个机器放不下了 数据的索引,一个机器内存也放不下 访问量(读写混合),一个服务器承受...
  • 的使用静态的HTML~服务器根本没有压力,单机Mysql完全够用 这个情况下:网站的瓶颈: 1.数据量如果太,一个机器放不下了! 2.数据的索引 单表数据超过300万就要建立索引 (B+Tree),一个机器内存也存不下了 3...
  • 2.服务器配置应该如何权衡,nameNode是不是得高CPU、高内存,dataNode是不是得高内存1万转的硬盘是否够用。 3.20T的需求需要陪物理硬盘多大容量,nameNode是否需要做热备? 4.nameNode与dataNode需要不需要做Raid,...
  • 学大数据的电脑配置主要在内存方面,至少8G,上不封顶,一般16G够用。当然这只是学习层面,自己搭虚拟机玩玩。工作中,公司自然会给你分配服务器让你工作。 2. 有哪些方向? 数据开发、数据分析、数据挖掘。其中每...
  • 学大数据的电脑配置主要在内存方面,至少8G,上不封顶,一般16G够用。当然这只是学习层面,自己搭虚拟机玩玩。工作中,公司自然会给你分配服务器让你工作。 2. 有哪些方向? 数据开发、数据分析、数据挖掘。其中...
  • R/python进行数据分析过程中,需要刻意用到缓存的场景倒不是很,一般的公共区域变量全局访问就够用了。但在一些的项目中,譬如我写了一个提供 动态生成models,计算统计指标,画图等APIs 的R服务器,这时候缓存...
  • 一般情况下应该够用,但个别机器由于安装了个数据库,C盘空间越来越小,虚拟内存都改到了其它盘,但不到2G的剩余空间经常被报警。同时由于空间不足报警后,系统自动压缩闲置文件,造成恶性循环。经常重启机器、...
  • 主板与CPU的搭配

    2014-01-17 20:22:42
    装机需要多大内存呢?下面介绍一个定量测量你的电脑需要多少内存的方法,以保证你爱机的内存达到够用好用的标准,而且不产生不必要的浪费。 前言:在动手写这东西前觉得这还不容易,在网上找点凑凑就行了。实际动...
  • 服务器提供所有日线、30天5分钟k线,5天1分钟k线,绝多数用户是够用的。对于需要长时间的历史数据,请从网上搜集整理。 ⑨钩选“自动补”,表示您一天中第一次翻到哪一支股票即可自动补足缺少的数据。对于分笔...
  • 一文带你搞懂API网关

    2020-12-28 06:45:32
    部分场景下其实简单计数已经够用了,但如果需要支持突发流量等场景时,可以采用令牌桶等方案。还需要考虑根据什么限流,比如是IP、接口、用户维度、还是请求参数中的某些值,这里可以采用...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

服务器内存多大够用