nginx原理与安装
nginx配置章节:nginx原理与安装-1,nginx配置示例2,nginx配置示例3, 豆包ai,多敲几次记记关键字
一、前言
Nginx 是一款高性能的 HTTP 服务器、反向代理服务器、负载均衡器 和 IMAP/POP3/SMTP 代理服务器,其核心优势是 高并发、低内存占用、高稳定性,广泛用于生产环境的服务部署。
二、nginx整体架构
2.1、多进程 / 多线程模型
-
Nginx 采用 "master 进程 + worker 进程" 的架构,配合高效的事件驱动模型,实现高并发处理:
进程类型 作用 Master 进程(主进程) 1. 读取并验证配置文件(nginx.conf); 2. 管理 worker 进程(创建、销毁、监控); 3. 接收管理员命令(重启、停止、重载配置); 4. 不处理具体请求,仅负责管理。 Worker 进程(工作进程) 1. 实际处理客户端请求(HTTP、反向代理等); 2. 数量可配置(通常设为 CPU 核心数,充分利用多核资源); 3. 基于 epoll/kqueue 等事件驱动模型,实现 "非阻塞 I/O"。 -
关键:事件驱动与非阻塞 I/O
- 传统服务器(如 Apache prefork 模型):1 个请求对应 1 个进程 / 线程,并发量受限于进程数(上下文切换开销大)。
- Nginx :1 个 worker 进程可同时处理 成千上万 个请求,核心是 "事件驱动"------worker 进程通过 epoll 监听多个 socket 连接,当连接有数据可读 / 可写时才处理,无需阻塞等待。
-
跨平台事件驱动模型:epoll/kqueue 适配
- Linux 系统:默认使用epoll 模型 (异步非阻塞 I/O 核心),通过 "事件通知" 机制 ,单线程可高效管理数万并发连接,避免传统 select 模型的轮询性能瓶颈:
- select 模型:需遍历所有监听的文件描述符(FD)才能找到就绪连接,时间复杂度 O (n),并发量越高性能越差;
- epoll 模型:通过 "事件通知" 机制,仅返回就绪的文件描述符,时间复杂度 O (1),即使监听数万连接也能保持高效。
- BSD 类系统(FreeBSD、macOS) :使用 kqueue 模型,功能与 epoll 类似,同样支持高效的事件通知和海量连接管理;
- 其他系统:支持 /dev/poll、poll 等模型,确保在不同环境下的兼容性。
- Linux 系统:默认使用epoll 模型 (异步非阻塞 I/O 核心),通过 "事件通知" 机制 ,单线程可高效管理数万并发连接,避免传统 select 模型的轮询性能瓶颈:
-
多进程架构优势 :采用Master-Worker模式,Master进程负责管理配置和Worker进程,Worker进程处理实际请求,支持动态扩展和热部署。
2.2、功能原理
-
HTTP 服务器(静态资源服务)
- 直接读取本地文件(HTML、CSS、JS、图片等)并返回给客户端,无需转发到后端服务。核心是 文件读取优化(sendfile 零拷贝技术),减少数据在内核态和用户态的拷贝,提升传输效率。
-
反向代理
- http反向代理 : 客户端请求先发送到 Nginx,Nginx 再转发到后端业务服务器(如 Tomcat、Node.js、Java 服务),后端服务器处理后将响应通过 Nginx 返回给客户端。
- 作用:隐藏后端服务器地址、统一入口、缓存静态资源、解决跨域问题。
- 原理:Nginx 作为 "中间人",维护与后端的长连接,复用连接减少握手开销。
- tcp反向代理: 直接代理tcp端口进行转发
- http反向代理 : 客户端请求先发送到 Nginx,Nginx 再转发到后端业务服务器(如 Tomcat、Node.js、Java 服务),后端服务器处理后将响应通过 Nginx 返回给客户端。
-
负载均衡
-
当后端有多台业务服务器时,Nginx 按配置的策略将请求分发到不同服务器,实现负载分担,避免单台服务器过载。
-
负载策略:支持轮询(默认)、加权轮询(weight,按权重分配请求,适配不同性能的后端节点)、IP 哈希(ip_hash,基于客户端 IP 哈希分配,实现会话保持)、最少连接(least_conn,优先分发到连接数最少的节点)等算法;
-
健康检查:内置健康检查机制,自动检测后端节点状态,剔除故障节点(如服务器宕机、响应超时),待节点恢复后自动重新纳入集群,提升服务可用性。
-
-
缓存
- Nginx 可缓存后端服务器的响应结果(如静态资源、接口数据),后续相同请求直接从 Nginx 缓存返回,减少后端压力,提升响应速度。
2.3、模块化设计与扩展性
Nginx 采用 "核心 + 模块" 的架构,实现功能解耦和灵活扩展:
- 功能解耦:核心框架仅包含事件驱动模块、进程管理模块等基础组件,体积小巧、性能高效;HTTP 处理、SSL 加密、缓存、负载均衡等功能均通过独立模块实现,降低组件间耦合度,便于维护和迭代;
- 热加载:支持动态模块加载(Dynamic Modules),无需重启 Nginx 服务即可加载新模块或更新已有模块,避免服务中断;
- 扩展性 :官方提供丰富的内置模块(如
ngx_http_proxy_module反向代理、ngx_http_gzip_module压缩),同时支持第三方模块(如限流模块ngx_http_limit_req_module、防盗链模块),可按需扩展功能。
三、nginx安装
-
服务安装
-
安装依赖
bashyum install -y gcc gcc-c++ perl perl-devel pcre pcre-devel pcre2 pcre2-devel zlib zlib-devel openssl-devel patch -
第三方模块说明
官方链接:sticky-1.24+,nginx_upstream_check_module,nginx-module-vts,ngx_http_consistent_hash
模块名 说明 Sticky 基于cookie的一种nginx的负载均衡解决方案 nginx_upstream_check_module nginx主动健康检查 Nginx-module-vts Nginx的虚拟主机流量监控模块 -
下载源包
bashwget https://nginx.org/download/nginx-1.29.3.tar.gz wget https://github.com/PolloChang/nginx-sticky-module-ng/releases/download/v1.24.0/nginx-sticky-module-ng-v1.24.0.tar.gz wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/refs/tags/v0.4.0.tar.gz wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.4.tar.gz # 需要打开进去下载,右上角raw旁边有个下载按钮, 给它用nginx_upstream_check_module https://github.com/yaoweibin/nginx_upstream_check_module/blob/master/check_1.20.1+.patch -
编译并安装
-
源码包说明
bash# 我们准备以下包, 如果懒得下载,直接单用 nginx-1.29.3.tar.gz 练手也是ok的 [root@localhost ss]# ll nginx-1.29.3.tar.gz nginx-module-vts-master.zip nginx-sticky-module-ng-1.24.0.tar.gz nginx_upstream_check_module-0.4.0.tar.gz openssl-1.1.1n.tar.gz check_1.20.1+.patch -
模块说明
bash# 将以上文件全部解压, 略过, 模块说明 cd nginx-1.29.3 ./configure --prefix=/data/nginx \ --with-http_stub_status_module \ # 状态监控模块 --with-http_realip_module \ # 真实 IP 透传模块 --with-http_ssl_module \ # HTTPS 加密模块 --with-pcre \ # PCRE 正则支持模块 --with-stream \ # 四层代理/负载均衡模块 tcp/udp代理模块 --with-http_gzip_static_module \ # 静态压缩模块 ####### 如果单独测,以下四行不要, 去掉静态压缩模块后的\ --with-openssl=/解压目录/openssl-1.1.1n \ --add-module=/解压目录/nginx-module-vts-master \ --add-module=/解压目录/nginx_upstream_check_module-0.4.0 \ --add-module=/解压目录/nginx-sticky-module-ng-1.24.0 -
安装
bash# 给nginx打个补丁,不然nginx_upstream_check_module安不上去,如果不要也可以忽略这里 cd nginx-1.29.3 patch -p1 < ../check_1.20.1+.patch ./configure --prefix=/data/nginx --with-http_stub_status_module --with-http_realip_module --with-http_ssl_module --with-pcre --with-stream --with-http_gzip_static_module --with-openssl=/解压目录/openssl-1.1.1n --add-module=/解压目录/nginx-module-vts-master --add-module=/解压目录/nginx_upstream_check_module-0.4.0 --add-module=/解压目录/nginx-sticky-module-ng-1.24.0 # 安装过程自己看一下 确保没有not found, 一般有的话 就是 yum install 名称-devel安装就行 make -j cpu核数 && make -j cpu核数 install # 比如我64核 make -j 64 && make -j 64 install
-
-
目录结构
bashcd /data/nginx/ # Nginx 安装根目录 ├── conf/ # 配置文件目录(核心目录) ├── html/ # 默认静态资源目录(默认网站根目录) ├── logs/ # 日志文件目录(访问日志、错误日志等) └── sbin/ # 执行程序目录(Nginx 主程序) conf/ ├── nginx.conf # Nginx 主配置文件(核心中的核心) ├── mime.types # MIME 类型映射文件(识别文件后缀对应的 Content-Type) ├── fastcgi.conf # FastCGI 相关配置(适配 PHP 等动态语言) ├── fastcgi_params # FastCGI 参数配置(与 fastcgi.conf 功能类似,参数更少) ├── proxy_params # 反向代理默认参数配置(如转发时的请求头) ├── scgi_params # SCGI 协议配置(较少使用) ├── uwsgi_params # uWSGI 协议配置(适配 Python WSGI 应用) └── koi-utf、koi-win、win-utf # 字符集编码映射文件(适配中文等特殊字符) sbin/ └── nginx # Nginx 主执行程序(二进制文件) -
systemctl脚本
bashcat > /usr/lib/systemd/system/nginx.service << EOF [Unit] Description=Nginx High Performance Web Server Documentation=http://nginx.org/en/docs/ After=network.target remote-fs.target nss-lookup.target [Service] Type=forking # Nginx 主程序路径(/data/nginx/sbin/nginx) ExecStart=/data/nginx/sbin/nginx # 优雅停止(等待请求处理完成) ExecStop=/data/nginx/sbin/nginx -s quit # 强制停止(快速关闭,紧急情况使用) ExecStopPost=/bin/rm -f /data/nginx/logs/nginx.pid # 重载配置(热部署) ExecReload=/data/nginx/sbin/nginx -s reload # 验证配置(启动/重载前自动验证,避免配置错误) ExecStartPre=/data/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;' # 进程权限配置(安全优化) User=root Group=root PrivateTmp=true # 服务稳定性配置 Restart=on-failure RestartSec=5s LimitNOFILE=65535 # 限制最大文件描述符(适配高并发) [Install] WantedBy=multi-user.target EOF -
启动
bashsystemctl start nginx systemctl enable nginx -
其它
bash# 常用命令 /data/nginx/sbin/nginx -s stop # 停止 /data/nginx/sbin/nginx -s reload # 重载配置(无需停止服务) /data/nginx/sbin/nginx -t # 验证配置文件正确性 -
整包压缩后,后续还能用得上
-
浏览器访问
http://服务器IP,若出现 "Welcome to nginx!" 页面,则安装成功。 -
通过网盘分享的文件:linux 提取码: 1234
-