【NGINX 介绍与安装】

文章目录

  • 前言
  • [一、NGINX 是什么?](#一、NGINX 是什么?)
  • [二、为什么选择 NGINX?](#二、为什么选择 NGINX?)
  • [三、安装 NGINX](#三、安装 NGINX)
    • [1. 使用包管理器安装](#1. 使用包管理器安装)
    • [2. 从源码编译安装](#2. 从源码编译安装)
  • [四、NGINX 基本配置与工作原理](#四、NGINX 基本配置与工作原理)
    • [1. 主要配置文件结构](#1. 主要配置文件结构)
    • [2. 核心指令块](#2. 核心指令块)
    • [3. 工作进程与事件模型](#3. 工作进程与事件模型)
  • 五、反向代理
    • [1. 基本反向代理示例](#1. 基本反向代理示例)
    • [2. 路径转发与重写](#2. 路径转发与重写)
  • 六、负载均衡
    • [1. 轮询(默认)](#1. 轮询(默认))
    • [2. 最少连接(least_conn)](#2. 最少连接(least_conn))
    • [3. IP 哈希(ip_hash)](#3. IP 哈希(ip_hash))
    • [4. 权重(weight)](#4. 权重(weight))
    • [5. 健康检查](#5. 健康检查)
  • 七、缓存与加速
    • [1. 反向代理缓存](#1. 反向代理缓存)
    • [2. 静态文件缓存](#2. 静态文件缓存)
    • [3. Gzip 压缩](#3. Gzip 压缩)
  • 八、SSL/TLS
    • [1. 基本 SSL 配置](#1. 基本 SSL 配置)
    • [2. 安全头部](#2. 安全头部)
    • [3. 限流与防护](#3. 限流与防护)
  • 九、日志与监控
    • [1. 日志配置](#1. 日志配置)
    • [2. 简易状态监控](#2. 简易状态监控)
  • [十、NGINX 高级特性](#十、NGINX 高级特性)
    • [1. WebSocket 代理](#1. WebSocket 代理)
    • [2. gRPC 代理](#2. gRPC 代理)
    • [3. Lua 扩展(OpenResty / ngx_lua)](#3. Lua 扩展(OpenResty / ngx_lua))
    • [4. 动态模块](#4. 动态模块)
    • [5. HTTP/2 与 HTTP/3 支持](#5. HTTP/2 与 HTTP/3 支持)
    • [6. 反向代理上传大文件](#6. 反向代理上传大文件)

前言

NGINX 因其高并发、低内存消耗和丰富功能,已成为 Web 服务器、反向代理和负载均衡器中的佼佼者。


一、NGINX 是什么?

NGINX(Engine X)是一款高性能、高并发、开源的 HTTP 服务器,同时也可用作反向代理、负载均衡、邮件代理(IMAP/POP3)等。由 Igor Sysoev 于 2004 年开发,旨在解决 C10k(处理上万个并发连接)问题。

  • 事件驱动架构:采用异步非阻塞的事件驱动模型,在高并发场景下表现优异,内存消耗相对较低。
  • 模块化设计:核心功能加上多种可选模块,用户可以编译所需模块,或使用动态模块。
  • 广泛应用:很多大型网站(如 Netflix、Airbnb、GitHub、腾讯、阿里等)都在使用 NGINX 作为前端网关或负载均衡器。

当客户端发来大量并发请求时,NGINX 的事件模型可以高效地调度网络 I/O,避免线程/进程过多导致的上下文切换开销。


二、为什么选择 NGINX?

  • 高并发处理能力:事件驱动使其能处理数万并发连接,资源利用效率高。
  • 低内存消耗:相比传统进程/线程模型,内存使用更可控。
  • 灵活的反向代理和负载均衡功能:支持多种负载均衡算法(轮询、IP 哈希、最少连接等)及健康检查。
  • 丰富的缓存支持:可做静态资源缓存、反向代理缓存,提升响应速度并减轻后端压力。
  • 易于扩展:通过第三方模块(如 Lua、Image Filter、GeoIP2 等)满足不同需求。
  • 稳定成熟:社区活跃,文档丰富,生态完善。

三、安装 NGINX

1. 使用包管理器安装

以 Ubuntu/Debian 为例:

bash 复制代码
sudo apt update
sudo apt install -y nginx

安装后,服务通常自动启动。使用以下命令检查状态:

bash 复制代码
sudo systemctl status nginx

在 CentOS/RHEL:

bash 复制代码
sudo yum install -y epel-release
sudo yum install -y nginx
sudo systemctl enable --now nginx

2. 从源码编译安装

bash 复制代码
# 安装依赖
sudo apt update
sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev

# 下载 NGINX 源码(以 1.24.0 为例)
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0

# 配置编译选项(可根据需求添加模块或路径)
./configure \
  --prefix=/usr/local/nginx \
  --with-http_ssl_module \
  --with-http_v2_module \
  --with-stream \
  --with-stream_ssl_module \
  --with-http_gzip_static_module

# 编译并安装
make
sudo make install

# 启动
sudo /usr/local/nginx/sbin/nginx

四、NGINX 基本配置与工作原理

1. 主要配置文件结构

  • 主配置文件:nginx.conf,通常位于 /etc/nginx/nginx.conf/usr/local/nginx/conf/nginx.conf
  • 其他配置:常将虚拟主机配置放在 conf.d/sites-available/sites-enabled/ 目录中。
  • 日志文件:access_logerror_log 设置在配置文件内。

2. 核心指令块

  • events {}:设置事件模型,如 worker_connections
  • http {}:HTTP 功能及模块配置,包括 server{}upstream{}proxy_*gzip 等。
  • stream {}:TCP/UDP 流量代理,用于非 HTTP 协议负载均衡(如数据库、MQ 代理)。
  • mail {}:邮件代理配置(IMAP/POP3/SMTP)。

3. 工作进程与事件模型

  • worker_processes: 通常设置为 CPU 核心数或 auto。
  • worker_connections: 每个 worker 可处理的并发连接数。
  • 异步事件驱动:使用 epoll/kqueue 等高效 I/O 多路复用。

五、反向代理

NGINX 常用作反向代理,将请求转发到后端应用服务器。

1. 基本反向代理示例

nginx 复制代码
http {
    upstream backend {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_pass http://backend;
            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_connect_timeout 5s;
            proxy_read_timeout 30s;
        }
    }
}
  • upstream 定义后端服务器组。
  • proxy_pass 转发请求。
  • 设置请求头确保后端可获知原始请求信息。

2. 路径转发与重写

  • location /api/ { proxy_pass http://backend/api/; }

  • 使用 rewrite 做 URL 重写:

    nginx 复制代码
    location /old/ {
        rewrite ^/old/(.*)$ /new/$1 permanent;
    }

六、负载均衡

1. 轮询(默认)

nginx 复制代码
upstream backend {
    server 192.168.0.101;
    server 192.168.0.102;
    server 192.168.0.103;
}

请求按顺序分配,简单易用。

2. 最少连接(least_conn)

nginx 复制代码
upstream backend {
    least_conn;
    server 192.168.0.101;
    server 192.168.0.102;
}

将请求发给当前活动连接数最少的后端,适合请求时间差异大的场景。

3. IP 哈希(ip_hash)

nginx 复制代码
upstream backend {
    ip_hash;
    server 192.168.0.101;
    server 192.168.0.102;
}

根据客户端 IP 分配后端,保证同一客户端请求分配到同一后端,有助于会话粘性。

4. 权重(weight)

nginx 复制代码
upstream backend {
    server 192.168.0.101 weight=3;
    server 192.168.0.102 weight=1;
}

对后端分配比例进行控制,资源更强的服务器可配置更高权重。

5. 健康检查

  • NGINX 开源版需借助第三方模块(如 nginx-upstream-check-module);NGINX Plus 原生支持健康检查。

  • 或通过配置 proxy_next_upstream、超时等,简单应对后端异常:

    nginx 复制代码
    proxy_connect_timeout 2s;
    proxy_read_timeout 5s;
    proxy_next_upstream error timeout invalid_header http_502 http_503 http_504;

七、缓存与加速

1. 反向代理缓存

nginx 复制代码
http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

    server {
        listen 80;
        server_name example.com;

        location / {
            proxy_cache my_cache;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404 1m;
            proxy_cache_bypass $cookie_nocache $arg_nocache;
            add_header X-Cache-Status $upstream_cache_status;
            proxy_pass http://backend;
        }
    }
}
  • proxy_cache_path 配置缓存存储位置和大小。
  • proxy_cache_valid 设置不同响应码的缓存时长。
  • proxy_cache_bypass 控制绕过缓存。
  • 在响应头中添加 X-Cache-Status 便于调试。

2. 静态文件缓存

对于静态资源,可利用 expiresadd_header Cache-Control

nginx 复制代码
location ~* \.(js|css|png|jpg|jpeg|gif|svg)$ {
    root /var/www/static;
    expires 7d;
    add_header Cache-Control "public";
}

3. Gzip 压缩

nginx 复制代码
http {
    gzip on;
    gzip_min_length 1024;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

通过压缩减少传输体积,加快加载。


八、SSL/TLS

1. 基本 SSL 配置

使用 Let's Encrypt 生成证书(示例工具 certbot),并在 NGINX 中配置:

nginx 复制代码
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://backend;
        ...
    }
}
  • 强制 HTTP 跳转到 HTTPS。
  • 开启 HTTP/2 提升多路复用性能。

2. 安全头部

nginx 复制代码
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Content-Security-Policy "default-src 'self';" always;

帮助防止点击劫持、MIME 类型混淆等问题。

3. 限流与防护

  • 限制连接数、请求速率:

    nginx 复制代码
    http {
        limit_conn_zone $binary_remote_addr zone=addr:10m;
        limit_req_zone $binary_remote_addr zone=req:10m rate=5r/s;
    
        server {
            ...
            location /login {
                limit_conn addr 1;
                limit_req zone=req burst=10 nodelay;
                proxy_pass http://backend;
            }
        }
    }
  • 防止恶意请求:可结合 fail2ban、WAF(如 ModSecurity、OpenResty+Lua 规则)等。


九、日志与监控

1. 日志配置

  • access_log:记录请求信息,可自定义格式:

    nginx 复制代码
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log main;
    error_log /var/log/nginx/error.log warn;
  • 通过日志分析工具(如 GoAccess、ELK、Fluentd)进行流量趋势、错误率分析。

2. 简易状态监控

在配置中开启:

nginx 复制代码
server {
    listen 127.0.0.1:8081;
    server_name localhost;

    location /nginx_status {
        stub_status on;
        allow 127.0.0.1;
        deny all;
    }
}

访问 http://127.0.0.1:8081/nginx_status,得到活动连接、请求计数等信息。可配合 Prometheus 的 nginx-exporter 采集指标,或自定义脚本定期抓取。


十、NGINX 高级特性

1. WebSocket 代理

nginx 复制代码
location /ws/ {
    proxy_pass http://backend_ws;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header Host $host;
}

支持实时通信应用。

2. gRPC 代理

nginx 复制代码
http {
    upstream grpc_backend {
        server 127.0.0.1:50051;
    }

    server {
        listen 80 http2;
        location / {
            grpc_pass grpc://grpc_backend;
        }
    }
}

3. Lua 扩展(OpenResty / ngx_lua)

借助 Lua 脚本进行动态处理、ACL、灰度发布等:

nginx 复制代码
server {
    location /lua {
        content_by_lua_block {
            ngx.say("Hello from Lua!")
        }
    }
}

4. 动态模块

许多第三方模块可以按需编译成动态模块并通过 load_module 引入,如 ngx_brotlingx_pagespeed 等。

5. HTTP/2 与 HTTP/3 支持

  • HTTP/2 可提高多路复用效率;HTTP/3(QUIC)需在较新版 NGINX 或使用第三方 patch/模块支持。
  • 在生产中,可根据客户端支持情况逐步部署 HTTP/2;HTTP/3 目前生态仍在发展,可视需求尝试。

6. 反向代理上传大文件

设置较大 client_max_body_size

nginx 复制代码
http {
    client_max_body_size 100m;
}

并调整相关超时,确保上传稳定。

相关推荐
七夜zippoe8 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
Fcy64810 小时前
Linux下 进程(一)(冯诺依曼体系、操作系统、进程基本概念与基本操作)
linux·运维·服务器·进程
袁袁袁袁满10 小时前
Linux怎么查看最新下载的文件
linux·运维·服务器
代码游侠10 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
Harvey90310 小时前
通过 Helm 部署 Nginx 应用的完整标准化步骤
linux·运维·nginx·k8s
珠海西格电力科技12 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
释怀不想释怀12 小时前
Linux环境变量
linux·运维·服务器
zzzsde12 小时前
【Linux】进程(4):进程优先级&&调度队列
linux·运维·服务器
聆风吟º14 小时前
CANN开源项目实战指南:使用oam-tools构建自动化故障诊断与运维可观测性体系
运维·开源·自动化·cann
NPE~14 小时前
自动化工具Drissonpage 保姆级教程(含xpath语法)
运维·后端·爬虫·自动化·网络爬虫·xpath·浏览器自动化