Nginx服务介绍与部署配置

news2024/10/6 10:38:14

目录

一、Nginx相关介绍

1. 概述

2. 优缺点

3. 零拷贝技术

4. I/O模型相关概念

5. 网络I/O模型 

5.1 阻塞型I/O模型

5.2 非阻塞型I/O模型

5.3 多路复用I/O型

5.4 信号驱动式I/O模型

5.5 异步I/O模型

6. 事件驱动模型

7. Nginx与Apache区别

二、Nginx部署和使用

1. yum安装

2. 编译安装

3. 创建Nginx 自启动文件

4. 信号使用命令及平滑升级

  4.1 信号

5. 热升级nginx1.18至nginx1.20

6. 回滚 


一、Nginx相关介绍

1. 概述

Nginx(发音为"engine-x")是一个高性能的开源Web服务器,反向代理服务器以及电子邮件(IMAP/POP3)代理服务器。Nginx专为性能优化而设计,可以处理高并发连接,并且占用系统资源较少。它也被广泛用作负载均衡器和HTTP缓存。Nginx的设计目标之一是解决C10k问题,即同时连接数超过1万的情况下仍能保持高性能。

2. 优缺点

优点:

① 高并发能力: 能够处理大量并发连接,适合高流量的网站和应用程序
② 低系统资源消耗: 相比其他Web服务器,Nginx占用更少的系统资源,表现出更好的性能
③ 灵活的配置选项: 允许管理员根据需要进行高度定制,满足各种复杂的部署需求
④ 可扩展性: 支持动态模块加载,可以根据需要添加额外的功能和扩展

缺点:

① 不适合处理动态内容: 相比Apache等服务器,Nginx在处理动态内容时效率稍低。
② 学习曲线: 对于初学者来说,可能需要一些时间来熟悉Nginx的配置和工作原理。
③ 缺少内置的支持: 相比一些其他服务器,Nginx在某些方面可能需要依赖第三方模块来实现特定功能。

3. 零拷贝技术

在传统的数据传输过程中,数据通常需要经过多次复制。比如,当数据从磁盘读取到内存时,首先将数据读入内核缓冲区,然后再从内核缓冲区复制到用户空间的应用程序缓冲区。零拷贝技术通过避免或减少数据在内存和设备之间的多次复制来提高效率。具体做法包括直接内存访问(DMA)、文件映射(mmap)和发送文件(sendfile)等。

4. I/O模型相关概念

同步/异步(消息反馈机制):关注的是消息通信机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知

  • 同步:被调用者不提供事件的处理结果,需要调用者主动询问事情是否处理完成
  • 异步:被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态

阻塞/非阻塞:关注调用者在等待结果返回之前所处的状态

  • 阻塞:指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情
  • 非阻塞:指IO操作被调用后立即返回给用户一个状态值,而无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情

5. 网络I/O模型 

5.1 阻塞型I/O模型

Linux操作系统默认是阻塞型I/O模型。阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作用户需要等待read将数据读取到buffer(缓存区)后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。

  • 优点:程序简单,在阻塞等待数据期间进程/线程挂起,基本不会占用 CPU 资源
  • 缺点:每个连接需要独立的进程/线程单独处理,当并发请求量大时为了维护程序,内存、线程切换开销较大,apache 的preforck使用的是这种模式。

5.2 非阻塞型I/O模型

用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

5.3 多路复用I/O型

I/O multiplexing 主要包括:select,poll,epoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。Apache prefork是此模式的select,work是poll模式。

5.4 信号驱动式I/O模型

通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个SIGIO 信号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进程所需要的数据从内核空间拷贝到用户空间。

此模型的优势在于等待数据报到达期间进程不被阻塞。用户主程序可以继续执行,只要等待来自信号处理函数的通知。在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

  • 优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
  • 缺点:信号I/O在大量IO操作时可能会因为信号队列溢出导致没法通知

5.5 异步I/O模型

