nginx

一、Nginx架构和安装

1.1 Nginx概述

1.1.1Nginx介绍

Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )

2019年3月11日 F5 Networks 6.7亿美元的价格收购

Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务 器

解决C10K问题(10K Connections)

Nginx官网:http://nginx.org

nginx的其它的二次发行版:

  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加 了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了 很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始, Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于 Nginx 与 Lua 语言的高性能 Web 平台, 章亦春团队开发,官网:http://openr esty.org/cn/

1.1.2Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源 
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

1.1.3基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

1.1.4Web 服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

1.2Nginx架构和进程

1.2.1 Nginx进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

Nginx是多进程组织模型,而且是一个由Master主进程和Worker工作进程组成

主进程(master process)的功能:

  • 对外接口:接收外部的操作(信号)
  • 对内转发:根据外部的操作的不同,通过信号管理 Worker
  • 监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  • 读取Nginx 配置文件并验证其有效性和正确性
  • 建立、绑定和关闭socket连接
  • 按照配置生成、管理和结束工作进程
  • 接受外界指令,比如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应用新的配置
  • 开启日志文件,获取文件描述符
  • 不中断服务,实现平滑升级,升级失败进行回滚处理
  • 编译和处理perl脚本

工作进程(worker process)的功能:

  • 所有 Worker 进程都是平等的
  • 实际处理:网络请求,由 Worker 进程处理
  • Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争 CPU资源,
  • 增加上下文切换的损耗
  • 接受处理客户的请求
  • 将请求依次送入各个功能模块进行处理
  • I/O调用,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调用缓存数据
  • 发送请求结果,响应客户的请求
  • 接收主程序指令,比如重启、升级和退出等

1.2.2Nginx进程间通信


工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决 定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息

主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互

worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够 取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一 个进程的状态信息,就只能通过主进程来实现

为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该 新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做 准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息 中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指 令并进行相关操作,这样就完成了worker进程之间的通信

另worker进程可以通过共享内存来通讯的,比如upstream中的zone,或者limit_req、limit_conn中的 zone等。操作系统提供了共享内存机制

1.2.3Nginx模块介绍


nginx有多种模块:

核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件 驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应 头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的 支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支 持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11版本支持动态装载和卸载

模块分类:

核心模块:core module

标准模块:

HTTP模块: ngx_http_*

HTTP Core modules 默认功能
HTTP Optional modules 需编译时指定
Mail模块:ngx_stream_*

Stream 模块 ngx_stream_*

第三方模块

Nginx安装
Nginx版本和安装方式
Nginx版本:

Mainline version主要开发版本,一般为技术版本号,比如:1.19
Stable version 当前最新稳定版,一般为偶数版本,如:1.20
Legacy version 旧的稳定版,一般为偶数版本,如:1.18
Nginx安装可以只用yum或源码安装,但是推荐使用源码编译安装

yum的版本比较旧
编译安装可以更方便自定义相关路径
使用源码编译可以自定义相关功能,更方便业务上的使用
Nginx编译安装
编译器介绍:

源码安装需要提前准备标准的编译器,GCC的全称是(GNU Compiler collection),其有GNU开发,并以 GPL即LGPL许可,是自由的类UNIX即苹果电脑Mac OS X操作系统的标准编译器,因为GCC原本只能处理C语 言,所以原名为GNU C语言编译器,后来得到快速发展,可以处理C++,Fortran,pascal,objective C, java以及Ada等其他语言,此外还需要Automake工具,以完成自动创建Makefile的工作,Nginx的一些模块 需要依赖第三方库,比如: pcre(支持rewrite),zlib(支持gzip模块)和openssl(支持ssl模块) 等。

编译安装Nginx
官方源码包下载地址:

https://nginx.org/en/download.html


实验环境准备
rhel9.4的虚拟机,网卡eth0 nat模式,ip:172.25.254.100

关闭了selinux和firewalld

