Nginx

简介

        Nginx(发音类似于 "engine X")是一个高性能的开源Web服务器和反向代理服务器,它以其内存占用少、并发处理能力强而受到广泛欢迎。Nginx由Igor Sysoev创建,并于2004年首次公开发布。它采用异步事件驱动架构,能够有效地处理大量并发连接,适合构建高流量的网站和服务。Nginx还支持负载均衡、缓存静态文件、SSL/TLS加密通信等功能,并且具有良好的可扩展性和稳定性。

        Nginx在2019年3月11日被F5 Networks以6.7亿美元的价格收购,Nginx是免费、开源、高性能的HTTP服务器、反向代理服务器、邮件代理服务器及TCP/UDP代理服务器,解决了C10K问题(10K Connections)

        Nginx官网

nginx newsicon-default.png?t=N7T8https://nginx.org/        基于Nginx开发的二次发行版

        Tengine:Tengine是一个由中国的淘宝网团队基于Nginx进行二次开发的Web服务器和反向代理服务器。它包含了许多针对大型互联网站点优化的特性,例如动态模块加载、高级负载均衡策略、CDN集成、GSLB(全局服务器负载均衡)等。Tengine旨在提供更高的性能和更灵活的配置选项,以满足复杂的网络环境和业务需求。Tengine项目是开源的,并且经常更新以引入新功能和改进现有功能。

        Tengine官网

The Tengine Web Server (taobao.org)icon-default.png?t=N7T8https://tengine.taobao.org/        OpenResty:OpenResty是一个基于Nginx和LuaJIT的高性能Web平台,它允许开发者构建可扩展的Web应用、Web服务和动态网关。OpenResty通过集成多种精心设计的Nginx模块(多数由OpenResty团队自行开发),将Nginx服务器转变为一个强大的通用Web应用平台。OpenResty社区提供免费技术支持,而OpenResty公司提供基于OpenResty的企业解决方案和商业支持。开发者可以通过官方网站获取OpenResty的源代码,并参考官方文档和教程来快速设置和学习如何使用OpenResty。

        OpenResty官网

OpenResty® - Open sourceicon-default.png?t=N7T8https://openresty.org/

功能介绍

        高性能的HTTP和反向代理服务:Nginx能够处理大量的并发连接,适合在高流量的网站上使用。

        负载均衡:Nginx支持多种负载均衡算法,如轮询(Round Robin)、加权轮询、最少连接(Least Connections)和哈希(Hash)等,可以将请求分发到不同的后端服务器,提高系统的整体处理能力和可用性。

        静态文件服务:Nginx擅长处理静态内容,如HTML、图片和CSS文件,能够有效地提供这些资源。

        缓存:Nginx支持本地缓存,可以缓存静态内容和动态内容(通过FastCGI或其他代理服务器),减少对后端服务器的请求次数,加快响应速度。

        SSL终端处理:Nginx可以直接处理SSL/TLS加密,提供HTTPS服务,无需额外的代理。

        邮件代理服务:Nginx支持IMAP/POP3代理服务,可以作为邮件服务器的前端代理。

基础特性

        高级HTTP特性:Nginx提供了包括URL重写、自定义日志格式、限制请求速率等高级HTTP处理功能。

        微内核和模块化设计:Nginx的核心功能和额外特性通过模块实现,易于扩展和定制。

        热配置重载:Nginx可以在不中断服务的情况下重新加载配置文件,方便进行维护和更新。

        支持多种操作系统:Nginx可以在多种Unix-like系统上运行,包括Linux、FreeBSD、macOS等,并且有Windows移植版。

架构和进程

 进程结构