异步I/O 与 信号驱动I/O最大区别在于,信号驱动是内核通知我们何时开始一个I/O操作,而异步I/O是由内核通知我们I/O操作何时完成,两者有本质区别,相当于不用去饭店场吃饭,直接点个外卖,把等待上菜的时间也给省了。所有事情都交给内核处理。

6. 事件驱动模型

Nginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不同。

① select:select库是在linux和windows平台都基本支持的 事件驱动模型库,并且在接口的定义也基本相同,只是部
分参数的含义略有差异,最大并发限制1024,是最早期的事件驱动模型。

② poll:在Linux 的基本驱动模型,windows不支持此驱动模型,是select的升级版,取消了最大的并发限制,在编
译nginx的时候可以使用--with-poll_module和--without-poll_module这两个指定是否编译select
库。

③ epoll:epoll是库是Nginx服务器支持的最高性能的事件驱动库之一,是公认的非常优秀的事件驱动模型,它和select和poll有很大的区别,epoll是poll的升级版,但是与poll有很大的区别.
epoll的处理方式是创建一个待处理的事件列表,然后把这个列表发给内核,返回的时候在去轮训检查这个表,以判断事件是否发生,epoll支持一个进程打开的最大事件描述符的上限是系统可以打开的文件的最大数,同时epoll库的I/O效率不随描述符数目增加而线性下降,因为它只会对内核上报的“活跃”的描述符进行操作。

7. Nginx与Apache区别

① 性能和并发处理

Nginx:采用事件驱动的架构,能够高效地处理大量并发连接;在高并发情况下表现出色,占用较少的系统资源

Apache:传统多进程模型,在高并发情况下性能可能受限,消耗较多的系统资源

② 静态内容处理

Nginx:擅长处理静态文件,能够快速、高效地提供静态内容

Apache:在处理静态文件时效率稍低,尤其在高并发环境下表现不如Nginx

③ 动态内容处理

Nginx:对于动态内容的处理相对有限,通常需要结合后端应用服务器(如uWSGI、FastCGI等)来处理动态请求

Apache:擅长处理动态内容,支持多种编程语言和模块,如mod_php、mod_perl等 

④  配置语法和灵活性

Nginx:配置文件语法简洁清晰,支持动态模块加载,允许管理员根据需要进行高度定制

Apache:配置文件相对复杂,但更加灵活,允许管理员通过.htaccess文件进行目录级别的配置

⑤ 虚拟主机支持

Nginx:能够支持虚拟主机配置,但相对Apache的虚拟主机配置更为简洁

Apache:以在同一台服务器上托管多台域名的网站

⑥ 模块和扩展性

Nginx:支持丰富的第三方模块,但相比Apache模块生态系统规模较小

Apache:拥有庞大的模块生态系统,支持广泛的功能和扩展

⑦ 适用场景

Nginx:更适合作为反向代理、负载均衡器以及高性能Web服务器使用

Apache:适合处理动态内容、具有灵活的配置需求,并且需要强大的模块支持的场景

综合来看,Nginx擅长处理高并发、静态内容,以及作为反向代理和负载均衡器;而Apache则更适合处理动态内容、拥有复杂配置需求和强大的模块支持的场景。

二、Nginx部署和使用

1. yum安装

① 使用yum部署Nginx需要先安装epel-release扩展包

[root@localhost ~]# yum install epel-release -y  #安装epel额外源
[root@localhost ~]# yum install nginx -y         #安装nginx

② 使用yum安装的nginx配置文件位置在:/etc/nginx/nginx.conf;默认根目录在:/usr/share/nginx/html;默认日志文件在:/var/log/nginx/路径下

2. 编译安装

① 访问官网下载安装包,优先选择偶数版本下载,较为稳定。下载到本地可以使用xshell工具传输到Linux系统中或者使用wget工具复制链接下载。

