当前位置: 首页 > article >正文

Nginx - 配置文件 Configuration 详解

⭐ 参考资料:Nginx 新手起步 · OpenResty最佳实践 (gitbooks.io)

一、概述

  1. 配置文件位置(nginx.conf):/usr/local/nginx/conf/etc/nginx/usr/local/etc/nginx

  2. 日志文件位置(access.log 和 error.log):/usr/local/nginx/logs/var/log/nginx

  3. 配置文件结构

    1. 简单指令(simple directives):由名称和参数组成,以空格分隔,以分号(;)结尾
    2. 块指令(block directives):以大括号({})包围的附加指令集合
    3. 上下文(context):大括号内包含其他指令的部分(例如:events、http、server 和 location)
  4. 启动命令

    命令功能
    nginx -s stopfast shutdown(直接关闭)
    nginx -s quitgraceful shutdown(原线程执行完手头任务后关闭)
    nginx -s reloadreloading the configuration file(原线程执行完手头任务,重新开启新的线程执行新任务)
    nginx -s reopenreopening the log files

二、context

1. main(全局配置)

  1. 位置: Nginx 配置文件的顶层,没有被任何其他上下文包裹

  2. 作用: 主要用于定义全局配置,影响整个 Nginx 进程的行为,如 worker 进程数、日志路径等

  3. 常用指令

    指令名功能
    worker_processes定义 Nginx 启动的工作进程数
    error_log定义全局错误日志的位置和日志级别
    pid定义存储 Nginx 进程 ID 的文件位置

2. events(事件处理)

  1. 位置: 通常位于 main 上下文内部

  2. 作用: 配置与网络连接处理相关的选项,包括每个 worker 进程可以处理的最大连接数、连接方法等

  3. 常用指令

    指令名功能
    worker_connections定义每个 worker 进程可以处理的最大连接数
    use指定使用的多路复用模型,如 epoll(Linux)、kqueue(FreeBSD)等

3. http(HTTP 服务)

  1. 位置: 通常位于 main 上下文内部

  2. 作用: 配置与 HTTP 服务相关的选项,包括服务器块、位置块、缓存等。是用于定义 Nginx 作为 Web 服务器的主要配置区域

    常用指令

    指令名功能
    server定义虚拟主机(server block)
    location定义处理特定 URI 路径的配置
    upstream定义上游服务器组,用于负载均衡

4. server(虚拟主机)

  1. 位置: 位于 http 上下文内部

  2. 功能: 定义虚拟主机的配置,每个 server 块表示一个虚拟主机,包括监听端口、域名、处理请求的位置等

  3. 常用指令

    指令名功能
    listen定义虚拟主机监听的端口号和 IP 地址
    server_name定义虚拟主机的域名
    location定义处理特定路径的配置

5. location(请求处理)

  1. 位置: 位于 server 上下文内部

  2. 作用: 定义如何处理特定的 URI 请求路径,可以配置静态文件服务、反向代理、重定向等

  3. 常用指令

    指令名功能
    proxy_pass定义将请求代理到另一个服务器
    root定义静态文件的根目录
    index定义默认的首页文件名

6. upstream(上游服务器组)

  1. 位置: 位于 http 上下文内部

  2. 作用: 定义上游服务器组,用于负载均衡多个后端服务器

  3. 常用指令

    指令名功能
    server定义上游服务器的地址和端口
    least_conn使用最少连接负载均衡策略
    ip_hash使用基于 IP 地址的负载均衡策略

三、http 配置

提供静态数据

  1. 功能:在部署 nginx 的服务器中存储静态文件,用户请求时直接返回本地文件(例如图像或静态 HTML 页面)

  2. 工作流程

    1. 将数据存储到 nginx 服务器的特定目录 /path/to/my/static/resource
    2. 在 nginx 配置文件中,声明资源在服务器中的位置(http.server.location.root)
    3. 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
    4. 客户端访问静态资源路径
  3. 配置方法:自定义 “http 块” 中的 ”server 块”

  4. 配置规则

    参数功能
    http.server提供服务的服务器,通过 “监听的端口号” 和 “服务器名称” 进行区分
    http.server.location配置用户请求的静态文件地址,优先匹配 “最长路径”
    http.server.location.root匹配的本地文件的地址前缀
  5. 示例

    http {
    		
    		server {
    				listen myPort;
    				root /path/to/my/local/resource/of/upstream/server;
    				server_name myServerName;
    				
    				location /my/path/in/url {
    						root /path/to/my/static/resource
    				}
    				
    				location /my/homepage/url {
    						root /my/path/to/homepage;
    				}
    				
    		}
    }
    

