初始nginx

华子目录

nginx介绍

  • nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器

  • nginx官网:http://nginx.org

  • nginx的其它二次发行版:

  • Tengine:由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。从2011年12月开始,Tengine成为一个开源项目官网: http://tengine.taobao.org/
  • OpenResty:基于Nginx与Lua语言的高性能Web平台, 章亦春团队开发,官网:http://openresty.org/cn/

nginx功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理)
  • imap4/pop3协议的反向代理

基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

web服务相关功能

  • 虚拟主机(server)
  • 支持keep-alive和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无需中断客户的工作进程

nginx进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求
  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定

Nginx是多进程组织模型,而且是一个由Master主进程和多个Worker工作进程组成


主进程(master process)的功能:

  • 对外接口:接收外部的操作(信号)
  • 对内转发:根据外部操作的不同,通过信号管理Worker
  • 监控:监控worker进程的运行状态,worker进程异常终止后,自动重启worker进程
  • 读取Nginx配置文件并验证其有效性和正确性
  • 建立、绑定和关闭socket连接
  • 按照配置生成、管理和结束worker工作进程
  • 接受外界指令,比如重启、升级及退出服务器等指令
  • 不中断服务,实现平滑升级,重启服务并应用新的配置
  • 开启日志文件,获取文件描述符
  • 不中断服务,实现平滑升级,升级失败进行回滚处理
  • 编译和处理perl脚本

工作进程(worker process)的功能:

  • 所有Worker进程都是平等的
  • 实际处理:网络请求,由Worker进程处理
  • Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源(worker进程数量一般与cpu核心数一一对应)
  • 增加上下文切换的损耗
  • 接受处理客户的请求
  • 将请求依次送入各个功能模块进行处理
  • I/O调用,获取响应数据
  • 与后端服务器通信,接收后端服务器的处理结果
  • 缓存数据,访问缓存索引,查询和调用缓存数据
  • 发送请求结果,响应客户的请求
  • 接收主程序指令,比如重启、升级和退出等

nginx进程间通信

  • 工作进程是由主进程生成的,主进程使用fork()函数在Nginx服务器启动过程中主进程根据配置文件决定启动worker工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的workder工作进程,主进程生成worker工作进程后会将新生成的worker工作进程加入到worker工作进程表中,并建立一个单向的管道并将其传递给worker工作进程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息
  • 主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互
  • worker进程之间的通信原理基本上和主进程与worker进程之间的通信是一样的,只要worker进程之间能够取得彼此的信息,建立管道即可通信,但是由于worker进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息,就只能通过主进程来实现
  • 为了实现worker进程之间的交互,master进程在生成worker进程之后,在worker进程表中进行遍历,将该新进程的PID以及针对该进程建立的管道句柄传递给worker进程中的其他进程,为worker进程之间的通信做准备,当worker进程1向worker进程2发送指令的时候,首先在master进程给它的其他worker进程工作信息中找到2的进程PID,然后将正确的指令写入指向进程2的管道,worker进程2捕获到管道中的事件后,解析指令并进行相关操作,这样就完成了worker进程之间的通信
  • 另外worker进程可以通过共享内存来通讯,比如upstream中的zone,或者limit_req、limit_conn中的zone等。操作系统提供了共享内存机制

nginx启动与http连接建立

  • Nginx启动时,Master进程加载配置文件
  • Master进程,初始化监听的socket
  • Master进程,fork出多个Worker进程
  • Worker进程,竞争新的连接,获胜方通过三次握手,建立Socket连接,并处理请求

http处理过程

nginx模块介绍

nginx有多种模块

  • 核心模块:是Nginx服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供HTTP协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置等等
  • 可选HTTP模块:主要用于扩展标准的HTTP功能,让Nginx能处理一些特殊的服务,比如:Flash
  • 多媒体传输 、解析GeoIP请求、网络传输压缩、安全协议SSL支持等
  • 邮件服务模块:主要用于支持Nginx的邮件服务,包括对POP3协议、IMAP协议和SMTP协议的支持
  • Stream服务模块:实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展Nginx服务器应用,完成开发者自定义功能,比如:Json支持、Lua支持等

模块分类:

bash 复制代码
核心模块:core module
标准模块:
HTTP模块: ngx_http_*
Mail模块: ngx_mail_*
Stream模块:ngx_stream_*
第三方模块

nginx命令演示

bash 复制代码
#-v只会列出nginx的版本
[root@nginx-node1 ~]# nginx -v
nginx version: nginx/1.24.0

#-V会列出编译时用到的模块和nginx版本
[root@nginx-node1 ~]# nginx -V
nginx version: nginx/1.24.0
built by gcc 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
built with OpenSSL 3.0.1 14 Dec 2021
TLS SNI support enabled
configure arguments: --prefix=/usr/local/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
bash 复制代码
#-t检查nginx主配置是否正确
[root@nginx-node1 ~]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
bash 复制代码
#优雅停止服务,即所有请求处理完后退出服务
[root@nginx-node1 ~]# nginx -s quit  

#强行停止服务
[root@nginx-node1 ~]# nginx -s stop  

#重新加载配置文件
#在不关闭nginx的情况下,重新reload加载配置文件后,会回收旧的worker进程,重新起一个新的worker进程,master进程不变
[root@nginx-node1 ~]# nginx -s reload
bash 复制代码
#-g:开启nginx时,指定全局配置
[root@nginx-node1 ~]# nginx -g "worker_processes 1;"
bash 复制代码
[root@nginx-node1 ~]# nginx -s stop
[root@nginx-node1 ~]# nginx -g "worker_processes 6;"
[root@nginx-node1 ~]# ps -axf | grep nginx
    770 ?        Ss     0:00 avahi-daemon: running [nginx-node1.local]
   3128 pts/2    S+     0:00  |           \_ grep --color=auto nginx
   3120 ?        Ss     0:00 nginx: master process nginx -g worker_processes 6;
   3121 ?        S      0:00  \_ nginx: worker process
   3122 ?        S      0:00  \_ nginx: worker process
   3123 ?        S      0:00  \_ nginx: worker process
   3124 ?        S      0:00  \_ nginx: worker process
   3125 ?        S      0:00  \_ nginx: worker process
   3126 ?        S      0:00  \_ nginx: worker process
  • 通过-g参数指定的配置,这个配置一定是配置文件中没有的或被注释掉的,如果配置文件中有这个配置,则会报错
相关推荐
程序员-Benothing39 分钟前
Vim编辑器从入门到精通:模式、快捷键、配置、插件
linux·运维·服务器
m0_646429971 小时前
Docker 完整核心知识点总结(超通俗易懂版)
运维·docker·容器
‎ദ്ദിᵔ.˛.ᵔ₎1 小时前
linux 进程信号 (上)
linux·服务器
亚川楼宇自控系统数据中心厂家1 小时前
IBMS 集成管理系统:如何打通楼宇自控实现建筑一体化管控
运维
15Moonlight1 小时前
Linux网络(02):Socket 编程 UDP
linux·网络·udp
迪康Defender1 小时前
终端安全审批体系设计:如何平衡安全管控与业务连续性
运维·服务器·安全·运维开发·学习方法·业界资讯·远程工作
wuminyu2 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
liulilittle2 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
DongQiShanRen2 小时前
玄龙(上):TICK 主循环——意识心跳怎么跳
linux·jvm·数据库·人工智能·数据挖掘·rust
小此方2 小时前
Linux网络(二十一):深入理解 TCP 异常处理:网线断开、Keepalive 保活机制与 Linux 内核传输层协议源码剖析
linux·网络·tcp/ip