简介
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 newshttps://nginx.org/ 基于Nginx开发的二次发行版
Tengine:Tengine是一个由中国的淘宝网团队基于Nginx进行二次开发的Web服务器和反向代理服务器。它包含了许多针对大型互联网站点优化的特性,例如动态模块加载、高级负载均衡策略、CDN集成、GSLB(全局服务器负载均衡)等。Tengine旨在提供更高的性能和更灵活的配置选项,以满足复杂的网络环境和业务需求。Tengine项目是开源的,并且经常更新以引入新功能和改进现有功能。
Tengine官网
The Tengine Web Server (taobao.org)https://tengine.taobao.org/ OpenResty:OpenResty是一个基于Nginx和LuaJIT的高性能Web平台,它允许开发者构建可扩展的Web应用、Web服务和动态网关。OpenResty通过集成多种精心设计的Nginx模块(多数由OpenResty团队自行开发),将Nginx服务器转变为一个强大的通用Web应用平台。OpenResty社区提供免费技术支持,而OpenResty公司提供基于OpenResty的企业解决方案和商业支持。开发者可以通过官方网站获取OpenResty的源代码,并参考官方文档和教程来快速设置和学习如何使用OpenResty。
OpenResty官网
OpenResty® - Open sourcehttps://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: downloadhttps://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/NgkxRhttp://t.csdnimg.cn/NgkxRnginx的代理服务器