Web请求处理机制

        多进程方式:服务器每接收到客户端请求,主进程就会生成一个子进程响应客户端,直到客户端关闭连接;该方式的优势是处理速度快,子进程间相互独立,但过量访问会导致服务器资源 耗尽而无法提供请求。

        多线程方式;服务器每收到客户端请求,服务进程就会生成一个线程响应客户端,一个线程的开销 远小于一个进程,因此多线程方式很大程度减轻了Web服务器对系统资源的要求,但多线程也有缺点,当多个线程位于同一个进程内工作时,可以互相访问相同的内存地址空间,所以他们可以相互影响,一旦进程挂掉,所有子线程都无法工作。

        Nginx是多进程方式模型,是由一个Master(主进程)和Worker(工作进程)组成。

进程功能

        主进程(Master process) 

        读取和加载配置文件:主进程在启动时读取并验证Nginx的配置文件,并将其加载到内存中。

        初始化工作进程:主进程根据配置文件中的worker_processes指令创建相应数量的工作                                               进程。

        监控工作进程:监控工作进程的运行状态,并在工作进程异常中止时重新启动新的工作进                                       程。

        处理信号:主进程接收来自操作系统的信号,并根据信号的类型执行相应的操作,如平滑重                              启、平滑升级、平滑回滚、停止服务等。

        管理日志文件:主进程负责管理错误日志和访问日志的滚动和重命名。

        socket管理:建立、绑定和关闭socket的连接

        工作进程(Worker process)

        处理客户端请求:工作进程接收客户端的HTTP请求,并根据配置文件中的指令进行处理,如反向代理、负载均衡、静态文件服务等。

        执行网络I/O操作:工作进程使用异步非阻塞的方式处理网络事件,如接受新连接、读取和写入数据,提高了处理并发连接的能力。

        资源隔离:每个工作进程在内存和文件描述符等资源上是独立的,这样可以防止一个进程的崩溃影响到其他进程。

        执行配置文件中的指令:工作进程执行主进程加载的配置文件中的指令,完成各种网络服务任务。

进程间通信机制

        套接字通信

        Nginx使用套接字通信来实现主进程(master process)和工作进程(worker processes)之间的通信。在Nginx服务启动过程中,主进程根据配置文件,使用fork()函数创建相应数量的工作进程;主进程会建立一张全局的工作进程表,存放当前生成的工作进程,有新的工作进程生成后也会加入工作进程表中;主进程会建立一个单向的管道并使用其传递工作给工作进程,该管道包含了主进程向工作进程发出的指令、工作进程的ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。

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

        工作进程之间的通信原理与主进程和工作进程间一致,但工作进程之间是完全隔离的,因此一个工作进程想要获取另一个工作进程的状态,需要通过主进程实现。

        主进程在生成工作进程后,在工作进程表中进行遍历,将该进程的PID以及为该进程建立的管道句柄传递给其他工作进程,为工作进程间的通信做准备,当工作进程1向工作进程2发送指令时,首先会在主进程传递给它的其他工作进程的信息中找到工作进程2的PID,之后会发送指令指向工作进程2的管道,工作进程2捕获到管道中的指令后,会解析并进行相关操作。

 模块介绍

        核心模块:这些是Nginx的基础模块,提供了服务器运行所必需的核心功能,如事件处理、配置文件解析等。

        标准HTTP模块:这些模块提供了HTTP协议相关的功能,如处理HTTP请求和响应、设置HTTP头信息等。

        可选HTTP模块:这些模块提供了额外的HTTP功能,如URL重写、地理位置信息处理等。

        邮件服务模块:这些模块支持邮件服务,如SMTP、IMAP和POP3。

        第三方模块:由社区或其他组织开发,用于增加Nginx的特定功能,如JSON支持、Lua脚本支持等。

        常见模块及用途

        ngx_http_core_module:提供HTTP协议的支持,包括配置HTTP段、server虚拟主机段、location段等。

        ngx_http_gzip_module:使用gzip方法压缩响应,减少传输数据大小,提高请求返回速度。

         ngx_http_proxy_module:允许将请求转发到其他服务器,实现反向代理服务器的功能。

         ngx_http_rewrite_module:使用PCRE正则表达式更改请求的URI、返回重定向或判断选择对应的配置项。

        ngx_http_upstream_module:用于用户分发到不同的服务器节点,支持多种后端服务器类型。

 Nginx编译安装

        在官网下载需要的nginx版本

