一、nginx概述:
1.Nginx简介:
Nginx是一个高性能的HTTP和反向代理服务器。是一款轻量级的高性能的web服务器/反向代理服务器/电子邮件(IMAP/POP3)代理服务器,单台物理服务器可支持30 000~50 000个并发请求。
2.基础特性:
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
-
event-driven,aio,mmap,sendfile
Apache:
Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适用于多处理器环境,因此,在一个apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。
3、Nginx和Apache最核心的区别:
- nginx并发性比较好, CPU占用内存低,如果rewrite频繁,选用apache最佳。
- Nginx处理静态文件好, 耗费内存少,只适合静态和反向。
- apache是同步多进程模型,一个连接对应一个进程,nginx是异步的,多个连接可以对应一个进程。
- Apache在处理动态有优势。
二、I/O模型:
1.分类:
- 磁盘I/O 磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源比如是html 文件或者图片,然后内核通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成之后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间
- 网络I/O : 一切皆文件,本质为对socket文件的读写 网络通信就是网络协议栈到用户空间进程的IO就是网络IO
I/O就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。
2.网络I/O的过程:
- 当用户发起 http 请求需要请求一个index.htm网页文件
- 客户端请求与服务器端 建立连接,建立连接后,会发送请求报文
- 服务端的网卡收到请求报文, 会将该报文复制到 内核空间, 内核空间分析报文后交给对应的程序
- nginx分析该报文,将报文和自己的配置文件比对,按照配置文件完成请求,分析后发现客户需要 index.htm
- 由于 程序的权限问题,没有资格直接调用磁盘上的文件,
- 程序会再将这个请求 再次转发给内核
- 内核得到后请求 去磁盘上找文件找到文件后 复制给程序
- 程序会构建响应报文构建好后在交给内核空间
- 内核空间 得到响应报文后,再交给网卡发给客户
3.I/O模型的相关概念:
3.1 同步/异步(消息反馈机制):
关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。
-
同步:synchronous,被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成
-
异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态
3.2 阻塞/非阻塞:
关注调用者在等待结果返回之前所处的状态
-
阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。
-
非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。
三、nginx支持的事件驱动模型:
1、select:
select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型。
2、poll:
在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编译nginx的时候可以使用--with-poll_module和--without-poll_module这两个指定是否编译select
库。
3、epoll:
epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型
它和select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.
epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。
四、nginx模块:
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
五、编译安装nginx:
yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel
#安装依赖包
useradd -M -s /sbin/nologin nginx
#新建nginx用户便于管理
cd /data
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#官网下载安装包
tar xf nginx-1.18.0.tar.gz #解压
cd nginx-1.18.0/
./configure --prefix=/apps/nginx \ --prefix=的路径可自定义,注意编写.service时路径要对应
--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
make -j2 && make install #编译安装
chown -R nginx.nginx /apps/nginx
#修改权限
vim /usr/lib/systemd/system/nginx.service
#编写service文件,添加到system服务中,便于管理
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
#重新加载配置
systemctl enable --now nginx
#开机自启并立即启动 如果卡主是应为logs下有 nginx.pid 文件 删除即可
chown -R nginx.nginx /apps/nginx
#修改权限
五、信号使用:
nginx -v #查看nginx版本
nginx -V #查看更详细的信息和安装时的配置选项
nginx -t #检测配置文件
nginx -g #指定配置 不已配置文件中的为准
nginx -s #发送信号
nginx -h #查看帮助
5.1 查看详细信息:
5.2 发送信号:
kill -l 可以查看所有信号
kill SIGQUIT 优雅的关闭:有人在访问不会结束进程
SIGUSR1 重新分割日志
SIGUSR2 运行中升级
SIGWINCH 优雅的关闭worker进程,work进程负责处理请求,还有请求不会关闭
nginx -s 信号
nginx信号:
stop SIGTERM 直接停止
quit SIGQUIT 优雅的退出:有人在访问不会结束进程
reopen SIGUSR1 分割日志
reload SIGHUP 重新加载配置文件
5.2.1 分割日志:
cd /apps/nginx/logs/
mv access.log access.log.bak
touch access.log
nginx -s Reopen #发送信号
5.3平滑升级:
1.前提准备:
systemctl stop firewalld
setenforce 0
systemctl start nginx
2.开启两核:
vim /apps/nginx/conf/nginx.conf
worker_processes 2; #开启两核
nginx -s reload #刷新配置文件
3.下载编译新版本:
wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/
#下载安装包
cd /usr/local/src/
tar xf nginx-1.20.2.tar.gz
cd nginx-1.20.2/
nginx -V #查看老版本编译时选择的配置
./configure ...... #.....从查看中复制
make #编译 注意千万不要make install
4.移动新版本位置:
cd objs
mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
cp objs/nginx /apps/nginx/sbin/
cd /apps/nginx/sbin/
nginx -t #检查语法
5. 发送平滑升级信号:
kill -USR2 `cat /apps/nginx/logs/nginx.pid`
#也可以直接查看pid号,手输 nginx.pid默认是在logs下
6.优雅关闭老版本:
kill -WINCH `cat /apps/nginx/nginx.pid.oldbin`
此时当老用户关闭时,老进程就会关闭
六、配置详解:
1.全局配置:
1.1 关闭,修改版本名:
关闭:
vim /apps/nginx/conf/nginx.conf
server_tokens off; #添加到http模块中
nginx -s reload #刷新配置文件
修改:
需要重新编译安装
vim /data/nginx-1.18.0/src/core/nginx.h #更改安装包配置
#define NGINX_VERSION "1.18.0"
#define NGINX_VER "nginx/" NGINX_VERSION #自定义
49行 static u_char ngx_http_server_string[] = "Server: nginx" CRLF;
#自定义
重新编译安装
./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
make && make install
1.2 修改启动的进程数:
通常情况下,worker_processes
可以设置成 CPU 核心数的两倍
vim /apps/nginx/conf/nginx.conf
worker_processes 1;
#允许的启动工作进程数数量,和你真实的cpu数量有关 1
worker_processes auto;
#如果设置为auto 就是你真实的cpu数量
ps axo pid,cmd,psr,ni|grep nginx
#可以看到 nginx的 worker数量
1.3 cpu与worker进程绑定:
将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不会运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
worker_cpu_affinity 01 10;
ps axo pid,cmd,psr,ni|grep -v grep |grep nginx|sort -n
##可以查看cpu和进程的绑定
1.4 nginx优先级(worker):
worker_priority -20;
nginx -s reload #刷新
1.5 调试work进程打开的文件的个数:
#nginx.conf文件全局模块添加:
worker_rlimit_nofile 65536;
#更改机器单个进程能打开的文件:
vim /etc/security/limits.conf
* soft core unlimited
* hard core unlimited
* soft nproc 1000000
* hard nproc 1000000
* soft nofile 1000000
* hard nofile 1000000
* soft memlock 32000
* hard memlock 32000
* soft msgqueue 8192000
* hard msgqueue 8192000
reboot #重启生效
#更改完可以使用:
ulimit -a #显示当前用户的进程资源限制
1.6 服务的前后台运行:
容器中会用到,默认是后台
daemon off;