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 可以热升级,热回滚

  • 相关阅读:
    JAVA核心技术I---JAVA基础知识(集合set)
    JAVA核心技术I---JAVA基础知识(列表List)
    JAVA核心技术I---JAVA基础知识(数据结构基础)
    JAVA核心技术I---JAVA基础知识(异常处理类)
    JAVA核心技术I---JAVA基础知识(格式化相关类)
    JAVA核心技术I---JAVA基础知识(时间类)
    JAVA核心技术I---JAVA基础知识(数字相关类)
    父类指针的步长和子类指针的步长问题
    斐波那契数列——腾讯面试题台阶问题
    c++多态之——vptr指针
  • 原文地址:https://www.cnblogs.com/aidata/p/12090883.html
Copyright © 2011-2022 走看看