zoukankan      html  css  js  c++  java
  • linux C++ 通讯架构(一)nginx安装、目录、进程模型

    nginx是C语言开发的,号称并发处理百万级别的TCP连接,稳定,热部署(运行时升级),高度模块化设计,可以用C++开发。

    一、安装和目录

    1.1 前提

    epoll,linux内核版本为2.6或以上

    gcc编译器,g++编译器

    pcre库:函数库,支持解析正则表达式

    zlib库:压缩解压功能

    openssl库:ssl功能相关库,用于网站加密通讯

    1.2 源码下载及目录结构简单认识

     auto/:编译相关的脚本,可执行文件configure会用到这些脚本

     cc/:检查编译器的脚本

     lib/:检查依赖库的脚本

     os/:检查操作系统类型的脚本

     type/:检查平台类型的脚本

    CHANGES:修复的bug,新增功能说明

    CHANGES.ru:俄语版CHANGES

    conf/:默认的配置文件

    configure:编译ngnix之前必须先执行脚本以生成一些必要的中间文件

    contrib/:脚本和工具,典型的是vim高亮工具

    html/:欢迎界面和错误界面相关的文件

    man/:帮助文件目录

    src/:源代码目录

    •  core:核心代码
    •  event:event(事件)模块相关代码
    •  http:http(web服务)模块相关代码
    •  mail:邮件模块相关代码
    •  os:操作系统相关代码
    •  stream:流处理相关代码

    1.3 nginx的编译安装

    编译的第一步:用configure来进行编译之前的配置工作

    下面的命令将会进行默认配置

    [root@JD nginx-1.16.1]# ./configure

    configure的help命令可以查看configure的选项

    • --prefix:指定最终安装到的目录,默认值 /usr/local/nginx
    • --sbin-path:用来指定可执行文件目录,默认的是 sbin/nginx
    • --conf-path:用来指定配置文件目录,默认的是 conf/nginx.conf
    • --with开头的是默认不会编译到nginx的,可以用该命令包含进去
    • --without则是默认编译进了nginx中的

    执行完后,会多出来objs目录

    •  ngx_modules.c会决定哪些模块会真正被编译到可执行文件中
    •  Makefile:执行了configure脚本产生的编译规则文件,执行make命令时用到

    用make编译

    [root@JD nginx-1.16.1]# make

    ogjs目录中多处了nginx文件

    这是nginx的可执行文件

    用make命令进行安装

    [root@JD nginx-1.16.1]# make install

    1.4 启动和简单使用

    [root@JD nginx-1.16.1]# whereis nginx
    nginx: /usr/local/nginx

    进入上面目录的sbin目录

    [root@JD nginx-1.16.1]# cd /usr/local/nginx
    [root@JD nginx]# ll
    total 0
    drwx------ 2 nobody root   6 Nov 28 13:00 client_body_temp
    drwxr-xr-x 2 root   root 333 Nov 28 12:56 conf
    drwx------ 2 nobody root   6 Nov 28 13:00 fastcgi_temp
    drwxr-xr-x 2 root   root  40 Nov 28 12:56 html
    drwxr-xr-x 2 root   root  58 Nov 28 13:00 logs
    drwx------ 2 nobody root   6 Nov 28 13:00 proxy_temp
    drwxr-xr-x 2 root   root  19 Nov 28 12:56 sbin
    drwx------ 2 nobody root   6 Nov 28 13:00 scgi_temp
    drwx------ 2 nobody root   6 Nov 28 13:00 uwsgi_temp
    [root@JD nginx]# cd sbin

    启动

    [root@JD sbin]# ./nginx

    启动后访问服务器IP地址,网页显示:

    上面的内容正是html目录下index.html文件

    二、进程模型

    nginx启动后查看进程

    [root@JD sbin]# ps -ef | grep nginx
    root      5789 10021  0 11:57 pts/0    00:00:00 grep --color=auto nginx
    root     24193     1  0 Nov28 ?        00:00:00 nginx: master process ./nginx
    nobody   24194 24193  0 Nov28 ?        00:00:01 nginx: worker process

    两个进程,master进程属于root,worker进程属于nobody,两个进程是父子关系

    上面的第三列是父进程ID,可以看到worker进程是被master进程通过fork()创造出来的

    进程模型

    通过一个master进程,一到多个worker进程这种工作机制对外服务的,这种工作机制保证了nginx稳定灵活运行

    master进程是监控进程,不处理具体业务,专门用来管理worker进程

    worker进程是用来对用户提供服务的

    master进程和worker进程之间通讯,可以用信号,也可以用共享内存

    worker进程一旦挂掉,那么master进程会立即fork()一个新的worker进程投入工作中去

    调整worker进程数量

    worker进程几个合适?多核计算机,让每个worker运行在一个单独的内核上,最大限度减少CPU进程切换成本,提高系统性能

    查看processor数量

    [root@JD sbin]# grep -c processor /proc/cpuinfo
    2

    即是两核的,我们所说的多少核实际是有多少processor,一般是多少逻辑核

    基础概念

    CPU(Central Processing Unit):中央处理单元,CPU != 物理核,更 != 逻辑核。
    物理核(physical core/processor):可以看的到的,真实的cpu核,有独立的电路元件以及L1,L2缓存,可以独立地执行指令。
    逻辑核(logical core/processor):在同一个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24帧/s连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个cpu在运算)。
    超线程(Hyper-threading, HT):超线程可以在一个逻辑核等待指令执行的间隔(等待从cache或内存中获取下一条指令),把时间片分配到另一个逻辑核。高速在这两个逻辑核之间切换,让应用程序感知不到这个间隔,误认为自己是独占了一个核。
    关系:一个CPU可以有多个物理核。如果开启了超线程,一个物理核可以分成n个逻辑核,n为超线程的数量。

    Linux查看cpu信息

    cat /proc/cpuinfo

    ...
    processor   : 23                // 逻辑核编号
    cpu MHz         : 2299.863     // CPU主频
    cache size      : 15360 KB     // L2 cache大小
    physical id : 1                 // CPU编号
    siblings    : 12                   // 一颗CPU中有多少逻辑核
    core id     : 5                 // CPU的物理核编号
    cpu cores   : 6                 // 一颗CPU中有多少物理核
    ...

    针对于上边的这个服务器,我们说,它有2颗CPU,每颗CPU中有6个物理核,CPU开启了超线程,每颗CPU中有12个逻辑核。所以,这台服务器共有12个物理核,24个逻辑核。我们通常意义上说的24核,是指逻辑核是24个。

    作者:rockops
    链接:https://www.jianshu.com/p/4233b080048c
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    修改nginx的worker数量

    [root@JD nginx]# cd conf
    [root@JD conf]# pwd
    /usr/local/nginx/conf
    [root@JD conf]# ll
    total 68
    -rw-r--r-- 1 root root 1077 Nov 28 12:56 fastcgi.conf
    -rw-r--r-- 1 root root 1077 Nov 28 12:56 fastcgi.conf.default
    -rw-r--r-- 1 root root 1007 Nov 28 12:56 fastcgi_params
    -rw-r--r-- 1 root root 1007 Nov 28 12:56 fastcgi_params.default
    -rw-r--r-- 1 root root 2837 Nov 28 12:56 koi-utf
    -rw-r--r-- 1 root root 2223 Nov 28 12:56 koi-win
    -rw-r--r-- 1 root root 5231 Nov 28 12:56 mime.types
    -rw-r--r-- 1 root root 5231 Nov 28 12:56 mime.types.default
    -rw-r--r-- 1 root root 2656 Nov 28 12:56 nginx.conf
    -rw-r--r-- 1 root root 2656 Nov 28 12:56 nginx.conf.default
    -rw-r--r-- 1 root root  636 Nov 28 12:56 scgi_params
    -rw-r--r-- 1 root root  636 Nov 28 12:56 scgi_params.default
    -rw-r--r-- 1 root root  664 Nov 28 12:56 uwsgi_params
    -rw-r--r-- 1 root root  664 Nov 28 12:56 uwsgi_params.default
    -rw-r--r-- 1 root root 3610 Nov 28 12:56 win-utf
    [root@JD conf]# vi nginx.conf

    把默认的1改为processor的数量

     重新启动

    [root@JD sbin]# ./nginx -s stop
    [root@JD sbin]# ./nginx
    [root@JD sbin]#  ps -ef | grep -v grep | grep nginx
    root     21580     1  0 12:29 ?        00:00:00 nginx: master process ./nginx
    nobody   21581 21580  0 12:29 ?        00:00:00 nginx: worker process
    nobody   21582 21580  0 12:29 ?        00:00:00 nginx: worker process

    已经有两个 worker 进程了

    nginx重载配置文件

    查看帮助命令

    [root@JD sbin]# ./nginx -?
    nginx version: nginx/1.16.1
    Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]
    
    Options:
      -?,-h         : this help
      -v            : show version and exit
      -V            : show version and configure options then exit
      -t            : test configuration and exit
      -T            : test configuration, dump it and exit
      -q            : suppress non-error messages during configuration testing
      -s signal     : send signal to a master process: stop, quit, reopen, reload
      -p prefix     : set prefix path (default: /usr/local/nginx/)
      -c filename   : set configuration file (default: conf/nginx.conf)
      -g directives : set global directives out of configuration file

    重载配置文件

    修改配置文件后可重载

    [root@JD sbin]# ./nginx -s reload

    nginx 可以热升级,热回滚

  • 相关阅读:
    RecyclerView 数据刷新的几种方式 局部刷新 notify MD
    【图片】批量获取几万张图片
    RV BaseRecyclerViewAdapterHelper 总结 MD
    RecyclerView.ItemDecoration 间隔线
    Kotlin【简介】Android开发 配置 扩展
    Kotlin 特性 语法糖 优势 扩展 高阶 MD
    一个十分简洁实用的MD风格的UI主框架
    折叠伸缩工具栏 CollapsingToolbarLayout
    FloatingActionButton FAB 悬浮按钮
    Glide Picasso Fresco UIL 图片框架 缓存 MD
  • 原文地址:https://www.cnblogs.com/aidata/p/12090883.html
Copyright © 2011-2022 走看看