Nginx概念理论篇

发布于 2021-08-19  3.77k 次阅读


一,Nginx的概述

产生背景:Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,Nginx是由伊戈尔·赛索耶夫为俄罗斯 访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日

应用:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。

     Nginx可以作为静态页面的web服务器,同时还支持CGI协议的动态语言,比如prtl,php等,但是不支持java。java程序只能通过Tomcat配合完成,Nginx专为性能优化而开发,性能是最重要的考量,实现上非常注重效率,能经受高负载的考验,它支持的并发连接数达50000

nginx做为HTTP服务器,有以下几项基本特性:

  • 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
  • 无缓存的反向代理加速,简单的负载均衡和容错.
  • FastCGI,简单的负载均衡和容错.
  • 模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
  • 支持SSL 和 TLSSNI.

          Nginx具有很高的稳定性。其它HTTP服务器,当遇到访问的峰值,或者有人恶意发起慢速连接时,也很可能会导致服务器物理内存耗尽频繁交换,失去响应,只能重启服务器。例如当前apache一旦上到200个以上进程,web响应速度就明显非常缓慢了。而Nginx采取了分阶段资源分配技术,使得它的CPU与内存占用率非常低。nginx官方表示保持10,000个没有活动的连接,它只占2.5M内存,所以类似DOS这样的攻击对nginx来说基本上是毫无用处的。就稳定性而言,nginx比lighthttpd更胜一筹。

二,nginx的架构

一,Nginx整体架构

Nginx在启动后,会有两进程,最基本有master process(主进程)和worker process(工作进程),类似于主从reactor线程模型,主从结构实现同步非堵塞,提供并发哪里

master进程主要用来管理worker进程,包含:接收客户端的信号,向各worker进程发送指令,监控worker进程的运行状态,当worker进程退出后(异常情况),会重新启动新的worker进程

worker进程则负责处理基本的网络事件,多个worker进程之间是对等的,它们同等竞争来自客户端的请求,各进程互相之间是独立的,一个请求,只可能在worker进程中处理,master进程不负责具体的客户端处理,worker可以设置多个,一般会设置与机器cpu核数一致

二,Nginx的核心进程模型

启动nginx的主进程将充当监控进程,通过fork()出来的子进程则充当worker进程,nginx也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,没有监控进程

三,master进程

监控进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能

master进程中for(::)无限循环内有一个关键的sigsuspend()函数调用,该函数调用是的master进程的大部分时间都处于挂起状态,直到master进程收到信号为止。

master进程通过检查一下7个标志位来决定ngx_master_process_cycle方法的运行:

  • sig_atomic_t ngx_reap;
  • sig_atomic_t ngx_terminate;
  • sig_atomic_t ngx_quit;
  • sig_atomic_t ngx_reconfigure;
  • sig_atomic_t ngx_reopen;
  • sig_atomic_t ngx_change_binary;
  • sig_atomic_t ngx_noaccept;
信号
对应进程中的全局标志位变量
意义
QUIT
ngx_quit
优雅地关闭整个服务
TERM或INT
ngx_terminate
强制关闭整个服务
USR1
ngx_reopen
重新打开服务中的所有文件
WINCH
ngx_noaccept
所有子进程不再接受处理新的连接,实际相当于对所有子进程发送QUIT信号
USR2
ngx_change_binary
平滑升级到新版本的Nginx程序
HUP
ng_reconfigure
重读配置文件
CHLD
ngx_reap
有子进程以外结束,需要监控所有子进程

四,worker进程

worker进程的主要任务是完成具体的任务逻辑。其主要关注点是与客户端或后端真实服务器(此时nginx作为中间代理)之间的数据可读/可写等I/O交互事件,所以工作进程的阻塞点是在像select()、epoll_wait()等这样的I/O多路复用函数调用处,以等待发生数据可读/写事件。当然也可能被新收到的进程信号中断master进程如何通通知worker进程去做某些工作呢?采用的是信号当收到信号时,信号处理函数ngx_signal_handler()就会执行

对于worker进程的工作方法ngx_worker_process_cycle来说,它主要关注4个全局标志位:

  • sig_atomic_t ngx_terminate;//强制关闭进程
  • sig_atomic_t ngx_quit;//优雅地关闭进程(有唯一一段代码会设置它,就是接受到QUIT信号。ngx_quit只有在首次设置为1,时,才会将ngx_exiting置为1)
  • ngx_uint_t ngx_exiting;//退出进程标志位
  • sig_atomic_t ngx_reopen;//重新打开所有文件

其中ngx_terminate、ngx_quit、ngx_reopen都将由ngx_signal_handler根据接受到的信号来设置。ngx_exiting标志位仅由ngx_worker_cycle方法在退出时作为标志位使用。

三,正向代理和反向代理(插述)

通俗的说正向代理就是代理客户端,反向代理就是代理服务器端

一,直连访问

直连访问:用户通过浏览器直接通过域名访问目标服务器,不通过中间代理的方式

二,正向代理

Nginx不仅可以做反向代理,实现负载均衡,还可以做正向代理进行上网等功能

正向代理:在Internet广域网中有很多服务器他们分别有对于的域名,那么局域网中的客户端要通过域名访问服务器,需要通过中间代理服务器来访问目标服务器,这种代理方式叫做正向代理(客户端代理)