#将需要的nginx的压缩包下载下来
[root@Nginx ~]# ll nginx-1.24.0.tar.gz 
-rw-r--r--. 1 root root 1112471 Aug 15 14:08 nginx-1.24.0.tar.gz
#创建一个专供nginx使用的用户
[root@Nginx ~]# useradd -s /sbin/nologin -M nginx
#对其进行解压
[root@Nginx ~]# tar zxf nginx-1.24.0.tar.gz
#再下载学习Nginx所需要的软件包
[root@Nginx ~]# dnf install gcc pcre-devel zlib-devel openssl-devel -y
#进入解压的nginx目录
[root@Nginx ~]# cd nginx-1.24.0/
[root@Nginx nginx-1.24.0]# ll
total 816
drwxr-xr-x. 6 nginx nginx   4096 Aug 15 14:11 auto
-rw-r--r--. 1 nginx nginx 323312 Apr 11  2023 CHANGES
-rw-r--r--. 1 nginx nginx 494234 Apr 11  2023 CHANGES.ru
drwxr-xr-x. 2 nginx nginx    168 Aug 15 14:11 conf
-rwxr-xr-x. 1 nginx nginx   2611 Apr 11  2023 configure
drwxr-xr-x. 4 nginx nginx     72 Aug 15 14:11 contrib
drwxr-xr-x. 2 nginx nginx     40 Aug 15 14:11 html
-rw-r--r--. 1 nginx nginx   1397 Apr 11  2023 LICENSE
drwxr-xr-x. 2 nginx nginx     21 Aug 15 14:11 man
-rw-r--r--. 1 nginx nginx     49 Apr 11  2023 README
drwxr-xr-x. 9 nginx nginx     91 Aug 15 14:11 src
#隐藏版本信息
[root@Nginx nginx-1.24.0]# vim src/core/nginx.h
...
#define nginx_version      1026001
#define NGINX_VERSION      "1.0"
#define NGINX_VER          "lanjinli" NGINX_VERSION
...
#检测安装环境
[root@Nginx nginx-1.24.0]# ./configure --prefix=/usr/local/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
#会多出两个文件Makefile,objs
[root@Nginx nginx-1.24.0]# ll
total 820
drwxr-xr-x. 6 nginx nginx   4096 Aug 15 14:11 auto
-rw-r--r--. 1 nginx nginx 323312 Apr 11  2023 CHANGES
-rw-r--r--. 1 nginx nginx 494234 Apr 11  2023 CHANGES.ru
drwxr-xr-x. 2 nginx nginx    168 Aug 15 14:11 conf
-rwxr-xr-x. 1 nginx nginx   2611 Apr 11  2023 configure
drwxr-xr-x. 4 nginx nginx     72 Aug 15 14:11 contrib
drwxr-xr-x. 2 nginx nginx     40 Aug 15 14:11 html
-rw-r--r--. 1 nginx nginx   1397 Apr 11  2023 LICENSE
-rw-r--r--  1 root  root     438 Aug 18 21:20 Makefile
drwxr-xr-x. 2 nginx nginx     21 Aug 15 14:11 man
drwxr-xr-x  3 root  root     125 Aug 18 21:20 objs
-rw-r--r--. 1 nginx nginx     49 Apr 11  2023 README
drwxr-xr-x. 9 nginx nginx     91 Aug 15 14:11 src
[root@Nginx nginx-1.24.0]# 
#在编译之前关闭dubug
[root@Nginx nginx-1.24.0]# vim auto/cc/gcc
[root@Nginx nginx-1.24.0]# cat auto/cc/gcc
...
# debug
#CFLAGS="$CFLAGS -g"
...
#编辑,及编译安装
[root@Nginx nginx-1.24.0]# make && make install


编译安装后会有四个主要目录

[root@Nginx nginx-1.24.0]# ll /usr/local/nginx/
...
drwxr-xr-x. 2 root  root 4096 Aug 18 11:17 conf
drwxr-xr-x. 2 root  root   40 Aug 15 14:20 html
drwxr-xr-x. 2 root  root   58 Aug 18 17:36 logs
drwxr-xr-x. 2 root  root   68 Aug 18 21:23 sbin
[root@Nginx nginx-1.24.0]#

conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf fastcgi_params
两个文件,配置文件一般都有一个样板配置文件,是以.default为后缀,使用时可将其复制并将default后缀,去掉即可

html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。

logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比
如/var/logs/nginx里面

sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能


验证版本及编译参数

#将nginx软件的命令执行路径添加到环境变量中
[root@Nginx nginx-1.24.0]# vim ~/.bash_profile 
[root@Nginx nginx-1.24.0]# grep nginx ~/.bash_profile 
export PATH=$PATH:/usr/local/nginx/sbin
#重启环境变量配置文件
[root@Nginx nginx-1.24.0]# source ~/.bash_profile
#如果没有关闭debug的话nginx的启动文件会比较大会在5M左右
[root@Nginx nginx-1.24.0]# du -sh /usr/local/nginx/sbin/nginx
1.2M    /usr/local/nginx/sbin/nginx
[root@Nginx nginx-1.24.0]# 
#验证版本
[root@Nginx nginx-1.24.0]# nginx -V
nginx version: lanjinli1.0
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC) 
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/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@Nginx nginx-1.24.0]# 


