1、对常用I/O模型进行比较说明
补充:
1.I/O模型的相关概念:
同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
(1)同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成。
(2)异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。
阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态。
(3)阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
(4)非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
2.网络I/O模型:阻塞型、非阻塞型、复用型、信号驱动型、异步
常用模型的对比:
总结:
1、epoll只是一组API,比起select这种扫描全部的文件描述符,epoll只读取就绪的文件描述符,再加入基于事件的就绪通知机制,所以性能比较好
2、基于epoll的事件多路复用减少了进程间切换的次数,使得操作系统少做了相对于用户任务来说的无用功。
3、epoll比select等多路复用方式来说,减少了遍历循环及内存拷贝的工作量,因为活跃连接只占总并发连接的很小一部分。
2、nginx中的模块分类及常见核心模块有哪些
Nginx的模块分类:
1.核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能。
2.HTTP模块:
1)标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP应头设置 等等
2)可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
3.邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
4.stream服务模块:: 实现反向代理功能,包括TCP协议代理
5.第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
常见核心模块:
1.user #指定要使用的连接处理.通常不需要显式指定它,因为nginx默认情况下将使用最有效的方法。
Syntax: user user [group];
Default:
user nobody nobody;
Context: main
注:工作进程使用的定义和凭据。如果省略,则使用名称等于 的组。usergroupgroupuser
2.pid #定义将存储主进程的进程 ID 的 。file
Syntax: pid file;
Default: pid logs/nginx.pid;
Context: main
3.include #将另一个或与指定文件匹配的文件包括在配置中。包含的文件应包含语法正确的指令和块。filemask
Syntax: include file | mask;
Default: —
Context: any
注:指明被包含的其他的配置文件
4.events #提供配置文件上下文,其中指定了影响连接处理的指令,即事件驱动相关设置。
Syntax: events { ... }
Default: —
Context: main
events { #事件驱动相关配置
use epoll; #指明并发连接请求的处理方式
worker_connections 2048; #每个worker进程能够打开的最大并发连接数
#accpet mutex on | off;
#处理新连接的方式,on意味着由每个worker轮流处理新请求,off意味着每个新请求到达都会通知所有worker进程
}
5.error_log #定义配置错误日志路径和日志文件名
Syntax: error_log file [level];
Default:
error_log logs/error.log error;
Context: main, , , , , httpmailstreamserverlocation
6.daemon #确定 nginx 是否应成为守护进程。主要在开发过程中使用。
Syntax: daemon on | off;
Default: daemon on;
Context: main
7.master_process #确定是否启动工作(master-worker)进程。此指令适用于nginx开发人员
Syntax: master_process on | off;
Default: master_process on;
Context: main
8.worker_priority #定义工作进程的计划优先级,就像命令完成一样:负表示优先级更高。允许的范围通常从 -20 到 20 不等。nicenumber
Syntax: worker_priority number;
Default: worker_priority 0;
Context: main
3、描述nginx中worker_processes、worker_cpu_affinity、worker_rlimit_nofile、worker_connections配置项的含义
1.worker_processes [number | auto] #定义工作(worker)进程的数量。应该小于等于cpu的核数、auto为当前主机cpu的核数。
Syntax: worker_processes number | auto;
Default: worker_processes 1;
Context: main
2.worker_cpu_affinity
#将工作进程绑定到 CPU 集。每个 CPU 集都由允许的 CPU 的掩码表示。应该为每个工作进程定义一个单独的集合。默认情况下,工作进程不绑定到任何特定的 CPU。
即:worker进程和通过cpumask通过绑定至指定的cpu。
目的:减少cpu 的来回切换
Syntax: worker_cpu_affinity cpumask ...;
worker_cpu_affinity auto [cpumask];
Default: —
Context: main
例:
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
同时将每个工作进程绑定到单独的 CPU
worker_processes 2;
worker_cpu_affinity 0101 1010;
binds the first worker process to CPU0/CPU2, and the second worker process to CPU1/CPU3.
3.worker_rlimit_nofile #指定worker进程能够打开的最大文件数。用于在不重新启动主进程的情况下增加限制
Syntax: worker_rlimit_nofile number;
Default: —
Context: main
4.worker_connections #设置工作进程可以同时打开的最大连接数。
Syntax: worker_connections number;
Default: worker_connections 512;
Context: events
注:这个数字包括所有连接(例如,与代理服务器的连接等),而不仅仅是与客户端的连接。另一个注意事项是,同时连接的实际数量不能超过打开文件最大数量的当前限制,可以通过worker_rlimit_nofile进行更改。
4、编译安装nginx,实现多域名 https"
编译安装nginx:
yum -y install gcc pcre-devel openssl-devel zlib-devel
useradd -s /sbin/nologin nginx
[root@centos8 ~]#cd /usr/local/src/
[root@centos8 src]#wget http://nginx.org/download/nginx-1.18.0.tar.gz
[root@centos8 src]#tar xf nginx-1.18.0.tar.gz
[root@centos8 src]#cd nginx-1.18.0/
[root@centos8 nginx-1.18.0]#./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module
[root@centos8 nginx-1.18.0]#make && make install
[root@centos8 nginx-1.18.0]#chown -R nginx.nginx /apps/nginx
[root@centos8 nginx-1.18.0]#ls /apps/nginx/sbin/
nginx
[root@centos8 nginx-1.18.0]#ln -s /apps/nginx/sbin/nginx /usr/sbin/
[root@centos8 ~]#nginx -v
nginx version: nginx/1.18.0
[root@centos8 ~]#nginx -V
nginx version: nginx/1.18.0
built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC)
built with OpenSSL 1.1.1c FIPS 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/apps/nginx --user=nginx --group=nginx --withhttp_ssl_module --with-http_v2_module --with-http_realip_module --withhttp_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream
--with-stream_ssl_module --with-stream_realip_module
单域名(www.apc.org):(多域名重复该步骤:在加一个域名(www.mobile.org))。
证书:(证书的具体生成步骤:略)
#生成相对应的证书文件
[17:36:17 root@CS8-VM8-10 ssl][#ll
total 32
-rw-r--r-- 1 root root 1078 Aug 2 16:41 apc.org.crt
-rw-r--r-- 1 root root 980 Aug 2 16:41 apc.org.csr
-rw-r--r-- 1 root root 1155 Aug 2 16:41 ca.crt
-rw------- 1 root root 1704 Aug 2 16:41 ca.key
-rw-r--r-- 1 root root 752 Aug 2 16:41 certificate.sh
-rw-r--r-- 1 root root 764 Aug 2 17:04 mobile_certificate.sh
-rw-r--r-- 1 root root 2233 Aug 2 16:42 www.apc.org.crt
-rw------- 1 root root 1704 Aug 2 16:41 www.apc.org.key
[17:36:18 root@CS8-VM8-10 ssl][#pwd
/apps/nginx/conf.d/ssl
[17:36:26 root@CS8-VM8-10 ssl][#
[17:13:06 root@CS8-VM8-10 conf.d][#vim apc.conf
1 server {
2 listen 80;
3 listen 443 ssl;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件(两者合并为:www.apc.org.crt)
4 ssl_certificate /apps/nginx/conf.d/ssl/www.apc.org.crt;
#当前虚拟主机使用的私钥文件,一般是key文件
5 ssl_certificate_key /apps/nginx/conf.d/ssl/www.apc.org.key;
#配置ssl缓存
6 ssl_session_cache shared:sslcache:20m;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m
7 ssl_session_timeout 10m;
8
9
10
11 server_name www.apc.org;