Nginx - 配置文件 Configuration 详解
⭐ 参考资料:Nginx 新手起步 · OpenResty最佳实践 (gitbooks.io)
一、概述
-
配置文件位置(nginx.conf):
/usr/local/nginx/conf
或/etc/nginx
或/usr/local/etc/nginx
-
日志文件位置(access.log 和 error.log):
/usr/local/nginx/logs
或/var/log/nginx
-
配置文件结构
- 简单指令(simple directives):由名称和参数组成,以空格分隔,以分号(
;
)结尾 - 块指令(block directives):以大括号(
{
和}
)包围的附加指令集合 - 上下文(context):大括号内包含其他指令的部分(例如:events、http、server 和 location)
- 简单指令(simple directives):由名称和参数组成,以空格分隔,以分号(
-
启动命令
命令 功能 nginx -s stop
fast shutdown(直接关闭) nginx -s quit
graceful shutdown(原线程执行完手头任务后关闭) nginx -s reload
reloading the configuration file(原线程执行完手头任务,重新开启新的线程执行新任务) nginx -s reopen
reopening the log files
二、context
1. main(全局配置)
-
位置: Nginx 配置文件的顶层,没有被任何其他上下文包裹
-
作用: 主要用于定义全局配置,影响整个 Nginx 进程的行为,如 worker 进程数、日志路径等
-
常用指令
指令名 功能 worker_processes
定义 Nginx 启动的工作进程数 error_log
定义全局错误日志的位置和日志级别 pid
定义存储 Nginx 进程 ID 的文件位置
2. events(事件处理)
-
位置: 通常位于 main 上下文内部
-
作用: 配置与网络连接处理相关的选项,包括每个 worker 进程可以处理的最大连接数、连接方法等
-
常用指令
指令名 功能 worker_connections
定义每个 worker 进程可以处理的最大连接数 use
指定使用的多路复用模型,如 epoll(Linux)、kqueue(FreeBSD)等
3. http(HTTP 服务)
-
位置: 通常位于 main 上下文内部
-
作用: 配置与 HTTP 服务相关的选项,包括服务器块、位置块、缓存等。是用于定义 Nginx 作为 Web 服务器的主要配置区域
常用指令
指令名 功能 server
定义虚拟主机(server block) location
定义处理特定 URI 路径的配置 upstream
定义上游服务器组,用于负载均衡
4. server(虚拟主机)
-
位置: 位于 http 上下文内部
-
功能: 定义虚拟主机的配置,每个 server 块表示一个虚拟主机,包括监听端口、域名、处理请求的位置等
-
常用指令
指令名 功能 listen
定义虚拟主机监听的端口号和 IP 地址 server_name
定义虚拟主机的域名 location
定义处理特定路径的配置
5. location(请求处理)
-
位置: 位于 server 上下文内部
-
作用: 定义如何处理特定的 URI 请求路径,可以配置静态文件服务、反向代理、重定向等
-
常用指令
指令名 功能 proxy_pass
定义将请求代理到另一个服务器 root
定义静态文件的根目录 index
定义默认的首页文件名
6. upstream(上游服务器组)
-
位置: 位于 http 上下文内部
-
作用: 定义上游服务器组,用于负载均衡多个后端服务器
-
常用指令
指令名 功能 server
定义上游服务器的地址和端口 least_conn
使用最少连接负载均衡策略 ip_hash
使用基于 IP 地址的负载均衡策略
三、http 配置
提供静态数据
-
功能:在部署 nginx 的服务器中存储静态文件,用户请求时直接返回本地文件(例如图像或静态 HTML 页面)
-
工作流程
- 将数据存储到 nginx 服务器的特定目录 /path/to/my/static/resource
- 在 nginx 配置文件中,声明资源在服务器中的位置(http.server.location.root)
- 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
- 客户端访问静态资源路径
-
配置方法:自定义 “http 块” 中的 ”server 块”
-
配置规则
参数 功能 http.server
提供服务的服务器,通过 “监听的端口号” 和 “服务器名称” 进行区分 http.server.location
配置用户请求的静态文件地址,优先匹配 “最长路径” http.server.location.root
匹配的本地文件的地址前缀 -
示例
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; } } }
动态代理
-
功能:接收客户端请求,但是 nginx 自己不处理,而是交给上游服务器(upstream server)处理
-
工作流程
- 在 nginx 配置文件中,声明一个新的 server ,用于指定上游服务器
- 在 nginx 配置文件中,指定上游服务器的完整 “地址+端口号”(http.server.location.proxy_pass)
- 在 nginx 配置文件中,声明客户端获取资源的路径(http.server.location)
-
⭐ 注意
路径结尾不带 “/”
⇒ Nginx 会保留 location 中匹配到的路径前缀,并将其添加到上游服务器的地址后面proxy_pass 结尾带 “/”
⇒ Nginx 会删除 location 中匹配的路径前缀,只保留剩下的路径部分,并将其直接添加到上游服务器的地址后面
-
示例
- 用户访问 localhost:8080/upstream1/xxx ,则会由第二个 server 代理到第一个 server,请求发送给 8080 端口并获取 /data/upstream1/xxx 资源
- 用户访问 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 } } }
四、缓存配置
- 缓存参数
配置信息 | 配置位置 | 功能 |
---|---|---|
proxy_cache_path | 最外层 | 用来设置缓存的路径和配置 |
proxy_cache | server/location | 用来启用缓存 |
use_temp_path=off(推荐) | server/location | 用于指示 Nginx 缓存注定写入缓存的文件时将它们写入同一个目录下,避免在文件系统中不必要的数据拷贝 |
proxy_cache_use_stale | server/location | 用于提高可用性,当服务器宕机或繁忙时返回过期数据(避免直接返回错误信息) |
proxy_cache_revalidate on | server/location | 验证缓存有效性,缓存有效则服务器返回304 Not Modified响应,否则从上游服务器获取新的响应并更新缓存 |
proxy_cache_min_uses 3 | server/location | 用于减少冗余缓存,设置缓存最小使用次数为3次,只有当缓存项被请求了至少3次后,才会被缓存起来 |
proxy_cache_lock on | server/location | 用于启用缓存锁,保证并发时的缓存击穿,保证只有一个请求到达上游服务器 |
配置基础缓存
- 命令:
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
- /path/to/cache/ 用于缓存的本地磁盘目录
- levels=1:2 在 /path/to/cache/ 设置了一个两级层次结构的目录 (1个一级目录和2个二级目录)
- keys_zone 设置一个共享内存区 my_cache,大小为 10m,该内存区用于存储缓存键和元数据,有些类似计时器的用途
- max_size 设置缓存的上限
- inactive 不被访问的情况下能够在内存中保持的时间,默认为 10m
- 配置位置:nginx.conf 最外层
启用缓存
- 命令:
proxy_cache my_cache;
- my_cache:基础缓存中配置的共享缓存区 keys_zone=my_cache
- 配置位置:location { }
配置反向代理
- 命令:
proxy_pass http://my_upstream_server;
- http://my_upstream_server:代理 nginx 转发的目标服务器地址
- 工作流程
- 客户端向 nginx 服务器发起请求
- nginx 服务器接收请求并依据转发规则发送到 my_upstream_server 上游服务器
- my_upstream_server 上游服务器处理请求并将结果返回给 nginx 服务器
- nginx 服务器将响应缓存到 my_cache 中
- 配置位置:location { }
允许分发过期内容
- 命令:
proxy_cache_use_stale error timeout http_500 http_502 http_503 http_504;
- 配置位置:location { }
- 功能:当 Nginx 收到服务器返回的 error,timeout 或者其他指定的 5xx 错误,并且在其缓存中有请求文件的陈旧版本,则将旧版本发送给客户端
跨硬盘分割缓存
-
功能:用来在多个硬盘之间分割缓存,减轻单个缓存路径的负载压力,且不需要建立一个 RAID(磁盘阵列)
-
配置位置:最外层
-
示例:基于请求 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; } }
-
URI(Uniform Resource Identifier)
统一资源标识符,用于唯一标识网络上的资源,通常包括协议类型、主机名、路径等信息
在HTTP请求中,URI指的是请求的资源路径
-
RAID(Redundant Array of Independent Disks)
- 一种将多个硬盘组合起来形成一个逻辑存储单元的技术,旨在提高数据的性能、容量或冗余度
- RAID技术允许将数据分布在多个硬盘上,从而提高了数据的读写速度和容错能力
- RAID通常用于服务器和存储系统中,以提供高性能和高可靠性的存储解决方案