nginx: downloadicon-default.png?t=N7T8https://nginx.org/en/download.html

        下载编译安装需要用到的编译器及软件库

yum install -y gcc pcre-devel zlib-devel openssl-devel

         解压nginx压缩包并进入

tar zxf nginx-1.24.0.tar.gz

        查看环境依赖帮助

./configure --help

        检查所需要的参数的环境 

 ./configure --prefix=/usr/local/nginx \
> --user=nginx \
> --group=nginx \
> --with-http_ssl_module \
> --with-http_v2_module \
> --with-http_realip_module \
> --with-http_gzip_static_module \
> --with-http_stub_status_module \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module \
> --with-pcre 

        关闭debug模式,减小文件体积

vim auto/cc/gcc

         编译并安装

make && make install

         设置控制文件

vim /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 ~]# systemctl daemon-reload
[root@Nginx ~]# systemctl start nginx

        添加可执行权限

chmod +x /lib/systemd/system/nginx.service

         创建用户nginx  

useradd -s /sbin/nologin -M nginx

        为nginx添加环境变量

vim ~/.bash_profile

export PATH=$PATH:/usr/local/nginx/sbin

         nginx常用命令

nginx -h|-?        nginx帮助

 nginx -V        查看nginx详细信息

nginx -v        查看nginx版本信息

nginx -t        检查配置文件语法和结构

nginx -T        与-t类似,但会将配置信息输出至控制台

nginx -q        在配置测试期间,抑制非错误消息的输出,通常与-t、-T一起使用

nginx -p /path/nginx        去/path/nginx下寻找nginx配置文件

nginx -e /path        设置nginx错误日志文件的路径

nginx -c /path        设置nginx配置文件的路径

nginx -g directives        设置全局指令,不能和配置文件通知配置

nginx -s stop|quit|reopen|reload        向nginx主进程发送信号,用于控制nginx运行状态,如重启、平滑重载等

ps aux | grep nginx    #查看nginx进程

 平滑升级

        在不停止服务的情况下,进行新模块添加或版本升级

        获取新版本以及需要添加的组件并解压

         进入新版本文件目录,检查环境变量

./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_gzip_static_module \
> --with-http_stub_status_module \
> --with-pcre \
> --with-stream \
> --with-stream_ssl_module \
> --with-stream_realip_module 

        编译文件,不安装

[root@Nginx nginx-1.26.2]# make

        备份旧配置文件

cd /usr/local/nginx/sbin/
mv nginx nginx.bak_24

        将新配置文件复制至目录,并检查新配置文件

\cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/
nginx -t

        更新nginx

[root@Nginx sbin]# nginx -v
nginx version: nginx/1.24.0

[root@Nginx sbin]# ps aux | grep nginx
root       20323  0.0  0.0   8672   820 ?        Ss   14:50   0:00 nginx: master process nginx
nginx      20324  0.0  0.2   9436  3364 ?        S    14:50   0:00 nginx: worker process
root       20340  0.0  0.1  22108  2428 pts/2    S+   14:51   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -USR2 20323
[root@Nginx sbin]# ps aux | grep nginx
root       20323  0.0  0.1   8672  2512 ?        Ss   14:50   0:00 nginx: master process nginx
nginx      20324  0.0  0.2   9436  3364 ?        S    14:50   0:00 nginx: worker process
root       20343  0.0  0.4   8716  5968 ?        S    14:51   0:00 nginx: master process nginx
nginx      20344  0.0  0.2   9476  3376 ?        S    14:51   0:00 nginx: worker process
root       20346  0.0  0.1  22108  2316 pts/2    S+   14:51   0:00 grep --color=auto nginx
[root@Nginx sbin]# nginx -v
nginx version: nginx/1.26.2

        客户端访问的版本还是旧版本

         回收旧版本

