nginx简介
Nginx:engine X ,2002年开发,分为社区版和商业版(nginx plus )
2019年3月11日 F5 Networks 6.7亿美元的价格收购
Nginx是免费的、开源的、高性能的HTTP和反向代理服务器、邮件代理服务器、以及TCP/UDP代理服务器
功能介绍
静态的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及用户的访问控制
支持速率限制及并发数限制
重新配置和在线升级而无须中断客户的工作进程
架构和进程

web请求处理机制
多进程方式:
服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
多线程方式:
与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
Nginx是多进程方式模型,是由一个Master(主进程)和Worker(工作进程)组成。
主进程(Master process) 功能
读取和加载配置文件:主进程在启动时读取并验证Nginx的配置文件,并将其加载到内存中。
初始化工作进程:主进程根据配置文件中的worker_processes指令创建相应数量的工作进程。
监控工作进程:监控工作进程的运行状态,并在工作进程异常中止时重新启动新的工作进 程。
处理信号:主进程接收来自操作系统的信号,并根据信号的类型执行相应的操作,如平滑重 启、平滑升级、平滑回滚、停止服务等。
管理日志文件:主进程负责管理错误日志和访问日志的滚动和重命名。
socket管理:建立、绑定和关闭socket的连接
工作进程(Worker process)功能
处理客户端请求:工作进程接收客户端的HTTP请求,并根据配置文件中的指令进行处理,如反向代理、负载均衡、静态文件服务等。
执行网络I/O操作:工作进程使用异步非阻塞的方式处理网络事件,如接受新连接、读取和写入数据,提高了处理并发连接的能力。
资源隔离:每个工作进程在内存和文件描述符等资源上是独立的,这样可以防止一个进程的崩溃影响到其他进程。
执行配置文件中的指令:工作进程执行主进程加载的配置文件中的指令,完成各种网络服务任务。
Nginx 进程间通信
工作进程是由主进程生成的,主进程使用fork()函数,在Nginx服务器启动过程中主进程根据配置文件决 定启动工作进程的数量,然后建立一张全局的工作表用于存放当前未退出的所有的工作进程,主进程生 成工作进程后会将新生成的工作进程加入到工作进程表中,并建立一个单向的管道并将其传递给工作进 程,该管道与普通的管道不同,它是由主进程指向工作进程的单向通道,包含了主进程向工作进程发出 的指令、工作进程ID、工作进程在工作进程表中的索引和必要的文件描述符等信息。
主进程与外界通过信号机制进行通信,当接收到需要处理的信号时,它通过管道向相关的工作进程发送 正确的指令,每个工作进程都有能力捕获管道中的可读事件,当管道中有可读事件的时候,工作进程就 会从管道中读取并解析指令,然后采取相应的执行动作,这样就完成了主进程与工作进程的交互。
Nginx 模块介绍
nginx 有多种模块
核心模块:这些是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高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
Nginx 源码安装
nginx官网下载地址:nginx: download
编译需要的工具


解压这三个模块

安装模块
进入到 /root/nginx-1.26.1 目录中输入命令

[root@nginx ~]# cd /root/nginx-1.26.1
[root@php nginx-1.26.1]# ./configure --prefix=/usr/local/nginx \
--add-module=/root/echo-nginx-module-0.63 \
--add-module=/root/memc-nginx-module-0.20 \
--add-module=/root/srcache-nginx-module-0.33 \
--user=nginx \
--group=nginx \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-stream --with-stream_ssl_module \
--with-stream_realip_module \
--with-pcre
关闭debug模式,减小文件体积
bash
vim auto/cc/gcc