三,反向代理

    客户端对反向代理是无感知的,因为客户端不需要任何配置就可以访问,我们只需要将请求发送给反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是反向代理服务器地址,隐藏了真实服务器IP地址

反向代理:对服务器端的代理,对客户端的请求进行服务器端的转发

四,Nginx的安装(两种方式)

一,源码安装

一,下载Nginx

下载地址:https://nginx.org/

下载版本:1.18(自选)

二,安装Nginx

一,Nginx的依赖文件

Nginx运行前需要安装四个依赖

一,GCC编译器

Nginx是使用C语言编写的程序,因此想要运行Nginx就必须先进行编译,GCC就是一个开源的C语言编译器集合,可以用于各种各样的语言,其中就包含C语言

安装命令:yun -y install gcc 

安装成功后,可以通过gcc --version来查看gcc是否安装成功

二,PCRE

Nginx在编译过程中需要使用到PCRE库(兼容正则表达式的库),因为在Nginx的Rewrite模块和http核心模块都会使用到PCRE正则表达式语法

安装命令:yum -y install pcre pcre-devel

安装后通过rpm -qa pcre pcre-devel查看是否安装成功

三,zlib

zlib库提供了开发人员的压缩算法,在Nginx的各个模块中需要使用gzip压缩,所以我们也需要提取安装其库及源代码zlib和zlib-devel

安装命令:yum -y install zlib zlib-devel

安装后通过rpm -qa zlib zlib-devel查看是否安装成功

四,OpenSSL

OpenSSL是一个开源代码的安全通信软件库包,应用程序可以使用这个包进行安全通信,并且避免被窃听

SSL:secure Socket Layel 安全套接协议的缩写,可以在Internet上提供秘密性传输,其目标是保证两个应用间通信的保密性和可靠性,在Nginx中,如果服务器需要提供安全网页时就需要用到OpenSSL库,所以我们需要对OpenSSL的库文件及它的开发安装包进行一个安装

安装命令:yum -y install openssl openssl-devel

安装后通过rpm -qa openssl openssl-devel查看是否安装成功

一条命令全部安装:yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel

二,安装nginx

① Nginx文件压缩包上传

注:用wget 网络url 的方式下载就跳过

上传方式:

  • rz命令
  • xftp工具
  • winscp工具

② 解压

命令:tar -zxvf 压缩包

③ 进入解压目录运行configure进行配置加载

ngonx目录中有一个可执行文件configure,它可以检查配置和将配置进行加载初始

④ 执行GCC中的make命令将nginx进行编译安装

命令:make install

⑤ 启动nginx

nginx make安装默认的启动目录:/usr/local/nginx/sbin

⑥ 浏览器查看nginx

关闭防火墙:systemctl stop firewalld

直接输入IP地址访问,不需要加端口号

二,二进制包安装

使用源码包进行简单安装,安装过程比较繁琐,需要提前安装GCC编译器,PCRE兼容正则表达式库,zlib压缩库,OpenSSL安全通信软件包,然后才能安装nginx,使用官方提供的二进制包yum安装方式就可以避免这些麻烦

① 安装yum工具包

命令:install -y yum-utils

② 添加nginx安装配置到yum源文件

新建源文件:couth /etc/yum.repos.d/nginx.repo

添加内容:

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

③ 执行安装命令

命令:yum install nginx

④ 查找启动文件并启动

查询系统中与nginx相关的目录:whereis nginx

找到目录启动nginx即可

三,安装后的目录结构

Nginx通过make编译安装后,默认的安装在/usr/local/nginx目录下

  • _temp结尾的文件:启动nginx时,产生的临时文件
  • conf:nginx的配置文件
  • html:存放页面文件
  • logs:日志文件
  • sbin:启动文件

一,conf文件目录

CGI(Common Gateway interface)通用网关接口,主要解决的问题是从客户端发送一个请求和数据,服务端获取到请求和数据后可以调用CGI程序处理及相应结果给客户端的一种标准规范

fastcgi,uwcgi,scgi都是实现了CGI网关接口的一些性能比较高的协议

1,fastcgi相关配置文件
  • fastcgi.conf:fastcgi主配置文件
  • fastcgi.conf.default:fastcgi的备份文件
  • fastcgi_parems:fastcgi参数文件
  • fastcgi_parems_default:fastcgi参数备份文件
2, scgi相关配置文件
  • scgi_params:scgi的相关参数文件
  • scgi_params_default:参数备份文件

3, uwcgi相关配置文件

  • uwcgi_params:uwcgi的相关参数文件
  • uwcgi_params_default:参数备份文件

4,编解码转化相关文件

  • koi-utf
  • koi-win
  • win-utf

5,mime配置

mime文件记录了文件后缀名和mime类型的关系,通过mime可以对文件进行识别

  • mime.type:mime配置文件
  • mime.type.default:备份文件

6,nginx核心配置文件

  • nginx.conf:nginx的核心配置文件
  • nginx.conf.default:核心配置文件的备份

二,html静态页面文件目录

这个目录只有两个文件

  • index.html:访问nginx成功出现的页面
  • 50x.html:访问nginx报错出现的页面

三,logs日志目录

  • access.log:访问日志
  • error.log:错误日志
  • nginx.pid:nginx进程PID

四,sbin可执行目录

这个目录只有一个nginx的运行文件