Nginx (一)

Nginx (一)

1.Nginx介绍

  Nginx是一款高性能的Web服务器和反向代理服务器,它可以处理大量的并发连接和请求。Nginx最初是由俄罗斯的程序员Igor Sysoev开发的,已经成为了一个非常流行的开源软件项目。

  Nginx的设计目标是提供高性能、稳定性和可扩展性,它采用了事件驱动的异步架构,可以在不增加系统负担的情况下处理大量的并发请求。此外,Nginx还支持多种协议,包括HTTP、HTTPS、SMTP、POP3和IMAP等。

2.Nginx 的反向代理

  Nginx是作为一个轻量级别的Web服务器、反向代理服务器,Web服务器s是比较好理解的,其实就是用于处理网站需求,为网站提供服务的软件或者插件,而反向代理的理解我想通过图片进行清晰的介绍:

  既然提到了反向代理,与之相对的便是正向代理,专项代理是一个位于客户端和目标服务器之间的代理服务器,为了能够从目标服务器取得内容,客户端向代理服务器发送请求并指定目标,代理服务器就会向目标服务器转交请求并将获取的内容返回给客户端

  这种情况一般是pc客户端无法直接访问WEB服务器,但是代理服务器可以访问WEB服务器,而代理服务器就帮助PC请求页面并缓存到本地,并将页面返回给PC,我的理解是这与vpn访问外国网站的使用基本是一样的意思,而反向代理是指以代理服务器来接受互联网张的连接请求,然后将请求转发给内部网络上的服务器,并从服务器上得到结果返回给请求连接的客户端

  这种情况就是反向代理,PC客户端访问WEB服务,其实并不知道访问的是代理服务器,PC客户端认为代理服务器就是WEB服务器,我觉得反向代理和正向代理的区别就在于反向代理中,客户端是能够访问到服务器的,但是他并不知道真正的原版服务器ip地址是什么,也不知道自己连接是不是原版服务器,而正向代理则是明确了自己访问不到原版的服务器,在只能通过代理服务器获取相应的信息。正向代理一般是由客户端自己架设(用vpn科学上网),而反向代理则是由服务器进行架设

3.Nginx的负载均衡

有反向代理的使用,我们可以了解到,当多个用户请求时,我们有多个代理服务器进行反馈,根据所有真实服务器的负载情况,将客户端请求分发到不同的真实服务器上,最终达到了负载均衡的效果

 这也将会是后文所涉及到Nginx其核心架构之一Master-Worker模式,在这种模式下,一个主进程(Master)负责管理多个工作进程(Worker),每个工作进程都可以处理客户端请求。Worker进程则负责实际的请求处理,包括解析HTTP请求、执行反向代理、负载均衡、缓存等操作。每个Worker进程都是独立的,它们之间不会共享任何资源,从而保证了高并发和高可靠性。

 综上理解,其实Nginx的本质我觉得就是入口网关,位于系统前端,接受来自于不同地址的请求,将其发送到后端的各个服务之中。

4.三个依赖库的编译安装

  这里使用的是原装centos7系统,由于原装系统没有预先安装 gcc 等编译软件,这里需要用yum源安装,而安装nginx,首先需要安装依赖模块pcre、zlib、openssl。其中gzip 模块需要 zlib 库 ,rewrite 模块需要 pcre 库 ,ssl 功能需要 openssl库,接下来是三个库的安装教学

  • Pcre库依赖安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#下载 pcre-8.38
wget https://sourceforge.net/projects/pcre/files/pcre/8.38/pcre-8.38.tar.gz

#解压
tar -zxvf pcre-8.38.tar.gz

#进入解压目录
cd 目录/pcre-8.38

#编译
./configure –prefix=/opt/project/pcre

#安装
make && make install
  • zlib库依赖安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#下载 zlib-1.2.13
wget http://zlib.net/zlib-1.2.13.tar.gz

#解压
tar -zxvf zlib-1.2.13.tar.gz

#进入到解压目录
cd 目录/ zlib-1.2.13

#编译
./configure –prefix=/opt/project/zlib

#安装
make && make install

  • openSSL库依赖安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#下载 openssl-1.1.1-pre5
wget https://www.openssl.org/source/openssl-1.1.1-pre5.tar.gz