[root@Nginx sbin]# ps aux | grep nginx
root       20323  0.0  0.1   8672  2512 ?        Ss   14:50   0:00 nginx: master process nginx
nginx      20324  0.0  0.2   9436  3364 ?        S    14:50   0:00 nginx: worker process
root       20343  0.0  0.4   8716  5968 ?        S    14:51   0:00 nginx: master process nginx
nginx      20344  0.0  0.2   9476  3376 ?        S    14:51   0:00 nginx: worker process
root       20571  0.0  0.1  22108  2240 pts/2    S+   18:53   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -WINCH 20323
[root@Nginx sbin]# ps aux | grep nginx
root       20323  0.0  0.1   8672  2512 ?        Ss   14:50   0:00 nginx: master process nginx
root       20343  0.0  0.4   8716  5968 ?        S    14:51   0:00 nginx: master process nginx
nginx      20344  0.0  0.2   9476  3376 ?        S    14:51   0:00 nginx: worker process
root       20573  0.0  0.1  22108  2336 pts/2    S+   18:54   0:00 grep --color=auto nginx

         客户端访问版本更新为新版本

 平滑回滚

        如果升级的新版本发现问题,可以回滚至旧版本

        替换配置文件

[root@Nginx sbin]# ll
总用量 13308
-rwxr-xr-x 1 root root 7084280  8月 17 14:20 nginx
-rwxr-xr-x 1 root root 6540368  8月 17 00:27 nginx.bak_24
[root@Nginx sbin]# mv nginx nginx.bak_26
[root@Nginx sbin]# mv nginx.bak_24 nginx
[root@Nginx sbin]# ll
总用量 13308
-rwxr-xr-x 1 root root 6540368  8月 17 00:27 nginx
-rwxr-xr-x 1 root root 7084280  8月 17 14:20 nginx.bak_26

        回滚版本

 [root@Nginx sbin]# ps aux | grep nginx
root       20645  0.0  0.1   8672  2516 ?        Ss   19:12   0:00 nginx: master process nginx
root       20665  0.0  0.4   8716  5956 ?        S    19:13   0:00 nginx: master process nginx
nginx      20666  0.0  0.2   9476  3380 ?        S    19:13   0:00 nginx: worker process
root       20711  0.0  0.1  22108  2292 pts/2    S+   19:33   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -HUP 20645
[root@Nginx sbin]# ps aux | grep nginx
root       20645  0.0  0.1   8672  2516 ?        Ss   19:12   0:00 nginx: master process nginx
root       20665  0.0  0.4   8716  5956 ?        S    19:13   0:00 nginx: master process nginx
nginx      20666  0.0  0.2   9476  3380 ?        S    19:13   0:00 nginx: worker process
nginx      20712  0.0  0.2   9436  3432 ?        S    19:34   0:00 nginx: worker process
root       20714  0.0  0.1  22108  2096 pts/2    S+   19:34   0:00 grep --color=auto nginx
[root@Nginx sbin]# kill -WINCH 20665
[root@Nginx sbin]# ps aux | grep nginx
root       20645  0.0  0.1   8672  2516 ?        Ss   19:12   0:00 nginx: master process nginx
root       20665  0.0  0.4   8716  5956 ?        S    19:13   0:00 nginx: master process nginx
nginx      20712  0.0  0.2   9436  3432 ?        S    19:34   0:00 nginx: worker process
root       20716  0.0  0.1  22108  2288 pts/2    S+   19:35   0:00 grep --color=auto nginx

        客户端版本状态

添加子配置文件

        为不同服务划分配置文件,避免所有配置文件都在同一文件中

mkdir /usr/local/nginx/conf/conf.d
vim nginx.conf

nginx -s reload

nginx的Web服务器

http://t.csdnimg.cn/NgkxRicon-default.png?t=N7T8http://t.csdnimg.cn/NgkxRnginx的代理服务器

http://t.csdnimg.cn/ERYsqicon-default.png?t=N7T8http://t.csdnimg.cn/ERYsq

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值