[root@localhost ~]# useradd -M -s /sbin/nologin nginx
#新建nginx用户便于管理
[root@localhost opt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz

② 安装编译需要的依赖环境和工具,进入对应的目录进行解压编译

[root@localhost opt]# tar xf nginx-1.24.0.tar.gz     #解压
[root@localhost opt]# cd nginx-1.24.0/
[root@localhost nginx-1.24.0]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@localhost nginx-1.24.0]# yum install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel -y
#安装依赖包 
[root@localhost nginx-1.24.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@localhost nginx-1.24.0]# make -j 2 && make install
#2u编译;执行文件安装

[root@localhost nginx-1.24.0]# chown -R nginx.nginx /apps/nginx
#修改权限

③ 创建软链接并关闭防火墙

[root@localhost nginx-1.24.0]# ln -s /apps/nginx/sbin/nginx /usr/sbin/
[root@localhost nginx-1.24.0]# systemctl stop firewalld
[root@localhost nginx-1.24.0]# setenforce 0 

 ④ 启动关闭nginx查看进程

[root@localhost nginx-1.24.0]# nginx
[root@localhost nginx-1.24.0]# ps aux | grep nginx
root       4664  0.0  0.0  20580   616 ?        Ss   15:52   0:00 nginx: master process nginx
nobody     4665  0.0  0.0  23108  1372 ?        S    15:52   0:00 nginx: worker process
root       4675  0.0  0.0 112824   984 pts/0    S+   15:53   0:00 grep --color=auto nginx
#nginx: master主进程
#nginx: worker子进程

[root@localhost nginx-1.24.0]# killall  nginx   #停止nginx

⑤ 文件夹功能介绍

[root@localhost nginx-1.24.0]# ll /apps/nginx/
总用量 4
drwxr-xr-x. 2 nginx nginx 4096 2月  20 16:36 conf
drwxr-xr-x. 2 nginx nginx   40 2月  20 16:36 html
drwxr-xr-x. 2 nginx nginx   58 2月  20 16:43 logs
drwxr-xr-x. 2 nginx nginx   19 2月  20 16:36 sbin
  • 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二进制启动脚本,可以接受不同的参数以实现不同的功能。

3. 创建Nginx 自启动文件