#解压
tar -zxvf openssl-1.1.1-pre5.tar.gz

#进入到解压目录
cd 目录/openssl-1.1.1-pre5

#编译 (这里需要注意一下解压缩后的文件c是大写…….)
./configure –prefix=/opt/project/openssl #指定安装目录

#安装
make && make install

  可以通过指令检验自己三个库是否安装成功

5.Nginx的编译安装

  手动创建 nginx 用户与用户组

1
2
groupadd nginx 
useradd nginx -g nginx -s /sbin/nologin -M

  其中-g nginx:将该用户添加到名为nginx的用户组中。-s /sbin/nologin:将该用户的登录shell设置为/sbin/nologin。-M:不要为该用户创建主目录。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#下载 
wget http://nginx.org/download/nginx-1.14.0.tar.gz


#解压
tar -zxvf nginx-1.14.0.tar.gz

#进入到解压目录
cd 目录/ nginx-1.14.0

#编译
./configure –prefix=/opt/project/nginx-1.14 #nginx 安装位置
–sbin-path=/opt/project/nginx-1.14/sbin/nginx #设置nginx可执行文件路径
–conf-path=/opt/project/nginx-1.14/config/nginx.conf #设置nginx配置文件路径
–pid-path=/opt/project/nginx-1.14/logs/nginx.pid #设置nginx.pid文件
–error-log-path=/opt/project/nginx-1.14/logs/error.log #设置主错误,警告,和诊断文件的名称
–lock-path=/opt/project/nginx-1.14/logs/nginx.log \
–http-log-path=/opt/project/nginx-1.14/logs/access.log #设置主请求的HTTP服务器的日志文件的名称
–with-http_ssl_module
–user=nginx \
–group=nginx \
–with-pcre=/var/software/nginx/pcre-8.38 #指的是pcre 的源码路径
–with-zlib=/var/software/nginx/zlib-1.2.13 #指的是zlib 的源码路径
–with-openssl=/var/software/nginx/openssl-1.1.1-pre5 #指的是openssl 的源码路径

#安装
make && make install

  安装发生了错误,可能是编译库的过程出现了问题,回顾原来的操作,openssl的安装尽管显示成功,但是在opt/project/的文件中并没有相关文件,相互指引也存在了问题,我接下里打算尝试使用yum进行三个库的安装后的效果对比现有的编译结果,查看是否存在一定区别

  Make成功,这说明确实是由于库的相关影响导致了最终的效果区别,主要问题我猜测是由于路径的不对导致了最终的报错问题,接下来创建用户和组

1
User nginx nginx
1
2
3
4
5
6
#接下来启动nginx
/opt/project/nginx-1.14/sbin/nginx
#重载nginx
/opt/project/nginx-1.14/sbin/nginx -s reload
#这里可以通过对应指令验证
/opt/project/nginx-1.14/sbin/nginx -V

  启动的文件位置需要注意前文中,自己设置的–sbin-path= /opt/project/nginx-1.14/sbin/nginx 命令

  通过-V指令得出我们编译安装的nginx相关信息。可以看到Nginx的版本号为1.14.0,使用的编译器为gcc 4.8.5,并且启用了TLS SNI支持。还有Nginx的配置参数,包括安装路径、可执行文件路径、配置文件路径、日志文件路径以及使用的模块和用户/组。

  也可以使用命令查看nignx的运行情况

1
ps -ef | grep nginx

  第一行表示Nginx的主进程,它的PID为54553,父进程PID为1,CPU占用率为0,启动时间为08:57,命令nginx: master process /opt/project/nginx-1.14/sbin/nginx。第二行表示Nginx的工作进程,它的PID为55505,父进程PID为54553,CPU占用率为0,启动时间为09:03,命令为nginx: worker process。第三行是一个grep命令的输出,用于查找包含nginx关键字的进程

  最后访问localhost:80端口进行查看

6.Nginx的平滑升级

  随着Nginx的使用广泛,Nginx的版本迭代也越来越块,比如1,5版本的TCP转发,1.9版本的steam四层代理功能,在考虑线上业务不能停止的同时,平滑的更新Nginx的版本显得格外重要,而Nginx也给了我们相对应的平滑升级操作来满足运维的安全操作,其过程操作可概括为:

  • (1)在不停掉老进程的情况下,启动新进程。
  • (2)老进程负责处理仍然没有处理完的请求,但不再接受处理请求。
  • (3)新进程接受新请求。
  • (4)老进程处理 完所有请求关闭所有连接后停止。

  主进程支持的信号:

