FantasticMao 技术笔记
BlogGitHub
  • README
  • C & Unix
    • C
      • 《C 程序设计语言》笔记
      • C 语言中的陷阱
      • CMake 示例
      • GNU make
      • LLVM Clang
      • Nginx 常用模块
      • Vim 常用命令
    • Unix-like
      • 《深入理解计算机系统》笔记
      • 《UNIX 环境高级编程》笔记 - UNIX 基础知识
      • 《UNIX 环境高级编程》笔记 - 文件 IO
      • 《UNIX 环境高级编程》笔记 - 标准 IO 库
      • 《鳥哥的 Linux 私房菜》笔记 - 目录配置
      • 《鳥哥的 Linux 私房菜》笔记 - 认识与学习 bash
      • 《鳥哥的 Linux 私房菜》笔记 - 任务管理
      • OpenWrt 中的陷阱
      • iptables 工作机制
  • Go
    • 《A Tour of Go》笔记
    • Go vs C vsJava
    • Go 常用命令
    • Go 语言中的陷阱
  • Java
    • JDK
      • 《Java 并发编程实战》笔记 - 线程池的使用
      • 设计模式概览
      • 集合概览
      • HashMap 内部算法
      • ThreadLocal 工作机制
      • Java Agent
    • JVM
      • 《深入理解 Java 虚拟机》笔记 - Java 内存模型与线程
      • JVM 运行时数据区
      • 类加载机制
      • 垃圾回收算法
      • 引用类型
      • 垃圾收集算法
      • 垃圾收集器
    • Spring
      • Spring IoC 容器扩展点
      • Spring Transaction 声明式事务管理
      • Spring Web MVC DispatcherServlet 工作机制
      • Spring Security Servlet 实现原理
    • 其它
      • 《Netty - One Framework to rule them all》演讲笔记
      • Hystrix 设计与实现
  • JavaScript
    • 《写给大家看的设计书》笔记 - 设计原则
    • 《JavaScript 权威指南》笔记 - jQuery 类库
  • 数据库
    • ElasticSearch
      • ElasticSearch 概览
    • HBase
      • HBase 数据模型
    • Prometheus
      • Prometheus 概览
      • Prometheus 数据模型和指标类型
      • Prometheus 查询语法
      • Prometheus 存储原理
      • Prometheus vs InfluxDB
    • Redis
      • 《Redis 设计与实现》笔记 - 简单动态字符串
      • 《Redis 设计与实现》笔记 - 链表
      • 《Redis 设计与实现》笔记 - 字典
      • 《Redis 设计与实现》笔记 - 跳跃表
      • 《Redis 设计与实现》笔记 - 整数集合
      • 《Redis 设计与实现》笔记 - 压缩列表
      • 《Redis 设计与实现》笔记 - 对象
      • Redis 内存回收策略
      • Redis 实现分布式锁
      • Redis 持久化机制
      • Redis 数据分片方案
      • 使用缓存的常见问题
    • MySQL
      • 《高性能 MySQL》笔记 - Schema 与数据类型优化
      • 《高性能 MySQL》笔记 - 创建高性能的索引
      • 《MySQL Reference Manual》笔记 - InnoDB 和 ACID 模型
      • 《MySQL Reference Manual》笔记 - InnoDB 多版本
      • 《MySQL Reference Manual》笔记 - InnoDB 锁
      • 《MySQL Reference Manual》笔记 - InnoDB 事务模型
      • B-Tree 简述
      • 理解查询执行计划
  • 中间件
    • gRPC
      • gRPC 负载均衡
    • ZooKeeper
      • ZooKeeper 数据模型
    • 消息队列
      • 消息积压解决策略
      • RocketMQ 架构设计
      • RocketMQ 功能特性
      • RocketMQ 消息存储
  • 分布式系统
    • 《凤凰架构》笔记
    • 系统设计思路
    • 系统优化思路
    • 分布式事务协议:二阶段提交和三阶段提交
    • 分布式系统的技术栈
    • 分布式系统的弹性设计
    • 单点登录解决方案
    • 容错,高可用和灾备
  • 数据结构和算法
    • 一致性哈希
    • 布隆过滤器
    • 散列表
  • 网络协议
    • 诊断工具
    • TCP 协议
      • TCP 报文结构
      • TCP 连接管理
由 GitBook 提供支持
在本页
  • ngx_http_proxy_module 模块
  • proxy_pass
  • proxy_set_header
  • ngx_http_upstream_module 模块
  • upstream
  • server
  • hash
  • ip_hash
  • least_conn
  • least_time
  • random
  • ngx_http_log_module 模块
  • access_log
  • log_format
  1. C & Unix
  2. C