动态代理

  1. 功能:接收客户端请求,但是 nginx 自己不处理,而是交给上游服务器(upstream server)处理

  2. 工作流程

    1. 在 nginx 配置文件中,声明一个新的 server ,用于指定上游服务器
    2. 在 nginx 配置文件中,指定上游服务器的完整 “地址+端口号”(http.server.location.proxy_pass)
    3. 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
  3. ⭐ 注意

    • 路径结尾不带 “/” ⇒ Nginx 会保留 location 中匹配到的路径前缀,并将其添加到上游服务器的地址后面
    • proxy_pass 结尾带 “/” ⇒ Nginx 会删除 location 中匹配的路径前缀,只保留剩下的路径部分,并将其直接添加到上游服务器的地址后面
  4. 示例

    1. 用户访问 localhost:8080/upstream1/xxx ,则会由第二个 server 代理到第一个 server,请求发送给 8080 端口并获取 /data/upstream1/xxx 资源
    2. 用户访问 localhost/xxx.gif ,则由第二个 server 从服务器的 /data/images/ 地址获取 /data/images/xxx.gif 资源
    http {
    
        # 模拟的一个远程服务器
    		server {
    		    listen 8080;
    		    root /data/upstream1;
    		    location / {
    		    }
    		}
    
    		# 本地服务器
    		server {
    		    listen 80 default_server;                        # 监听 80 端口,并设置为默认服务器
    		    location /upstream1/ {                           # 代理 /upstream1/ 路径的请求到 localhost 的 8080 端口
    		        proxy_pass http://localhost:8080/;
    		    }
    		
    		    location ~ \\.(gif|jpg|png)$ {                    # 匹配 .gif, .jpg, .png 结尾的请求,并从 /data/images 目录中提供这些文件
    		        root /data/images;
    		    }
    		    
    		    # 反向代理 /yudada/ 路径的请求到 localhost 的 8082 端口
    		    location /yudada/ {
    		        proxy_pass http://localhost:8082/;            # 将所有 /yudada/ 开头的请求代理到 yudada 服务所在地址(http://localhost:8082/)
    		        proxy_set_header Host $host;                  # 传递 "客户端请求的域名" 或 "IP 地址" 给后端服务器
    		        proxy_set_header X-Real-IP $remote_addr;      # 传递 "发起请求的客户端的 IP 地址" 给后端服务器
    		        # 传递 "原始客户端的 IP 地址" 和 "可能由其他代理服务器添加的 X-Forwarded-For 头部信息"
    		        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		        proxy_set_header X-Forwarded-Proto $scheme;   # 传递客户端请求使用的协议(通常是 http 或 https)
    		        
    		        proxy_http_version 1.1;                       # proxy_http_version 1.1 是为了支持保持连接(keep-alive)
    		        proxy_set_header Connection "keep-alive";     # 保持后端连接
    		        keepalive_timeout 3600s;                      # 设置保持连接时间为 3600 秒(即一个小时)
    		
    						# 设置超时时间
    		        proxy_connect_timeout 90s;                    # 设置连接到后端服务器的超时时间为 90 秒
    		        proxy_send_timeout 90s;                       # 设置发送请求到后端服务器的超时时间为 90 秒
    		        proxy_read_timeout 90s;                       # 设置从后端服务器读取响应的超时时间为 90 秒
    		        
    		        client_max_body_size 100m;                    # 限制上传到后端服务器的请求体最大为 100MB
    		    }
    		}
        
        
    }
    

四、缓存配置

  1. 缓存参数
配置信息配置位置功能
proxy_cache_path最外层用来设置缓存的路径和配置
proxy_cacheserver/location用来启用缓存
use_temp_path=off(推荐)server/location用于指示 Nginx 缓存注定写入缓存的文件时将它们写入同一个目录下,避免在文件系统中不必要的数据拷贝
proxy_cache_use_staleserver/location用于提高可用性,当服务器宕机或繁忙时返回过期数据(避免直接返回错误信息)
proxy_cache_revalidate onserver/location验证缓存有效性,缓存有效则服务器返回304 Not Modified响应,否则从上游服务器获取新的响应并更新缓存
proxy_cache_min_uses 3server/location用于减少冗余缓存,设置缓存最小使用次数为3次,只有当缓存项被请求了至少3次后,才会被缓存起来
proxy_cache_lock onserver/location用于启用缓存锁,保证并发时的缓存击穿,保证只有一个请求到达上游服务器

