写在前面

书接上文,上回我对我的网站配置了nginx反向代理,我想对nginx有一个更深入的学习,这篇文章是我对nginx学习的记录和感悟,希望能做到温故而知新。

Nginx的简介和安装

具体可以参考这里

Nginx(发音为“engine x”)是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3代理服务器。它由俄罗斯程序员Igor Sysoev于2002年开始编写,并在2004年首次公开发布。Nginx的设计初衷是为了解决当时常见的C10K问题,即如何处理一台服务器上同时处理一万个并发连接的问题。

nginx的安装具体可以看这篇文章

Nginx的master-worker进程模型

在命令行中可以使用ps -ef | grep nginx来查看nginx的进程

在Nginx的架构中,master-worker模型是其核心运行机制之一。Nginx运行时会启动一个Master进程和一个或多个Worker进程。他们的关系是一对多的关系,这就像公司里面领导和员工的关系一样,一个领导手底下有很多员工。master是nginx的主进程,主要负责的是读取和验证配置文件,以及管理worker进程。worker进程就是工作进程,就是主要用来处理请求的实际的请求。

Master进程

master进程主要负责以下任务:

  1. 读取和评估配置文件:master进程负责读取和评估Nginx的配置文件。任何配置的变更都需要通过master进程来重新加载。

  2. 启动、终止和监控worker进程:master进程负责启动和终止Worker进程,并监控它们的状态。如果某个worker进程出现故障,master进程会自动重新启动一个新的worker进程来代替它。

  3. 管理信号:master进程处理外部信号(如启动、停止、重启信号),并将相应的指令传递给Worker进程。

worker进程

worker进程则是实际处理客户端请求的主要力量。它们的职责包括:

  1. 处理客户端请求:每个worker进程都能够独立处理客户端的请求,包括接受连接、读取请求、处理请求并返回响应。

  2. 异步处理:worker进程采用异步、非阻塞的方式处理请求,这使得它们能够同时处理多个连接而不会相互阻塞。

  3. 均衡负载:Nginx的master进程会将客户端的连接均衡地分配给各个Worker进程,确保每个worker进程的负载均衡。

配置示例

在Nginx的配置文件中,可以通过worker_processes指令来指定Worker进程的数量:

# 在nginx.conf中配置
worker_processes 4; # 启动4个Worker进程

events {
    worker_connections 1024; # 每个Worker进程可以处理的最大连接数
}

Nginx的反向代理和负载均衡

反向代理在上一篇中写的已经很明确了,这里就不做赘述。但是这边展示几种nginx配置文件的写法。

茴字的四种写法远近闻名,万万没想到,Nginx DNS 反向代理也有 N 种写法。几种常见的写法。以下是一些基本的配置示例;

基于IP的代理

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://IP地址;
    }
}

基于域名的代理

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://域名;
    }
}

基于请求头的代理

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://后端服务器地址;
    }
}

负载均衡的基本概念

负载均衡是一种在多台服务器之间分配网络流量的方法。其主要目标是优化资源使用、最大化吞吐量、最小化响应时间并避免单一资源过载。Nginx的负载均衡功能可以分为以下几类:

  1. HTTP负载均衡:分发HTTP请求到多台Web服务器。

  2. TCP/UDP负载均衡:分发TCP/UDP请求到多个服务器端口,用于非HTTP协议的应用场景。

负载均衡的策略

Nginx支持多种负载均衡策略,可以根据不同的需求选择适合的策略:

轮询(Round Robin)

  • 默认策略,将请求按顺序分发到每台后端服务器。

  • 配置示例:

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

权重(Weighted Round Robin)

  • 基于权重分配请求,权重高的服务器分配到更多请求。

  • 配置示例

upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com weight=1;
    server backend3.example.com weight=2;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

以上展示了两个常用的配置作为示例,后续可以查看官方文档

Nginx虚拟主机

一个懒人