Nginx 常用模块

最后更新于1年前

ngx_http_proxy_module 模块

模块 ngx_http_proxy_module 用于将 request 传递到另外一个服务,文档地址: 。

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

proxy_pass

指令 proxy_pass 用于设置代理服务的 protocol、address 和一个可选的用于映射 location 的 URI。protocol 可以是 http 和 https,address 可以是域名或者 IP,再加上一个可选的 port。

如果域名可以被解析为多个地址,那么它们将会以 round-robin 的方式被使用。除此之外,address 也可以被指定为一个 。

proxy_set_header

指令 proxy_set_header 用于重新定义或者追加 request header 发送给代理服务,默认情况下,Nginx 只会重新定义两个 header:

proxy_set_header Host       $proxy_host;
proxy_set_header Connection close;

ngx_http_upstream_module 模块

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

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

upstream

指令 upstream 用于定义一组服务。服务可以监听不同的 port。除此之外,服务还可以混合监听 TCP 和 UNIX-domain 两种模式。

upstream backend {
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

在默认情况下,Nginx 会采用加权轮训(weighted round-robin)的方式来将请求分配给 upstream 配置的服务。

server

指令 server 用于定义一个服务的 address 和参数。服务的地址可以是域名或者 IP 再加上一个可选的 port,或者是一个以 unix: 为前缀的 UNIX-domain 套接字地址。如果没有指定 port,则默认是 80。如果域名可以被解析为多个 IP 的话,则等同于定义了多个服务。

指令 server 可以定义如下参数:

  • weight=number 设置服务的权重,默认是 1;

  • max_conns=number 设置可以与代理服务器同时建立的最大连接数,默认是 0,意味着没有限制。

  • max_fails=number 设置与代理服务器通讯失败的最大次数。当大于这个阈值时,Nginx 会认为代理服务器已经不可用,并在后续 fail_timeout 时间内避免选择此服务。默认值为 1,设置为 0 表示关闭对此服务的健康检查。

  • fail_timeout=time 设置服务被标记为不可用的时长。当经过这个时间之后,Nginx 会开始探测服务是否可用,如果服务可以被正常访问,此服务会被标记为可用。

  • ……

hash

指令 hash 用于指定一个服务组的负载均衡方式:基于 key 的 hash 值在服务之间分配请求。key 可以是文本和变量,或者它们的组合。

ip_hash

指令 ip_hash 用于指定一个服务组的负载均衡方式:基于客户端 IP 的 hash 值在服务之间分配请求。这种方式可以使同一个客户端的请求始终被映射到同一个服务,除非该服务处于不可用状态。

upstream backend {
    ip_hash;

    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com down;
    server backend4.example.com;
}

least_conn

指令 least_conn 用于指定一个服务组的负载均衡方式:将请求分配给活跃连接数量最少的服务,同时也会考虑服务的权重。

least_time

指令 least_time 用于指定一个服务组的负载均衡方式:将请求分配给活跃连接数量最少和平均响应时间最短的服务,同时也会考虑服务的权重。

random

指令 random 用于指定一个服务组的负载均衡方式:将请求分配给随机选择的服务,同时也会考虑服务的权重。

ngx_http_log_module 模块

log_format compression '$remote_addr - $remote_user [$time_local] '
                       '"$request" $status $bytes_sent '
                       '"$http_referer" "$http_user_agent" "$gzip_ratio"';

access_log /spool/logs/nginx-access.log compression buffer=32k;

access_log

指令 access_log 用于指定 request log 的文件地址、写入格式和写入时的缓冲区配置。可以同时配置多个 access_log。以 syslog: 为前缀的文件地址表示日志将会被写入 syslog。如果没有配置日志格式,则默认使用 combined 格式。

log_format

指令 log_format 用于定义 request log 的写入格式。

模块 ngx_http_upstream_module 用于定义可以被 、、、、 和 指令引用的服务组,文档地址: 。

模块 ngx_http_log_module 用于指定 request 日志的写入格式,文档地址: 。

https://nginx.org/en/docs/http/ngx_http_proxy_module.html
server group
proxy_pass
fastcgi_pass
uwsgi_pass
scgi_pass
memcached_pass
grpc_pass
https://nginx.org/en/docs/http/ngx_http_upstream_module.html
https://nginx.org/en/docs/http/ngx_http_log_module.html