1
2
3
4
5
6
7
TERM , INT : 立刻退出
QUIT : 等待工作进程结束后再退出
KILL : 强制终止进程
HUP : 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
USR1 : 重新打开日志文件
USR2 : 启动新的主进程,实现热升级
WINCH : 逐步关闭工作进程

  工作进程支持的信号:

1
2
3
TERM , INT : 立刻退出
QUIT : 等待请求处理结束后再退出
USR1 : 重新打开日志文件

  接下来查看nginx版本

1
/opt/project/nginx-1.14/sbin/nginx -V

  这里使用的是前面提到的-V指令进行查看,可以看到我们安装的nginx版本是1.14版本,接下来测试升级为1.24版本进行使用,具体安装过程这里给出有关指令,具体流程参考上文的安装笔记即可

1
2
3
4
5
6
7
8
9
10
11
12
13
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd 目录/ nginx-1.24.0
./configure –prefix=/opt/project/nginx-1.24 #nginx 安装位置
–sbin-path=/opt/project/nginx-1.24/sbin/nginx #设置nginx可执行文件路径
–conf-path=/opt/project/nginx-1.24/config/nginx.conf #设置nginx配置文件路径
–pid-path=/opt/project/nginx-1.24/logs/nginx.pid #设置nginx.pid文件
–error-log-path=/opt/project/nginx-1.24/logs/error.log #设置主错误,警告,和诊断文件的名称
–lock-path=/opt/project/nginx-1.24/logs/nginx.log \
–http-log-path=/opt/project/nginx-1.24/logs/access.log #设置主请求的HTTP服务器的日志文件的名称
–with-http_ssl_module
–user=nginx \
–group=nginx \

  接下来执行make命令,这里需要注意如果新版和旧版你设置的名字是重名的话就不能直接执行make install命令,否则会直接覆盖原来的文件内容

  接下来备份原nginx二进制文件

1
2
3
mv /opt/project/nginx-1.14/sbin/nginx   /opt/project/nginx-1.24/sbin/nginx_$(date +%F)
cd /opt/project/nginx-1.14/sbin/
cp /usr/local/nginx-1.24/sbin/nginx ./

  反正这里就是将对应的二进制文件nginx进行移走,给后面新版本的二进制文件腾地方,删除理论上应该不影响,但是备份总归是好的操作

  接下来,使用ps命令进行程序运行的查看,并使用-USR2和-WINCH进行平滑处理,USR2指令会向Nginx主进程发送一个USR2信号,用于平滑升级Nginx。当需要更新Nginx版本时,可以先安装新版本的Nginx,并将配置文件修改为新版本的配置文件。然后,使用该指令向Nginx主进程发送USR2信号,Nginx会重新加载配置文件并启动新版本的Nginx,同时保持旧版本的Nginx运行,直到所有连接都被处理完毕后再关闭旧版本的Nginx。

  而WINCH指令会向Nginx主进程发送一个WINCH信号,用于平滑关闭Nginx。当需要停止Nginx服务时,可以使用该指令向Nginx主进程发送WINCH信号,Nginx会停止接受新的连接请求,并等待所有已有连接处理完毕后再关闭Nginx。这样可以避免因突然关闭Nginx而导致的连接中断和数据丢失。

1
2
3
4
5
ps -ef|grep ngin
kill –USR2 2830
ps -ef|grep ngin
kill –WINCH 2830
ps -ef|grep ngin

  当我们执行kill –USR2 2830后,可以哦看见相对于第一次的ps指令,新的master进程已经正常开启,而老的进程也同样存在,之后我们使用kill –WINCH 2830指令告知老的work进程发出平滑停止的信号,最后ps也看见2853的老work已经停止。最后使用-V命令查看版本可以看到已经更新为1.24的版本内容,打开浏览器访问网站查看,运行成功


Nginx (一)
https://one-null-pointer.github.io/2023/05/30/Liunx运维——nginx/
Author
liaoyue
Posted on
May 30, 2023
传送口