隐藏版本信息:

注:这个要在编译之前就需要修改

[root@Nginx nginx-1.24.0]# vim src/core/nginx.h
...
#define nginx_version      1026001
#define NGINX_VERSION      "1.0"
#define NGINX_VER          "lanjinli/" NGINX_VERSION
...
#nginx二进制文件使用方法
[root@Nginx nginx-1.24.0]# nginx -help
nginx version: lanjinli1.0
Usage: nginx [-?hvVtTq] [-s signal] [-p prefix]
             [-e filename] [-c filename] [-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#发送信号,reload信号,会生成新的worker,但master不会重新生成
  -p prefix     : set prefix path (default: /usr/local/nginx/)#指定nginx目录
  -e filename   : set error log file (default: logs/error.log)#设置错误日志文件
  -c filename   : set configuration file (default: conf/nginx.conf#配置文件路径
  -g directives : set global directives out of configuration file#配置文件不要同事配置,否则冲突


[root@Nginx nginx-1.24.0]# 
#选项测试
[root@Nginx nginx-1.24.0]# nginx -s stop
[root@Nginx nginx-1.24.0]# nginx -g "worker_processes 6;"
[root@Nginx nginx-1.24.0]# ps aux | grep nginx
root       12110  0.0  0.0   9880  2088 ?        Ss   22:40   0:00 nginx: master process nginx -g worker_processes 6;
nginx      12111  1.8  0.5  55332 46024 ?        S    22:40   0:00 nginx: worker process
nginx      12112  1.8  0.5  55332 46024 ?        S    22:40   0:00 nginx: worker process
nginx      12113  1.6  0.5  55332 46024 ?        S    22:40   0:00 nginx: worker process
nginx      12114  1.8  0.5  55332 46172 ?        S    22:40   0:00 nginx: worker process
nginx      12115  1.9  0.5  55332 46152 ?        S    22:40   0:00 nginx: worker process
nginx      12116  1.9  0.5  55332 46152 ?        S    22:40   0:00 nginx: worker process
root       12120  0.0  0.0 221796  2304 pts/0    S+   22:40   0:00 grep --color=auto nginx
[root@Nginx nginx-1.24.0]# nginx -s quit
[root@Nginx nginx-1.24.0]# ps aux | grep nginx
root       12123  0.0  0.0 221664  2304 pts/0    S+   22:41   0:00 grep --color=auto nginx
[root@Nginx nginx-1.24.0]# 


nginx启动文件


#编写nginx启动文件
[root@Nginx nginx-1.24.0]# cat /lib/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#使启动文件生效
[root@Nginx nginx-1.24.0]# systemctl daemon-reload
[root@Nginx nginx-1.24.0]# systemctl restart nginx.service


平滑升级和回滚
在一些时候我们需要对Nginx版本进行升级以满足对其功能的需求,例如添加新模块,需要新功能,而此时Nginx又在跑着业务无法停止,这时我们就可以选择平滑升级或者回滚

流程


将旧Nginx二进制文件换成新Nginx程序文件(注意先备份)
向master进程发送USR2信号
master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master进 程的PID存放至新生成的pid文件nginx.pid
向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT
平滑升级实验


#现在的是1.24.0的版本,需要升级为1.26.0
#下载相应的nginx版本和后面实验需要的模块
[root@Nginx ~]# ll nginx-1.26.1.tar.gz 
-rw-r--r--. 1 root root 1244738 Aug 15 14:45 nginx-1.26.1.tar.gz
[root@Nginx ~]# ll echo-nginx-module-0.63.tar.gz 
-rw-r--r-- 1 root root 53421 Aug 18 10:30 echo-nginx-module-0.63.tar.gz
#对他们进行解压
[root@Nginx ~]# tar zxf nginx-1.26.1.tar.gz
[root@Nginx ~]# tar zxf echo-nginx-module-0.63.tar.gz
#进入nginx26版本目录
[root@Nginx ~]# cd nginx-1.24.0/
#对安装环境进行检测
#在检测之前可以修改vim src/core/nginx.h来隐藏版本信息
[root@Nginx nginx-1.24.0]# vim src/core/nginx.h
...
#define nginx_version      1026001
#define NGINX_VERSION      "26"
#define NGINX_VER          "lanjinli/" NGINX_VERSION
...
#添加--add-modul=/root/echo-nginx-module-0.63在编译的时候会读取这个文件的内容
[root@Nginx nginx-1.26.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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
[root@Nginx nginx-1.26.1]# make
#将24版本的进行备份
[root@Nginx ~]# cd /usr/local/nginx/sbin/
[root@Nginx sbin]# ll
...
-rwxr-xr-x 1 root root 1234424 Aug 18 21:23 nginx
[root@Nginx sbin]# cp nginx nginx.24
[root@Nginx sbin]# ll
total 2416
-rwxr-xr-x 1 root root 1234424 Aug 18 21:23 nginx
-rwxr-xr-x 1 root root 1234424 Aug 18 23:15 nginx.24
[root@Nginx sbin]# 
#将新版本的nginx复制将原来的nginx覆盖
[root@Nginx sbin]# \cp -f /root/nginx-1.26.1/objs/nginx .
[root@Nginx sbin]# ll
total 7236
-rwxr-xr-x 1 root root 6170608 Aug 18 23:17 nginx
-rwxr-xr-x 1 root root 1234424 Aug 18 23:15 nginx.24
[root@Nginx sbin]# 
#查看进程,这时老版本的nginx的进程
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2080 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      12218  0.0  0.5  55328 46104 ?        S    22:44   0:00 nginx: worker process
root       15783  0.0  0.0 221664  2304 pts/0    S+   23:19   0:00 grep --color=auto nginx
#检测是否有问题
[root@Nginx sbin]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx,此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80,此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
#进程读取新的文件,将新文件程序加入进程中
[root@Nginx sbin]# kill -USR2 12217
#这时候查看就有两个nginx程序在运行
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2592 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      12218  0.0  0.5  55328 46104 ?        S    22:44   0:00 nginx: worker process
root       15787  0.0  0.0   9916  6984 ?        S    23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      15788  0.0  0.5  55384 46172 ?        S    23:22   0:00 nginx: worker process
root       15790  0.0  0.0 221664  2304 pts/0    R+   23:22   0:00 grep --color=auto nginx
#回收旧版本nginx进程,这时候就是新版本nginx生效了
[root@Nginx sbin]# kill -WINCH 12217
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2592 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       15787  0.0  0.0   9916  6984 ?        S    23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      15788  0.0  0.5  55384 46172 ?        S    23:22   0:00 nginx: worker process
root       15792  0.0  0.0 221664  2304 pts/0    R+   23:24   0:00 grep --color=auto nginx
#查看现在版本信息
[root@Nginx sbin]# nginx -V
nginx version: lanjinli/26            #这里是26版本在生效
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC) 
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --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@Nginx sbin]# 


平滑回滚实验


#将26版本的nginx进行备份
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ll
total 13264
-rwxr-xr-x 1 root root 6170608 Aug 18 23:17 nginx
-rwxr-xr-x 1 root root 1234424 Aug 18 23:15 nginx.24
-rwxr-xr-x 1 root root 6170608 Aug 18 23:28 nginx.26
#将旧版本的nginx拉回来对其覆盖
[root@Nginx sbin]# \cp -f nginx.24 nginx
[root@Nginx sbin]# ll
total 8444
-rwxr-xr-x 1 root root 1234424 Aug 18 23:30 nginx
-rwxr-xr-x 1 root root 1234424 Aug 18 23:30 nginx.24
-rwxr-xr-x 1 root root 6170608 Aug 18 23:28 nginx.26
#查看nginx进程
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2592 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       15787  0.0  0.0   9916  6984 ?        S    23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      15788  0.0  0.5  55384 46172 ?        S    23:22   0:00 nginx: worker process
root       15834  0.0  0.0 221664  2304 pts/0    R+   23:32   0:00 grep --color=auto nginx
#启动旧版本nginx的进程
[root@Nginx sbin]# kill -HUP 12217
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2592 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       15787  0.0  0.0   9916  6984 ?        S    23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      15788  0.0  0.5  55384 46172 ?        S    23:22   0:00 nginx: worker process
nginx      15835  0.0  0.5  55328 46144 ?        S    23:33   0:00 nginx: worker process
root       15837  0.0  0.0 221664  2304 pts/0    R+   23:33   0:00 grep --color=auto nginx
#回收26版本的nginx进程,这时候就是24版本nginx生效了
[root@Nginx sbin]# kill -WINCH 15787
[root@Nginx sbin]# ps aux | grep nginx
root       12217  0.0  0.0   9876  2592 ?        Ss   22:44   0:00 nginx: master process /usr/local/nginx/sbin/nginx
root       15787  0.0  0.0   9916  6984 ?        S    23:22   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx      15835  0.0  0.5  55328 46144 ?        S    23:33   0:00 nginx: worker process
root       15839  0.0  0.0 221664  2304 pts/0    R+   23:33   0:00 grep --color=auto nginx
#查看版本信息
[root@Nginx sbin]# nginx -V
nginx version: lanjinli1.0
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC) 
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/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@Nginx sbin]# 


