1. Nginx 简介

Nginx 是一个高性能、轻量级的 HTTP 服务器和反向代理服务器,常用于静态文件服务、负载均衡、反向代理、SSL/TLS 加密等场景。它支持高并发,具有模块化设计和灵活的配置。


2. 通过 Docker-Compose 启动 Nginx

version: '3.8'

services:
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/logs:/var/log/nginx:rw
      - ./nginx/cert:/etc/nginx/cert:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/conf.d:/etc/nginx/conf.d:rw
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 30s

3. Nginx 配置详解

主配置文件(nginx.conf)

# 全局配置
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    # 日志配置
    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;


    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    # 压缩与缓存
    gzip on;
    gzip_types text/plain application/json;

    # 包含子配置文件
    include /etc/nginx/conf.d/*.conf;
}

子配置文件(conf.d/*.conf)

http {
    server {
        listen 443 ssl;
            server_name _;
    }

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

    location / {
        proxy_pass http://backend;
    }
}
# Stream 转发(TCP/UDP)
stream {
    upstream db_backend {
        server db1.example.com:3306;
        server db2.example.com:3306;
    }

    server {
        listen 3306;
        proxy_pass db_backend;
    }
}

常见的HTTP模块配置

# 传递请求头和用户信息
proxy_set_header Host $host;  # 保留原始 Host 请求头
proxy_set_header X-Real-IP $remote_addr;  # 保留客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # 保留转发链
proxy_set_header X-Forwarded-Proto $scheme;  # 保留请求协议 (http/https)

# 支持 WebSocket 等长连接
proxy_http_version 1.1;  # 使用 HTTP/1.1 支持长连接
proxy_set_header Upgrade $http_upgrade;  # 支持 WebSocket 升级
proxy_set_header Connection "upgrade";  # 保持长连接

# 配置传递下划线 Header
underscores_in_headers on;  # 允许传递下划线头部

# 增加连接和读写超时 (HTTP CODE 504)
proxy_connect_timeout 120s;  # 设置连接超时
proxy_read_timeout 120s;     # 设置读取超时
proxy_send_timeout 120s;     # 设置发送超时

client_max_body_size 1m;  # 限制客户端请求体最大为 1MB (HTTP CODE 413)

# 增加缓冲区大小
proxy_buffer_size 128k;  # 设置初始缓冲区大小
proxy_buffers 4 256k;  # 设置缓冲区数量和大小
proxy_busy_buffers_size 256k;  # 设置繁忙时的缓冲区大小

动态限流

http {
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=5r/s;
    server {
        location /api/ {
            limit_req zone=api_limit burst=10 nodelay;
            proxy_pass http://backend_service;
        }
    }
}

HTTP301/HTTPS配置示例

server {
    listen       80;
    server_name  _;
    server_tokens off; # 关闭版本信息返回
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    server_name example.com;

    # 指定 SSL 证书和密钥路径
    ssl_certificate     /etc/nginx/cert/example.crt;
    ssl_certificate_key /etc/nginx/cert/example.key;

    # SSL 会话和协议配置
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 5m;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # 加密套件和优先级配置
    ssl_ciphers         'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!aNULL:!MD5:!RC4';
    ssl_prefer_server_ciphers on;

    # 启用 HSTS(仅在 HTTPS 完全启用后使用)
    add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}

在 Nginx 配置中,location 块用于定义 URL 路径和请求的匹配规则。以下是一些常见的 location 配置示例,包括重写、正则匹配和静态资源配置。

Location 配置示例

1. 基本重定向配置

# 将所有 http 请求重定向到 https
server {
    listen 80;
    server_name example.com;
    
    location / {
        return 301 https://$host$request_uri;
    }
}

用途:将所有 HTTP 请求重定向到 HTTPS。

2. 静态文件服务配置

server {
    listen 80;
    server_name example.com;

    # 为所有以 /static/ 开头的请求提供静态文件
    location /static/ {
        root /var/www/html;  # 静态文件目录
        try_files $uri $uri/ =404;  # 尝试查找文件,不存在返回 404
    }
}

用途:为特定路径(如 /static/)提供静态资源服务。

3. 正则匹配和动态路由

server {
    listen 80;
    server_name example.com;

    # 匹配以 /user/ 开头且后面跟着数字的请求
    location ~ ^/user/(\d+)$ {
        # 捕获正则匹配的数字并通过变量传递
        set $user_id $1;
        # 转发请求到后端服务器
        proxy_pass http://backend_servers/$user_id;
    }
}

用途:使用正则表达式匹配路径并将捕获的内容传递到后端。比如 /user/123 会被转发到 http://backend_servers/123

4. 禁止访问某些文件类型

server {
    listen 80;
    server_name example.com;

    # 禁止访问 .bak 文件
    location ~* \.bak$ {
        deny all;  # 拒绝所有访问
    }
}

用途:禁止访问特定类型的文件,如 .bak 文件。

5. 静态文件 + 动态请求

server {
    listen 80;
    server_name example.com;

    # 提供静态文件
    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.html;  # 尝试找到文件,找不到时返回 index.html
    }

    # 处理 PHP 请求(假设 Nginx 已配置 PHP-FPM)
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}

用途:同时提供静态文件服务和处理动态请求(如 PHP)。

6. 使用正则匹配重写 URL

server {
    listen 80;
    server_name example.com;

    # 将 /product/123 重写为 /product?id=123
    location ~ ^/product/(\d+)$ {
        rewrite ^/product/(\d+)$ /product?id=$1 last;
    }
}

用途:使用正则表达式匹配 URL 并进行重写,将 /product/123 重写为 /product?id=123

7. 使用 try_files 优雅处理 404

server {
    listen 80;
    server_name example.com;

    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.php?$query_string;  # 尝试静态文件,如果不存在则转到 PHP 处理
    }
}

用途try_files 用来优雅地处理文件不存在的情况,如果文件不存在,则转发给 PHP 或其他处理程序。

8. 根据请求类型返回不同响应

server {
    listen 80;
    server_name example.com;

    # 只允许 GET 和 POST 请求
    location /api/ {
        if ($request_method !~ ^(GET|POST)$) {
            return 405;  # 其他方法返回 405 Method Not Allowed
        }
    }
}

用途:根据请求方法返回不同的响应,例如只允许 GETPOST 请求。

9. 缓存配置

server {
    listen 80;
    server_name example.com;

    # 缓存图片文件
    location ~* \.(jpg|jpeg|png|gif|ico)$ {
        expires 30d;  # 设置缓存过期时间为 30 天
        add_header Cache-Control "public";
    }
}

用途:为特定类型的静态文件设置缓存头部,指定缓存时间。

10. 转发到不同的后端

server {
    listen 80;
    server_name example.com;

    # 转发到后端1
    location /api/v1/ {
        proxy_pass http://backend_v1;
    }

    # 转发到后端2
    location /api/v2/ {
        proxy_pass http://backend_v2;
    }
}

用途:根据路径前缀将请求转发到不同的后端服务器。


总结:

  • 静态资源location /static/ {} 用于服务静态文件。
  • 重写规则location ~ ^/old/ { rewrite /new; } 用于 URL 重写。
  • 正则匹配location ~ 用于路径的正则匹配和处理。
  • 请求过滤location /api/ { if ... } 用于限制请求类型或 IP。
  • 反向代理location /api/ { proxy_pass ... } 用于请求转发到后端服务器。

这些配置可以灵活地结合使用,以满足不同的请求路由、重定向、反向代理、缓存等需求。

标签: none

添加新评论