配置基础缓存

  1. 命令:proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
    1. /path/to/cache/ 用于缓存的本地磁盘目录
    2. levels=1:2 在 /path/to/cache/ 设置了一个两级层次结构的目录 (1个一级目录和2个二级目录)
    3. keys_zone 设置一个共享内存区 my_cache,大小为 10m,该内存区用于存储缓存键和元数据,有些类似计时器的用途
    4. max_size 设置缓存的上限
    5. inactive 不被访问的情况下能够在内存中保持的时间,默认为 10m
  2. 配置位置:nginx.conf 最外层

启用缓存

  1. 命令:proxy_cache my_cache;
    1. my_cache:基础缓存中配置的共享缓存区 keys_zone=my_cache
  2. 配置位置:location { }

配置反向代理

  1. 命令:proxy_pass http://my_upstream_server;
    1. http://my_upstream_server:代理 nginx 转发的目标服务器地址
  2. 工作流程
    1. 客户端向 nginx 服务器发起请求
    2. nginx 服务器接收请求并依据转发规则发送到 my_upstream_server 上游服务器
    3. my_upstream_server 上游服务器处理请求并将结果返回给 nginx 服务器
    4. nginx 服务器将响应缓存到 my_cache 中
  3. 配置位置:location { }

允许分发过期内容

  1. 命令:proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
  2. 配置位置:location { }
  3. 功能:当 Nginx 收到服务器返回的 error,timeout 或者其他指定的 5xx 错误,并且在其缓存中有请求文件的陈旧版本,则将旧版本发送给客户端

跨硬盘分割缓存

  1. 功能:用来在多个硬盘之间分割缓存,减轻单个缓存路径的负载压力,且不需要建立一个 RAID(磁盘阵列)

  2. 配置位置:最外层

  3. 示例:基于请求 URI 跨越两个硬盘之间均分缓存

    proxy_cache_path /path/to/hdd1 levels=1:2 keys_zone=my_cache_hdd1:10m max_size=10g inactive=60m use_temp_path=off;
    proxy_cache_path /path/to/hdd2 levels=1:2 keys_zone=my_cache_hdd2:10m max_size=10g inactive=60m use_temp_path=off;
    
    # 根据请求URI的哈希值, 50%的概率分配到my_cache_hdd1缓存区域中,另外50%的概率分配到my_cache_hdd2缓存区域中
    split_clients $request_uri $my_cache {
        50% "my_cache_hdd1";
        50% "my_cache_hdd2";
    }
    
    server {
        ...
        location / {
            proxy_cache $my_cache;
            proxy_pass http://my_upstream;
        }
    }
    
  4. URI(Uniform Resource Identifier)

    统一资源标识符,用于唯一标识网络上的资源,通常包括协议类型、主机名、路径等信息

    在HTTP请求中,URI指的是请求的资源路径

  5. RAID(Redundant Array of Independent Disks)

    1. 一种将多个硬盘组合起来形成一个逻辑存储单元的技术,旨在提高数据的性能、容量或冗余度
    2. RAID技术允许将数据分布在多个硬盘上,从而提高了数据的读写速度和容错能力
    3. RAID通常用于服务器和存储系统中,以提供高性能和高可靠性的存储解决方案


http://www.kler.cn/a/442365.html

相关文章:

  • 自动驾驶占用网格预测
  • 1.17组会汇报
  • Pandas库的常用内容归纳
  • css中的阴影详解
  • 【从零开始使用系列】StyleGAN2:开源图像生成网络——环境搭建与基础使用篇(附大量测试图)
  • 主链和Layer2之间资产转移
  • 基于python对pdf文件进行加密等操作
  • LM芯片学习
  • openGauss 安装记录 lite 版本
  • 陪诊小程序搭建,打造一站式陪诊服务
  • 开源照片浏览工具Ralbum
  • 文献研读|基于像素语义层面图像重建的AI生成图像检测
  • 表单校验记录
  • Java并发编程框架之第三方库
  • eclipse 如何设置项目、不同类型文件的 utf8 编码
  • 如何与GPT更高效的问答
  • xxl-job 整合 Seatunnel 实现定时任务
  • Bootstrap Blazor中使用PuppeteerSharp对HTML截图
  • 【嵌入式——QT】QT多线程编程
  • Halcon中dots_image(Operator)算子原理及应用详解
  • JumpServer开源堡垒机搭建及使用
  • 基于yolov10的遥感影像目标检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)
  • 计算机网络技术基础:3.计算机网络的拓扑结构
  • 从零开始学TiDB(5)Raft与Multi Raft
  • 【Java】使用RSA进行数字签名详解(复制即用,内有详细注释)
  • 用 Python 从零开始创建神经网络(十七):回归(Regression)