目录
何为nginx
Nginx 功能介绍
基础特性
nginx架构
Nginx 进程结构
nginx 模块
模块分类
使用方式
编译安装nginx
第一步:获取安装包
第二步:安装依赖
第三步:创建用户nginx
第四步:解压安装包
第五步:编译安装
最后一步:修改nginx目录的所属
额外一步:添加软连接(为了可以补全命令和快速启动)
nginx开机自启
平滑升级及信号的使用
平滑升级
第零步:准备操作
编辑
第一步:备份旧版本,安装新版本
第二步:完成新版本安装
第三步:优雅关闭
第四步:升级 level up
回滚
信号
编辑
常用的信号
查看版本信息
常用发送信号
分割日志
检查语法格式
nginx的配置文件
全局配置
模块
关闭版本和修改版本信息
修改进程数
进程与内核绑定
worker优先级
设置worker打开的文件的上限
何为nginx
Nginx是一款轻量级的 web服务器、反向代理服务器 及 mail代理服务器。其特点是占有内存少,并发能力强
Nginx 功能介绍
-
静态的web资源服务器html,图片,js,css,txt等静态资源
-
http/https协议的反向代理 7层协议
-
结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
-
tcp/udp协议的请求转发(反向代理) 4层协议
基础特性
-
模块化设计,较好的扩展性
-
高可靠性
-
支持热部署:不停机更新配置文件,升级版本,更换日志文件
-
低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
-
event-driven,aio,mmap,sendfile
nginx架构
Nginx 进程结构
nginx 进程分为 master(主进程),worker(子进程)
nginx 模块
模块分类
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
使用方式
在编译安装第一步的时候使用 ./configure --help 可以查看支持的模块
./configure --help
# 查看帮助,里面会带有可用的模块
# 提示:要在nginx的安装包中使用该命令才有用
编译安装nginx
nginx不选择yum(rpm)安装的原因
- rpm会导致系统原有的库文件被破坏,导致新的软件包无法正常安装,存在着依赖关系;源码编译安装nginx快速,安全。
- 版本控制不行,规模部署,rpm的方式搞不定,没有统一的基础设施规范;源码编译nginx具有统一的基础设施规范。
所以我们选择编译安装nginx
第一步:获取安装包
nginx的安装可以自己去其官网下载 nginx: download
也可以使用命令:
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 从 nginx 的官网下载 nginx 1.18.0 的安装包
第二步:安装依赖
一个软件的运行需要一个或者多个依赖
yum -y install gcc pcre-devel openssl-devel \
zlib-devel openssl openssl-devel
# 使用 yum install 安装 nginx 运行所需要的依赖
第三步:创建用户nginx
服务器使用该服务时多多少少会有漏洞,为了安全起见,创建用户 nginx ,将漏洞可能引发的问题限制在较小的范围内
useradd -M -s /sbin/nologin nginx
# 新建程序用户 nginx
第四步:解压安装包
tar xf nginx-1.18.0.tar.gz
# 解压 nginx 安装包
第五步:编译安装
cd /data/nginx-1.18.0/
# 进入安装包
mkdir /apps/nginx -p
# 创建目录(后续nginx的安装目录)
./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 -j2 && make install
# 用两核编译,并开始安装
最后一步:修改nginx目录的所属
chown -R nginx.nginx /apps/nginx
# 修改权限,完全控制文件夹的权限
额外一步:添加软连接(为了可以补全命令和快速启动)
将nginx的启动项放到/usr/sbin/
ln -s /apps/nginx/sbin/nginx /usr/sbin
# 添加软连接
nginx开机自启
vim /usr/lib/systemd/system/nginx.service
# 编辑 nginx自启 文本
[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
# 该文件中有很多的路径要根据你自己的 nginx 实际安装位置来修改
# 请勿盲目复制
平滑升级及信号的使用
平滑升级:在进程不被关闭的情况下完成新版本的安装,并优雅退出就旧的子进程
信号的使用:以nginx为命令
平滑升级
步骤:
第零步:准备操作
systemctl status nginx
# 先查看 nginx 程序是否启动
systemctl start nginx
# 若没启动
vim /apps/nginx/conf/nginx.conf
# 然后进入 nginx 配置文件
#user nobody;
worker_processes 1;
# 将 worker_processes 1;改为worker_processes 2;
# 将 worker 进程数从1修改为2(即将其从1核变为2核)
nginx -s reload
# 重新加载 nginx 配置文件
ps aux | grep nginx
# 查看 nginx 的进程
# 现在正常情况应该是1个master进程以及2个worker进程
第一步:备份旧版本,安装新版本
先将旧版本 nginx 的二进制文件进行备份,以防万一
cd /apps/nginx/sbin/
# 进入放有二进制文件的文件夹中
cp /apps/nginx/sbin/nginx /data/nginx.jiu
# 将其备份并改名方便分辩
再编译新版本nginx的二进制文件
wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /data
# 获取新版本安装
# 我的版本是1.18.0,所以在这里使用1.20.2进行升级处理
tar xf nginx-1.20.2.tar.gz
# 解压安装包
cd /data/nginx-1.20.2
# 进入安装包
nginx -V
# 查看安装的模块
./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
# 先对新版本 nginx 进行编译,后面的模块要和你nginx -V显示的一样
# 如果需要的新的模块可以在后面添加
# 注意安装的位置要和老版本的一致
make -j2
# 注意这里只需要make,不需要make install
mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
# 为了方便将新二进制文件移进来
cp objs/nginx /apps/nginx/sbin/
# 拷贝新版本
用命令向旧版本master进程发送USR2信号(在处理完请求后关闭work子进程)
kill -USR2 `cat /apps/nginx/run/nginx.pid`
# 向旧 master 进程发送 USR2 信号
第二步:完成新版本安装
这个时候新老版本的nginx同时存在,但新用户的请求只会发给新进程,旧进程不再接受
ps auxf|grep nginx
# 现在会产生 2个 master 进程
第三步:优雅关闭
关闭旧master的worker进程
(自选)马上要优雅关闭,若处于非服务状态下可以使用下面
的命令,使worker进程开始任务,方便观察优雅关闭过程
dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
# 新建 10G 的文件 m.img
# 再开一台新的虚拟机
wget --limit-rate=1M http://192.168.91.100/m.img
# 用新虚拟机下载大文件
因为用的是优雅关闭所以会在worker完成任务后再退出
kill -WINCH `cat /apps/nginx/run/nginx.pid.oldbin`
# 优雅关闭
第四步:升级 level up
测试新版本nginx是否正常运行
wget --limit-rate=1M http://192.168.91.100/m.img
# 再选择一台新的虚拟机下载大文件
ss -ntap|grep 80
# 查看是否开了一个新的worker
若不能正常运行,则将旧版本nginx发送hup信号,让其重新生成worker进程,也就是回滚
回滚
当升级成新版本的nginx不能正常运行时,唤起老版本的nginx的master进程,并关闭新版本的
kill -HUP `cat /apps/nginx/run/nginx.pid.oldbin`
# 该命令可以唤醒老的master进程
kill -QUIT `cat /apps/nginx/run/nginx.pid`
# 退出新版本的master进程
信号
nginx 命令支持向其发送信号,实现不同功能
nginx 当做单独命令使用有以下选项
nginx -h
# 查看信号的帮助
# 若无法使用nginx命令,请建立软连接
# 即:
ln -s /apps/nginx/sbin/nginx /usr/sbin
# ↑
# /你nginx安装的位置/sbin/nginx
常用的信号
- TERM或INT:快速停止nginx服务
- QUIT:平缓停止nginx 服务
- HUP:使用新的配置文件启动进程,平缓停止原有进程
- USR1: 重新打开日志文件,常用户日志切割
- USR2:使用新版本的nginx文件启动服务,之后平缓停止原有nginx进程
- WINCH:平滑停止worker process,用于nginx服务器平滑升级
查看版本信息
nginx -v
# 显示版本信息
nginx -V
# 显示详细信息
常用发送信号
nginx -s stop
# 立即关闭nginx
nginx -s quit
# 优雅退出 不影响业务的状态下退出
nginx -s reload
# 重新加载
分割日志
首先你要找到日志文件在哪
nginx日志文件默认存放在 /var/log/nginx目录下,但如果nginx没有使用默认位置的话,就需要进入nginx的配置文件中查找
检查语法格式
nginx -t
# 检查配置文件中的语法格式是否正确
nginx的配置文件
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
全局配置
模块
-
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
-
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
-
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
-
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
-
Stream服务模块: 实现反向代理功能,包括TCP协议代理
-
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
关闭版本和修改版本信息
vim /apps/nginx/conf/nginx.conf
# 进入 nginx 的主配置文件
server_tokens off;
# 在http语句中添加
nginx -s reload
# 重新加载配置文件
curl -I http://192.168.64.100/
# 查看该服务器的配置信息
修改进程数
vim /apps/nginx/conf/nginx.conf
# 进入 nginx 的主配置文件
worker_processes 1;
# 这是原来的配置,只有一个进程(worker)
# 把 1 修改为 2 就会有2个 worker
worker_processes auto;
# 当为 auto 时,进程数和你的内核数相同
ps axo pid,cmd,psr,ni|grep nginx
# 可以看到 nginx 的 worker 数量
进程与内核绑定
将Nginx工作进程绑定到指定的CPU核心,保证此进程不会运行在其他核心上,极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
vim /apps/nginx/conf/nginx.conf
# 编辑主配置文件
worker_processes 2;
worker_cpu_affinity 00000001 00000010;
# 将任务绑定到内核1和内核2上
ps axo pid,cmd,psr,ni|grep -v grep |grep nginx|sort -n
# 查看进程,多次使用可以查看是否固定内核
worker优先级
当你想将nginx的work进程的优先级调高 可以使用nice设置
vim /apps/nginx/conf/nginx.conf
# 编辑主配置文件
worker_priority -20;
# 工作进程优先级,-20~19数值越小,优先级越高
设置worker打开的文件的上限
所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等),而不仅仅是与客户端的连接,另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制.最好与ulimit -n 或者limits.conf的值保持一致
vim /apps/nginx/conf/nginx.conf
# 修改配置文件
worker_rlimit_nofile 65536;
# 修改文件可以打开的最大数量