编译安装
bash
[root@nginx ~]# cd /root/nginx-1.26.1
[root@nginx nginx-1.26.1]# make && make install
nginx配置
bash
#启动nginx
[root@nginx nginx-1.26.1]# /usr/local/nginx/sbin/nginx
#加入环境变量
[root@nginx nginx-1.26.1]# vim ~/.bash_profile
1 # .bash_profile
2
3 # Get the aliases and functions
4 if [ -f ~/.bashrc ]; then
5 . ~/.bashrc
6 fi
7
8 # User specific environment and startup programs
9 export PATH=$PATH:/usr/local/nginx/sbin
[root@nginx nginx-1.26.1]# source ~/.bash_profile
[root@nginx nginx-1.26.1]# nginx -V
nginx version: nginx/1.26.1
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 --add-module=/root/echo-nginx-module-0.63 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33 --user=nginx --group=nginx --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-pcre
[root@nginx nginx-1.26.1]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
设置控制文件
bash
[root@nginx ~]# 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
平滑升级和回滚
平滑升级
在不停止服务的情况下,进行新模块添加或版本升级
获取新版本以及需要添加的组件并解压

进入新版本文件目录,检查环境变量
bash
./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
编译文件,不安装
bash
[root@Nginx nginx-1.26.2]# make
备份旧配置文件
bash
cd /usr/local/nginx/sbin/
mv nginx nginx.bak_24
将新配置文件复制至目录,并检查新配置文件
bash
\cp -f /root/nginx-1.26.2/objs/nginx /usr/local/nginx/sbin/
nginx -t
更新nginx
bash
[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
回收旧版本
bash
[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
平滑回滚
如果升级的新版本发现问题,可以回滚至旧版本
替换配置文件
bash
[root@Nginx sbin]# cp nginx nginx.26
[root@Nginx sbin]# ls
nginx nginx.24 nginx.26
[root@Nginx sbin]# mv nginx.24 nginx
mv: overwrite 'nginx'? y
[root@Nginx sbin]# kill -HUP 48732
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52076 0.0 0.2 14208 5124 ? S 15:41 0:00 nginx: worker
process
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
[root@Nginx sbin]# kill -WINCH 52075
[root@Nginx sbin]# ps aux | grep nginx
root 48732 0.0 0.1 9868 2436 ? Ss 14:17 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
root 52075 0.0 0.3 9876 6528 ? S 15:41 0:00 nginx: master
process /usr/local/nginx/sbin/nginx
nobody 52130 0.0 0.2 14200 4868 ? S 16:30 0:00 nginx: worker
process
root 52137 0.0 0.1 221664 2176 pts/0 S+ 16:31 0:00 grep --
color=auto nginx
[root@Nginx sbin]# curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.24.0 ##版本回滚完成
Date: Thu, 18 Jul 2024 08:31:51 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Thu, 18 Jul 2024 03:41:13 GMT
Connection: keep-alive
ETag: "66988ed9-267"
Accept-Ranges: bytes
Nginx 核心配置详解
nginx 官方帮助文档:http://nginx.org/en/docs/
Nginx的配置文件的组成部分:
主配置文件:nginx.conf
子配置文件: include conf.d/*.conf
fastcgi, uwsgi,scgi 等协议相关的配置文件
mime.types:支持的mime类型,MIME(Multipurpose Internet Mail Extensions)多用途互联网邮 件扩展类型,MIME消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
nginx 配置文件格式说明
bash
配置文件由指令与指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
可以将多条指令放在同一行,用分号分隔即可,但可读性差,不推荐
指令块以{ }大括号将多条指令组织在一起,且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性
使用#符号添加注释,提高可读性
使用$符号使用变量
部分指令的参数支持正则表达式
Nginx 主配置文件的配置指令方式:
bash
directive value [value2 ...];
注意
(1) 指令必须以分号结尾
(2) 支持使用配置变量
内建变量:由Nginx模块引入,可直接引用
自定义变量:由用户使用set命令定义,格式: set variable_name value;
引用变量:$variable_name
主配置文件结构:四部分
bash
main block:主配置段,即全局配置段,对http,mail都有效
#事件驱动相关的配置
event {
...
}
#http/https 协议相关配置段
http {
默认的nginx.conf 配置文件格式说明.
..
}
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
...
}
#stream 服务器相关配置段
stream {
...
}
默认的nginx.conf 配置文件格式说明
bash
#全局配置端,对全局生效,主要设置nginx的启动用户/组,启动的工作进程数量,工作模式,Nginx的PID路
径,日志路径等。
user nginx nginx;
worker_processes 1; #启动工作进程数数量
events { #events #设置快,主要影响nginx服务器与用户的网络连接,比如是否允许同时接受多个网络连接,使用哪种事件驱动模型 #处理请求,每个工作进程可以同时支持的最大连接数,是否开启对多工作进程下的网络连接进行序列化等。
worker_connections 1024; #设置单个nginx工作进程可以接受的最大并发,作为web服务器的时候最大并发数为 #worker_connections *
worker_processes,作为反向代理的时候为
#(worker_connections * worker_processes)/2
}
http {
#http块是Nginx服务器配置中的重要部分,缓存、代理和日志格
式定义等绝大多数功能和第三方模块都 #可以在这设置,http块可
以包含多个server块,而一个server块中又可以包含多个location块,
#server块可以配置文件引入、MIME-Type定义、日志自定义、是
否启用sendfile、连接超时时间和 #单个链接的请求上限等。
include mime.types;
default_type application/octet-stream;
sendfile on; #作为web服务器的时候打开sendfile加快静态文件传输,指定是否使用
#sendfile系统调用来传输文件
#sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作)
#从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝,
#硬盘 >> kernel buffer (快速拷贝到kernelsocketbuffer) >>协议栈。
keepalive_timeout 65; #长连接超时时间,单位是秒
server {
#设置一个虚拟机主机,可以包含自己的全局快,同时也可以包含多个location模块
#比如本虚拟机监听的端口、本虚拟机的名称和IP配置,多个server 可以使用一个端口比如都使用
#80端口提供web服务
listen 80; #配置server监听的端口
server_name localhost; #本server的名称,当访问此名称的时候nginx会调用当前serevr内部的配置进程匹配。
location / { #location其实是server的一个指令,为nginx服务器提供比较多而且灵活的指令
#都是在location中体现的,主要是基于nginx接受到的请求字符串
#对用户请求的UIL进行匹配,并对特定的指令进行处理
#包括地址重定向、数据缓存和应答控制等功能都是在这部分实现
#另外很多第三方模块的配置也是在location模块中配置。
root html; #相当于默认页面的目录名称,默认是安装目录的相对路径,可以使用绝对路径配置。
index index.html index.htm; #默认的页面文件名称
}
error_page 500 502 503 504 /50x.html; #错误页面的文件名称
location = /50x.html { #location处理对应的不同错误码的页面定义到/50x.html
#这个跟对应其server中定义的目录下。
root html; #定义默认页面所在的目录
}
}
#和邮件相关的配置
#mail {
# ...
# } mail 协议相关配置段
#tcp代理配置,1.9版本以上支持
#stream {
# ...
# } stream 服务器相关配置段
#导入其他路径的配置文件
#include /apps/nginx/conf.d/*.conf
}
全局配置
Main 全局配置段常见的配置指令分类
正常运行必备的配置
优化性能相关的配置
用于调试及定位问题相关的配置
事件驱动相关的配置
全局配置说明:
bash
user nginx nginx; #启动Nginx工作进程的用户和组
worker_processes [number | auto]; #启动Nginx工作进程的数量,一般设为和CPU核心数相同
worker_cpu_affinity 00000001 00000010 00000100 00001000 | auto ;
#将Nginx工作进程绑定到指定的CPU核心,默认Nginx是不进行进程绑定的,绑定并不是意味着当前ginx进程独占以一核心CPU,但是可以保证此进程不运行在其他核心上,这就极大减少了nginx的工作进程在不同的cpu核心上的来回跳转,减少了CPU对进程的资源分配与回收以及内存管理等,因此可以有效的提升nginx服务器的性能。
CPU MASK: 00000001:0号CPU
00000010:1号CPU
10000000:7号CPU
#示例
worker_cpu_affinity 0001 0010 0100 1000;第0号---第3号CPU
worker_cpu_affinity 0101 1010;
#示例
worker_processes 4;
worker_cpu_affinity 00000010 00001000 00100000 10000000;
[root@centos8 ~]# ps axo pid,cmd,psr | grep nginx
31093 nginx: master process /apps 1
34474 nginx: worker process 1
34475 nginx: worker process 3
34476 nginx: worker process 5
34477 nginx: worker process 7
#错误日志记录配置,语法:error_log file [debug | info | notice | warn | error | crit
| alert | emerg]
#error_log logs/error.log;
#error_log logs/error.log notice;
error_log /usr/local/nginx/logs/error.log error;
#pid文件保存路径
pid /usr/local/nginx/logs/nginx.pid;
worker_priority 0; #工作进程优先级,-20~20(19)
worker_rlimit_nofile 65536; #所有worker进程能打开的文件数量上限,
#包括:Nginx的所有连接(例如与代理服务器的连接等)
#而不仅仅是与客户端的连接
#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件
数的限制
#最好与ulimit -n 或者limits.conf的值保持一致,
#修改pam限制
[root@Nginx ~]# sudo -u nginx ulimit -n
1024
[root@Nginx ~]# vim /etc/security/limits.conf
* - nofile 100000
[root@Nginx ~]# sudo -u nginx ulimit -n
100000
daemon off; #前台运行Nginx服务用于测试、docker等环境。
master_process off|on; #是否开启Nginx的master-worker工作模式,仅用于开发调试场景,默认为
on
events {
示例: 实现 nginx 的高并发配置
worker_connections 65535; #设置单个工作进程的最大并发连接数
use epoll; #使用epoll事件驱动,
#Nginx支持众多的事件驱动,
#比如:select、poll、epoll,只能设置在events模块中
设置
accept_mutex on; #on为同一时刻一个请求轮流由work进程处理,
#而防止被同时唤醒所有worker
#避免多个睡眠进程被唤醒的设置,默认为off
#新请求会唤醒所有worker进程,此过程也称为"惊群"
#因此nginx刚安装完以后要进行适当的优化。建议设置为on
multi_accept on; #on时Nginx服务器的每个工作进程可以同时接受多个新的网
络连接
#此指令默认为off,
#即默认为一个工作进程只能一次接受一个新的网络连接
#打开后几个同接受多个。建议设置为on
}
实现 nginx 的高并发配置
bash
[root@Nginx ~]# ulimit -n 102400
[root@Nginx ~]# ab -c 5000 -n 10000 http://10.0.0.8/
#默认配置不支持高并发,会出现以下错误日志
[root@Nginx ~]# tail /apps/nginx/logs/error.log
2020/09/24 21:19:33 [crit] 41006#0: *1105860 open() "/apps/nginx/html/50x.html"
failed (24: Too many open files), client: 10.0.0.7, server: localhost, request:
"GET / HTTP/1.0", host: "10.0.0.8"
2020/09/24 21:19:33 [crit] 41006#0: accept4() failed (24: Too many open files)
2020/09/24 21:19:33 [crit] 41006#0: *1114177 open()
"/apps/nginx/html/index.html" failed (24: Too many open files), client: 10.0.0.7,
server: localhost, request: "GET / HTTP/1.0", host: "10.0.0.8"
#修改配置
[root@Nginx ~]# vim /etc/security/limits.conf
* - nproc 100000
[root@Nginx ~]# vim /apps/nginx/conf/nginx.conf
worker_rlimit_nofile 100000;
[root@Nginx ~]# systemctl restart nginx
http 配置块
bash
#在响应报文中将指定的文件扩展名映射至MIME对应的类型
include /etc/nginx/mime.types;
default_type application/octet-stream; #除mime.types中的类型外
#指定其它文件的默认MIME类型,浏览
器一般会提示下载
types {
text/html html;
image/gif gif;
image/jpeg jpg;
}