一、Nginx核心功能概述

Nginx是一个高性能的HTTP和反向代理服务器,以其高并发、低内存消耗和模块化设计而闻名。它的核心功能可以分为以下几个主要方面:

功能分类 主要作用 典型应用场景
HTTP服务器 提供静态文件服务 网站托管、文件下载
反向代理 转发请求到后端服务器 应用服务器代理、API网关
负载均衡 分发流量到多台服务器 高并发系统、分布式部署
缓存服务 缓存静态或动态内容 加速网站访问、减轻后端压力
SSL/TLS 提供HTTPS加密 安全传输、加密通信
限流控制 限制访问频率 防爬虫、防DDoS
访问控制 基于IP、用户的权限控制 权限管理、安全防护

二、HTTP服务器功能

2.1 静态文件服务

Nginx最基础的功能是作为HTTP服务器,提供静态文件服务。它能够高效地处理静态资源(HTML、CSS、JavaScript、图片等)的请求。

nginx

# 基本静态文件服务配置
server {
    listen 80;
    server_name example.com;

    # 网站根目录
    root /var/www/example.com/html;
    
    # 默认首页文件
    index index.html index.htm;

    # 处理根路径请求
    location / {
        try_files $uri $uri/ =404;
    }

    # 静态资源缓存优化
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
        access_log off;
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }
}

配置说明:

  • root:指定网站根目录

  • index:定义默认首页文件

  • try_files:按顺序查找文件,找不到则返回404

  • expires:设置浏览器缓存时间

  • deny all:禁止访问以点开头的文件(如.git、.htaccess等)

2.2 目录列表功能

在某些场景下(如文件下载站),可能需要启用目录列表功能。

nginx

location /downloads/ {
    alias /var/www/files/;
    autoindex on;                 # 开启目录列表
    autoindex_exact_size off;      # 显示文件大小(非精确)
    autoindex_localtime on;        # 显示本地时间
    charset utf-8;                 # 字符集设置
    
    # 访问控制
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

2.3 文件上传

通过配置client_max_body_size可以控制允许上传的文件大小。

nginx

server {
    # 设置最大上传文件大小为100M
    client_max_body_size 100M;
    
    # 设置临时文件目录
    client_body_temp_path /tmp/nginx_temp;
    
    location /upload/ {
        # 限制上传速度(每秒100KB)
        limit_rate 100k;
        
        # 处理文件上传
        proxy_pass http://backend;
        proxy_set_header X-Original-URI $request_uri;
    }
}

三、反向代理功能

3.1 反向代理原理

反向代理(Reverse Proxy)是指代理服务器接收客户端的请求,然后将请求转发给内部网络上的后端服务器,并将从后端服务器得到的结果返回给客户端。

text

客户端 → Nginx(反向代理) → 后端服务器
客户端 ← Nginx(反向代理) ← 后端服务器

3.2 基本反向代理配置

nginx

server {
    listen 80;
    server_name api.example.com;

    location / {
        # 将请求转发到后端应用服务器
        proxy_pass http://localhost:3000;
        
        # 传递原始请求信息
        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_set_header X-Forwarded-Proto $scheme;
        
        # 超时设置
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
        
        # 缓冲区设置
        proxy_buffering on;
        proxy_buffer_size 4k;
        proxy_buffers 8 4k;
        proxy_busy_buffers_size 8k;
    }
}

3.3 代理WebSocket

WebSocket协议需要特殊的代理配置以支持长连接:

nginx

location /ws/ {
    proxy_pass http://backend-websocket;
    proxy_http_version 1.1;
    
    # WebSocket必需的头信息
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    
    # 延长超时时间
    proxy_read_timeout 3600s;
    proxy_send_timeout 3600s;
    
    # 其他标准代理设置
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

3.4 代理缓存

Nginx可以缓存后端服务器的响应,减少后端负载并加快响应速度。

nginx

# 定义缓存区域
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m 
                 max_size=1g inactive=60m use_temp_path=off;

server {
    location / {
        # 启用缓存
        proxy_cache my_cache;
        
        # 定义缓存键
        proxy_cache_key "$scheme$request_method$host$request_uri";
        
        # 缓存有效期
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        proxy_cache_valid any 1m;
        
        # 跳过缓存的条件
        proxy_cache_bypass $http_pragma;
        proxy_cache_bypass $http_authorization;
        
        # 添加缓存状态头
        add_header X-Cache-Status $upstream_cache_status;
        
        proxy_pass http://backend;
    }
}

四、负载均衡功能

4.1 负载均衡算法

Nginx支持多种负载均衡算法:

算法 描述 适用场景
轮询(默认) 按顺序分配请求 服务器配置相近
加权轮询 根据权重分配请求 服务器性能不同
IP哈希 根据客户端IP分配 需要会话保持
最少连接 分配给活跃连接最少的服务器 请求处理时间差异大
随机 随机选择服务器 简单的负载均衡
一致性哈希 根据指定变量哈希 分布式缓存

4.2 基本负载均衡配置

nginx

# 定义上游服务器组
upstream backend {
    # 默认轮询算法
    server backend1.example.com weight=3;
    server backend2.example.com;
    server backend3.example.com backup;
    
    # 健康检查
    keepalive 32;
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4.3 不同负载均衡算法示例

nginx

# IP哈希(会话保持)
upstream backend_ip_hash {
    ip_hash;
    server backend1.example.com;
    server backend2.example.com;
}

# 最少连接
upstream backend_least_conn {
    least_conn;
    server backend1.example.com weight=2;
    server backend2.example.com;
    server backend3.example.com;
}

# 一致性哈希
upstream backend_hash {
    hash $request_uri consistent;
    server backend1.example.com;
    server backend2.example.com;
}

# 随机(带两个备用服务器)
upstream backend_random {
    random two least_conn;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com weight=2;
    server backend4.example.com;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