Nginx代理基础

常用目录

  • /var/www/html/ 默认的站点目录,供外部访问
  • /etc/nginx/ 配置文件目录:

nginx.conf
Nginx的核心配置文件,用于设置全局参数(如worker进程数、日志路径、PID文件等)、事件处理模块(events块)以及HTTP服务相关配置,包括http、server和location等模块。

conf.d/
该目录用于存放扩展配置文件,常用于按站点或功能划分虚拟主机配置。主配置文件中通常通过include指令引入该目录下的所有.conf文件,实现配置模块化管理。

mime.types
该文件用于定义文件扩展名与MIME类型之间的映射关系。Nginx根据此文件确定响应头中的内容类型,例如将.jpg映射为image/jpeg。

fastcgi_params、uwsgi_params、scgi_params
这些参数文件定义了与FastCGI、uWSGI、SCGI等后端通信所需的环境变量,便于Nginx在与PHP、Python等应用服务器交互时传递请求信息。

  • /usr/share/nginx/ 默认站点目录,最终为页面看到的内容。

/usr/share/nginx/html/ 存放默认站点的index.html、404.html等文件

  • /var/log/nginx 日志目录

代理

正向代理与反向代理的区别:正向代理,客户端通过代理服务器向远程服务器发送请求;反向代理,客户端访问远程服务器,远程服务器将请求再转发至目标可用服务器。

负载均衡:代理多个后端服务器时,Nginx可按轮询、IP hash等策略分发请求。

工作原理

Nginx包括基于事件驱动、异步非阻塞的高性能Web服务器架构,擅长处理高并发请求,常用于静态资源服务、反向代理、负载均衡等场景。

Nginx启动一个Master主进程,然后根据配置文件创建一个或多个Worker子进程。Master主进程负责读取配置、管理进程(启动、重载、关闭),只负责“调度管理“。

Nginx采用异步非阻塞的请求处理机制,使其具备高效处理海量并发请求的能力。相比之下,Apache默认采用的工作模式(尽管也提供异步非阻塞版本,但由于与部分内置模块存在兼容性问题而较少使用)会为每个请求分配独立的工作线程。当并发量达到数千级别时,就意味着需要同时维持数千个运行线程。这种设计会给系统带来显著负担:一方面,大量线程会消耗可观的内存资源;另一方面,频繁的线程上下文切换会产生巨大的CPU开销。这些额外的系统资源消耗不仅无法提升性能,反而会成为系统瓶颈。

在Nginx中,阻塞式系统调用是大忌。既然不能阻塞,那就必须采用非阻塞的方式——比如某个事件还没准备好,系统调用会立即返回EAGAIN,告诉你:“别急,数据还没到位,等会儿再来查!”于是,你可以先去做别的事情,过会儿再来检查。虽然这种方式避免了线程阻塞,但需要不断轮询事件状态,仍然存在不小的开销。

于是,更高效的异步非阻塞事件驱动模型应运而生,其核心就是selectpollepoll(Linux)或kqueue(BSD)这样的系统调用。它们的共同特点是:

  • 批量监控多个事件:调用时虽然是阻塞的,但可以设置超时时间,期间只要有事件就绪,就会立即返回。
  • 高效的事件管理:以epoll为例,未就绪的事件会被注册到epoll中,待其就绪后再处理;如果读写时返回EAGAIN,就重新放回epoll等待。这样,程序只需在所有事件都未就绪时才会真正等待,其余时间都在高效处理就绪事件。

这种模式下,虽然单线程在同一时刻只能处理一个请求,但由于采用了事件循环机制,可以在多个请求间快速切换。关键在于:

  • 切换无代价:不同于多线程的上下文切换,Nginx的切换是主动让出(因事件未就绪),本质上只是循环处理已就绪的事件。
  • 资源占用极低:无需创建线程,每个请求仅消耗少量内存,没有线程切换的开销,使得高并发时不会浪费CPU资源。

master-workers的好处

Nginx采用多进程架构,每个Worker进程独立运行,这种设计带来了诸多优势:

  1. 无锁高性能
    • 由于Worker进程之间不共享内存,无需加锁,避免了锁竞争带来的性能损耗,同时也降低了编程复杂度和问题排查难度。
  2. 无缝热升级
    • 支持 nginx -s reload 热部署,在不中断服务的情况下更新配置或二进制文件,确保业务持续可用。
  3. 故障隔离,服务不中断
    • Worker进程之间相互独立,即使某个进程崩溃,也不会影响其他进程,Master进程会迅速重启新的Worker,保证服务稳定运行。
    • 虽然异常的Worker会导致当前处理的请求失败,但仅影响部分请求,不会造成全局服务中断,降低了整体风险。
  4. 高效请求处理
    • 所有Worker进程公平竞争处理请求,即使某个Worker异常退出,剩余进程仍能继续处理新请求,确保服务高可用。

这种进程隔离+Master守护的机制,使得Nginx在保持高性能的同时,具备极强的稳定性和容错能力。