Nginx核心配置详解
配置文件说明
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件:include.conf.d/*.conf
fastcgi,uwsgi,scgi等协议相关的配置文件
mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
nginx配置文件格式说明
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
nginx主配置文件的配置指令方式:
directive value [value2 ...];

注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
    内建变量:由Nginx模块引入,可直接引用
    自定义变量:由用户使用set命令定义,格式: set variable_name value;
    引用变量:$variable_name

主配置文件结构:
一共有四部分

main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
    ...
}
#http/https 协议相关配置段
http {
    ...
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
    ...
}
#stream 服务器相关配置段
stream {
    ...
}


默认的nginx.conf配置文件格式说明

#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路 径,日志路径等
user nginx nginx;
worker_processes 1;                         #启动工作进程数数量
events { #events                            #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型
                                            #处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
    worker_connections 1024;                #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为1024
                                            #worker_connections *worker_processes,作为反向代理的时候为(worker_connections * worker_processes)/2
}
http {                                         #http块是Nginx服务器配置中的重要部分,缓存、代理和日志格式定义等绝大多数功能和第三方模块都可以在这设置,http块可,以包含多个server块,而一个server块中又可以包含多个location块,server块可以配置文件引入、MIME-Type定义、日志自定义、是否启用sendfile、连接超时时间和单个链接的请求上限等。
    include mime.types;
    default_type application/octet-stream;
    sendfile on;                            #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用sendfile系统调用来传输文件.sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,硬盘 >> kernel buffer (快速拷贝到kernelsocketbuffer) >>协议栈。
    keepalive_timeout 65;                     #长连接超时时间,单位是秒
    server {                                 #设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块,比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口比如都使用,80端口提供web服务
        listen 80;                            #配置server监听的端口
        server_name localhost;                 #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
        location / {                         #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令,都是在location中体现的,主要是基于nginx接受到的请求字符串,对用户请求的UIL进行匹配,并对特定的指令进行处理,包括地址重定向、数据缓存和应答控制等功能都是在这部分实现,另外很多第三方模块的配置也是在location模块中配置。
            root html;                        #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
            index index.html index.htm;        #默认的页面文件名称
        }
        error_page 500 502 503 504 /50x.html;#错误页面的文件名称
        location = /50x.html {                #location处理对应的不同错误码的页面定义到/50x.html,这个跟对应其server中定义的目录下。
            root html;                         #定义默认页面所在的目录
        }
    }
    #和邮件相关的配置
    mail {
        ...                                    #mail 协议相关配置段
    }
    #tcp代理配置,1.9版本以上支持
    stream {
        ...                                    #stream 服务器相关配置段
    }
    #导入其他路径的配置文件
    include /apps/nginx/conf.d/*.conf
}


全局配置
Main全局配置段常见的配置指令分类

正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
时间驱动相关的配置
全局配置说明


user nginx nginx;                        #启动Nginx工作进程的用户和组
worker_processes [number | auto];        #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto;#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前nginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK:    00000001:0号CPU
            00000010:1号CPU
            10000000:7号CPU
#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit | alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /usr/local/nginx/logs/error.log error;

#pid文件保存路径
pid            /usr/local/nginx/logs/nginx.pid;
worker_priority 0;                        #所有worker进程能打开的文件数量上限,包括:Nginx的所有连接(例如与代理服务器的连接等)而不仅仅是与客户端的连接另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制,最好与ulimit -n 或者limits.conf的值保持一致,


http配置块


#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include                /etc/nginx/mime.types;
default_type        application/octet-stream;            #除mime.types中的类型外指定其它文件的默认MIME类型,浏览器一般会提示下载
types {
    text/html html;
    image/gif gif;
    image/jpeg jpg;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值