[root@localhost ~]# vim /usr/lib/systemd/system/nginx.service
[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
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target

[root@localhost ~]# systemctl daemon-reload    
#重新加载配置
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# systemctl status nginx
[root@localhost ~]# systemctl stop nginx
[root@localhost ~]# systemctl enable --now nginx
#开机自启并立即启动

4. 信号使用命令及平滑升级

  4.1 信号

nginx 命令支持向其发送信号,实现不同功能;nginx 当做单独命令使用有以下选项:

选项说明
nginx -?,-h帮助
nginx -v显示版本号
nginx -V查看安装了哪些模块
nginx -t测试配置文件是否有语法错误
nginx -s发送信号 后面可以跟stop、reload、quit、reopen
nginx -p指定运行目录
nginx -c使用指定的配置文件
nginx -g指定配置指令

① 显示版本号

[root@localhost ~]# nginx -v
nginx version: nginx/1.24.0

② 显示编译详细情况 模块等信息

[root@localhost ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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@localhost ~]# pstree -p | grep nginx 
           |-nginx(5367)---nginx(5368)
[root@localhost ~]# nginx -s stop               #立即关闭nginx
[root@localhost ~]# pstree -p | grep nginx  
[root@localhost ~]# 

nginx -s quit                                   #优雅退出,不影响业务的状态下退出
nginx -s reload                                 #重新加载 

USR1分割日志:

192.168.190.100:
[root@localhost ~]# systemctl start nginx
[root@localhost ~]# cd /apps/nginx/logs/
[root@localhost logs]# ls
access.log  error.log  nginx.pid
[root@localhost logs]# ll | grep access.log 
-rw-r--r--. 1 root root    0 2月  20 16:41 access.log

19.168.190.101:
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# curl 192.168.190.100

192.168.190.100:
[root@localhost logs]# ll | grep access.log 
-rw-r--r--. 1 root root   92 2月  20 18:04 access.log    #产生日志

192.168.190.100:
[root@localhost logs]# mv access.log access.log.bak
[root@localhost logs]# touch access.log
[root@localhost logs]# ls
access.log  access.log.bak  error.log  nginx.pid
[root@localhost logs]# ll | grep access.log 
-rw-r--r--. 1 root root    0 2月  20 18:07 access.log
-rw-r--r--. 1 root root   92 2月  20 18:04 access.log.bak
[root@localhost logs]# nginx -s reopen         
#重新打开日志文件,否则依然写入.bak,或者kill -s USR1 主进程号

192.168.190.101:
[root@localhost ~]# curl 192.168.190.100

192.168.1901.100:
[root@localhost logs]# ll | grep access.log 
-rw-r--r--. 1 nginx root   92 2月  20 18:11 access.log         #此时日志已写入新文件
-rw-r--r--. 1 root  root   92 2月  20 18:04 access.log.bak

④ 指定配置,不以配置文件中的为准

[root@localhost ~]# vim /apps/nginx/conf/nginx.conf
3 #worker_processes  1;                                #避免冲突注释此行

[root@localhost ~]# nginx -g 'worker_processes  2;'
[root@localhost ~]# pstree -p | grep nginx
           |-nginx(6068)-+-nginx(6069)
           |             `-nginx(6070)

⑤ 检查语法格式

nginx -t

5. 热升级nginx1.18至nginx1.20

① 修改配置文件nginx.conf

[root@localhost sbin]# ps aux | grep nginx
#先查看是否开启nginx
[root@localhost ~]#vim /apps/nginx/conf/nginx.conf
worker_processes  2;
#开启双核,最大性能为8核
[root@localhost ~]#nginx -s reload
#重新加载配置文件
[root@localhost ~]#ps aux | grep nginx
#查看多了一个worker进程

② 下载新版本安装包,重新编译安装

[root@localhost ~]#wget https://nginx.org/download/nginx-1.20.2.tar.gz -P /usr/local/src/
#下载安装包到/usr/local/src/目录
[root@localhost ~]#cd /usr/local/src/
[root@localhost src]#ls
nginx-1.20.2.tar.gz
[root@localhost src]#tar xf nginx-1.20.2.tar.gz 
[root@localhost src]#cd nginx-1.20.2/
[root@localhost nginx-1.20.2]#ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  man  README  src
[root@localhost nginx-1.20.2]# nginx -V
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --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@localhost nginx-1.20.2]# ./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@localhost nginx-1.20.2]# ls
auto  CHANGES  CHANGES.ru  conf  configure  contrib  html  LICENSE  Makefile  man  objs  README  src
[root@localhost nginx-1.20.2]# make
[root@localhost nginx-1.20.2]# cd objs/
#此文件夹中有新版本的nginx运行程序
[root@localhost objs]# ls
autoconf.err  Makefile  nginx  nginx.8  ngx_auto_config.h  ngx_auto_headers.h  ngx_modules.c  ngx_modules.o  src
[root@localhost objs]# ./nginx -v
nginx version: nginx/1.20.2
#查看版本

③ 拷贝新版本至原安装路径

[root@localhost objs]# mv /apps/nginx/sbin/nginx /apps/nginx/sbin/nginx.bak
#将低版本的nginx主程序改名
[root@localhost objs]# cp nginx /apps/nginx/sbin/
#将新版本拷入原安装路径
[root@localhost objs]# cd /apps/nginx/sbin/
[root@localhost sbin]# ls
nginx  nginx.bak
[root@localhost nginx-1.20.2]# ll /apps/nginx/sbin/
总用量 15308
-rwxr-xr-x. 1 root  root  7896080 2月  20 21:15 nginx
-rwxr-xr-x. 1 nginx nginx 7774624 2月  20 20:52 nginx.bak
[root@localhost nginx-1.20.2]# nginx -v
nginx version: nginx/1.20.2
#nginx文件为新版本
[root@localhost sbin]# /apps/nginx/sbin/nginx -t
#检查下语法问题

④ 生成新进程

[root@localhost nginx-1.20.2]# kill -USR2 `cat /apps/nginx/logs/nginx.pid`
#发送 2 信号

[root@localhost sbin]# pstree -p | grep nginx
           |-nginx(5073)-+-nginx(8717)-+-nginx(8718)
           |             |             `-nginx(8719)
           |             |-nginx(5623)
           |             `-nginx(5624)
[root@localhost sbin]#  ps aux | grep -v grep | grep nginx
root       5073  0.0  0.1  46344  2020 ?        Ss   22:33   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      5623  0.0  0.1  48856  2092 ?        S    22:37   0:00 nginx: worker process
nginx      5624  0.0  0.1  48856  2084 ?        S    22:37   0:00 nginx: worker process
root       8717  0.0  0.1  46220  3368 ?        S    22:43   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      8718  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
nginx      8719  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
#生成新的master8717
[root@localhost ~]# cd /apps/nginx/logs
[root@localhost logs]# ls
access.log  error.log  nginx.pid  nginx.pid.oldbin
[root@localhost logs]# cat nginx.pid
8717         #新的master进程
[root@localhost logs]# cat nginx.pid.oldbin
5073         #旧的master进程

⑤ 优雅的退出旧进程,不影响真正使用的用户

192.168.190.102:
[root@localhost ~]# cd /apps/nginx/html
[root@localhost html]# ls
50x.html  index.html
#会有新老两个进程
[root@localhost html]# dd if=/dev/zero of=/apps/nginx/html/m.img bs=1G count=10
#生成大文件
[root@localhost html]# ll -h
总用量 1.1G
-rw-r--r--. 1 nginx nginx  494 2月  20 20:52 50x.html
-rw-r--r--. 1 nginx nginx  612 2月  20 20:52 index.html
-rw-r--r--. 1 root  root  1.0G 2月  20 22:06 m.img

192.168.190.101:
[root@localhost data]# wget --limit-rate=1M http://192.168.190.102/m.img
#下载文件

192.168.190.102:
[root@localhost html]# kill -WINCH `cat /apps/nginx/logs/nginx.pid.oldbin`
#优雅关闭旧进程的worker进程,此时旧进程不会再接收新的任务,后期可以直接退出

192.168.190.101:
[root@localhost ~]# curl 192.168.190.102 -I
HTTP/1.1 200 OK
Server: nginx/1.20.2         
#新版本接替接收任务,即升级成功

优雅关闭旧进程的worker进程,查看是否影响当前任务:

注意:当旧进程任务结束后可以优雅的退出: kill -quit 旧master pid;或者直接关闭:kill 旧master pid;或者此时将无法回滚。

6. 回滚 

当发现新版本有异常,可以通过回滚解决。

① 查看当前worker进程

[root@localhost ~]# pstree -p | grep nginx
           |-nginx(5073)---nginx(8717)-+-nginx(8718)
           |                           `-nginx(8719)
[root@localhost ~]# ps aux | grep -v grep | grep nginx
root       5073  0.0  0.1  46344  2020 ?        Ss   22:33   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root       8717  0.0  0.1  46220  3368 ?        S    22:43   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      8718  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
nginx      8719  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
#旧的两个worker进程已关闭

 ② 唤醒旧进程

[root@localhost ~]# pstree -p | grep nginx
           |-nginx(5073)-+-nginx(8717)-+-nginx(8718)
           |             |             `-nginx(8719)
           |             |-nginx(8786)
           |             `-nginx(8787)
[root@localhost ~]# ps aux | grep -v grep | grep nginx
root       5073  0.0  0.1  46344  2052 ?        Ss   22:33   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
root       8717  0.0  0.1  46220  3368 ?        S    22:43   0:00 nginx: master process /apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
nginx      8718  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
nginx      8719  0.0  0.1  48756  1992 ?        S    22:43   0:00 nginx: worker process
nginx      8786  0.0  0.1  48856  2120 ?        S    22:49   0:00 nginx: worker process
nginx      8787  0.0  0.1  48856  2120 ?        S    22:49   0:00 nginx: worker process
#此时查旧的两个worker进程恢复

③ 修改nginx.bak文件名回滚版本

192.168.190.102:
[root@localhost ~]# cd /apps/nginx/sbin/
[root@localhost sbin]# ls
nginx  nginx.bak
#这里的nginx版本为1.20.2,nginx.bak版本为1.18.0
[root@localhost sbin]# mv nginx nginx.1.20.2
[root@localhost sbin]# mv nginx.bak nginx
[root@localhost sbin]# systemctl start nginx

192.168.190.100:
[root@localhost ~]# curl 192.168.190.102 -I
HTTP/1.1 200 OK
Server: nginx/1.18.0
#已回滚至1.18.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网贷大数据查询多了对征信有影响吗?

网贷大数据在日常的金融借贷中起到很重要的风控作用,不少银行已经将大数据检测作为重要的风控环节。很多人在申贷之前都会提前了解自己的大数据信用情况,那网贷大数据查询多了对征信有影响吗?本文带你一起去看看。 首先要说结论:那就是查询网…

ubuntu 22.04 图文安装

ubuntu 22.04.3 live server图文安装 一、在Vmware里安装ubuntu 22.04.3 live server操作系统 选择第一个选项开始安装 选择English语言 选择中间选项不更新安装,这是因为后续通过更换源之后再更新会比较快 键盘设计继续选择英文,可以通过语言选择…

单链表(上)

1. 链表的概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表 中的指针链接次序实现的。 链表的结构也可以想像为一列火车,每节车厢都是一个成员,它们互补影响,但又通过一个装…

时间获取、文件属性获取 2月20日学习笔记

执行两次代码&#xff0c;打印出两次执行过程中新增的文件及删除的文件 #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <fcntl.h> #include <stdio.h> #include <string.h> #include <dirent.h>#def…

Redis篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、Redis 如何做内存优化?二、Redis 回收进程如何工作的?三、都有哪些办法可以降低 Redis 的内存使用情况呢?四、Redis 的内存用完了会发生什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

LabVIEW风力机智能叶片控制系统

​LabVIEW风力机智能叶片控制系统 介绍了一种风力机智能叶片控制系统的开发。通过利用LabVIEW软件与CDS技术&#xff0c;该系统能够实时监测并调整风力机叶片的角度&#xff0c;优化风能转换效率。此项技术不仅提高了风力发电的稳定性和效率&#xff0c;而且为风力机的智能化管…

Pandas时间序列数据补全

一、问题 时间序列数据缺失&#xff0c;将其补全。 如下图所示&#xff0c;数据存在缺失秒级的情况 二、方法 1、需要将时间戳字段设置成 df 的索引 2、使用df.resample()方法 (1)上采样&#xff08;将上一条数据作为当前缺失数据&#xff09; resample()中的参数&#x…

内核移植学习

内核移植 内核移植就是指将RT-Thread内核在不同的芯片架构、不同的板卡上运行起来。 移植可分为CPU架构移植和BSP板级支持包移植两部分。 CPU架构移植 在嵌入式领域有多种不同CPU架构&#xff0c;例如Cortex-M、ARM920T、MIPS32、RISC-V等等。 为了使RT-Thread能够在不同C…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP&#xff08;统一过程开发&#xff09;4 1 视图 1&#xff09;逻辑视图&#xff1a; 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构&#xff0c;包括类、接口、包、模块等&#xff0c;并用于表示系统的组织结构…

Android基础Adapter适配器详解

一、概念 Adapter是后端数据和前端显示UI的适配器接口。常见的View如ListView、GridView等需要用到Adapter. BaseAdapter&#xff1a;抽象类&#xff0c;实际开发中继承这个类并且重写相关方法&#xff0c;用得最多的一个Adapter&#xff01; ArrayAdapter&#xff1a;支持泛型…

Gradle统一管理依赖

背景 随着项目越来越大&#xff0c;module 越来越多&#xff0c;依赖的库也越来越多&#xff0c;依赖管理也越来越混乱。 我们一般会有以下需求&#xff1a; 1. 项目依赖统一管理&#xff0c;在单独文件中配置 2. 不同 Module 中的依赖版本号统一 管理 Gradle 依赖 说明&a…

Vue3学习——标签的ref属性

在HTML标签上&#xff0c;可以使用相同的ref名称&#xff0c;得到DOM元素ref放在组件上时&#xff0c;拿到的是组件实例&#xff08;组件defineExpose暴露谁&#xff0c;ref才可以看到谁&#xff09; <script setup lang"ts"> import RefPractice from /compo…

C++/C函数指针及函数指针数组

文章目录 什么是函数指针函数指针的使用为什么要使用函数指针&#xff1f;回调函数函数指针数组及使用阅读两段有趣的代码指向成员函数的指针&#xff08;C特有&#xff09; 什么是函数指针 首先它是一个指针&#xff0c;一个指向函数的指针&#xff0c;在内存空间中存放的是函…

Camunda快速入门(五):设计一个带DMN业务规则的流程

接上一篇文章&#xff1a;Camunda快速入门&#xff08;四&#xff09;&#xff1a;设计一个带网关的流程 在本节中&#xff0c;您将学习如何使用 BPMN 2.0 业务规则任务和 DMN 1.3 决策表将决策自动化添加到流程中。 1、将业务规则任务添加到流程 使用 Camunda Modeler 打开…

Python学习-if else及比较运算符、while循环结构、random生成随机数模块

五、if else及比较运算符 1、if else语法 if 条件&#xff1a; 如果条件为真&#xff08;Ture&#xff09;执行这里的语句 else: 如果条件为假&#xff08;False&#xff09;执行这里的语句 2、比较运算符 运算符含义<判断左边是否小于右边<判断左边是否小于或等于右…

《nvm 安装》nodejs 版本管理工具

一.前言 如果先于 nvm 安装了 node&#xff0c;一定要先卸载&#xff01; 两种卸载方式&#xff1a; 方式一 控制面板 -> 程序和功能 -> nodejs 删除 方式二 下载的 node 安装包有卸载选项 二. 安装 nvm 下载地址 中找到对应的安装包&#xff0c;我本机使用 window…

关于公司私有gitlab拉去项目中遇到的问题

新进公司都会遇到拉去项目代码问题&#xff0c;新账号新环境&#xff1b;怎么拉去代码才是最有效的呢&#xff1f; 在此某些大神会给你一个地址&#xff1a;一句你自己来取吧&#xff1b;拉下来看看逻辑就行了&#xff1b;这样的人挺不错&#xff1b;会让你陷入无限的BUG循环中…

安卓adb调试备忘录

由于 MAC 的 USB 口全被占用着&#xff0c;采用无线连接刚方便&#xff0c;记录一下&#xff0c;以防忘记~ ADB原理 adb devices -l ## 列出连接的设备adb tcpip [端口号] adb tcpip 6666 # 将当前已连接USB上的Mobile端切换为TCP/IP模式&#xff0c;以6666端口进行监听. adb…

数字孪生与智慧城市:共筑未来城市的科技基石

一、引言 随着科技的飞速发展&#xff0c;数字孪生与智慧城市已成为未来城市建设的两大关键技术。数字孪生为城市提供了一个虚拟的数字镜像&#xff0c;使我们能全面、深入地了解城市的运行状态。而智慧城市则借助先进的信息通信技术&#xff0c;提升城市的智能化水平&#xf…

机器学习基础(三)监督学习的进阶探索

导语&#xff1a;上一节我们深入地探讨监督学习和非监督学习的知识&#xff0c;重点关注它们的理论基础、常用算法及实际应用场景&#xff0c;详情可见&#xff1a; 机器学习基础&#xff08;二&#xff09;监督与非监督学习-CSDN博客文章浏览阅读769次&#xff0c;点赞15次&a…