nginx笔记
请求方法
HTTP协议定义了多种请求方法,每种方法都有特定的语义和用途
主要请求方法
POST方法:主要用于向服务器提交数据,常用来执行新增或修改操作。POST请求的参数包含在请求体中而非URL中,这使得它可以传输较大量的数据,并且支持多种编码格式。典型的应用场景包括提交用户注册信息、上传文件等。
OPTIONS方法:用于获取目标资源所支持的通信选项,即服务器支持哪些HTTP方法。它在跨域资源共享(CORS)中扮演重要角色,浏览器会先发送OPTIONS请求进行预检,以确认实际请求(如POST)是否被允许。
GET:用于请求指定的资源,通常用于查询数据而不会修改资源内容。无论进行多少次操作,结果都是一样的,具有幂等性。
PUT:向服务器发送数据以更新资源,它会替换指定资源的全部内容。与POST不同,PUT是幂等的,多次发出相同的PUT请求会产生相同的结果。
DELETE:用于请求服务器删除指定的资源。
HEAD:类似于GET请求,但服务器只返回响应头,不返回响应体,常用于检查资源是否存在或获取资源的元数据。
PATCH:用于更新资源的部分内容,与PUT不同,它只发送描述更改的文档而不是整个资源。
CONNECT:用于建立到服务器的隧道连接,主要用于通过HTTP代理服务器建立SSL/TLS连接。
TRACE:用于回显服务器收到的请求,主要用于调试和诊断目的。
方法特性对比
不同的HTTP方法在幂等性方面存在差异:GET、PUT、DELETE、HEAD、OPTIONS和TRACE都是幂等的,而POST和PATCH不是幂等的。
在实际开发中,虽然GET和POST最为常用,但在构建RESTful API或处理特定类型的交互时,了解其他方法也至关重要。例如,OPTIONS方法常用于跨域资源共享(CORS)预检请求,以确定服务器是否允许特定类型的跨域请求。
跨域配置
1 | set $allow_origin ""; |
$http_origin 为空时的情况
$http_origin 为空通常有两种场景:
- 同域请求:客户端与服务器域名相同(如客户端
https://goupos.cn向服务器https://goupos.cn发起请求),浏览器不会发送Origin头,因此$http_origin为空。 - 非跨域的简单请求:某些情况下(如
GET请求不带自定义头),浏览器可能不发送Origin头,导致$http_origin为空。
在你的配置中,$http_origin 为空时的表现:
- 不会进入
if ($http_origin ~* "...")条件块,因此$allow_origin保持初始值""(空)。 - 对于同域请求:浏览器因 “同源策略” 允许请求通过,即使
Access-Control-Allow-Origin为空(跨域头仅对跨域请求生效),请求正常执行。 - 对于非跨域但触发预检的请求(极少情况):若同域请求因带自定义头触发
OPTIONS预检,会因Access-Control-Allow-Origin为空被浏览器拦截(实际中同域很少触发预检)。
用于处理浏览器的跨域资源共享(CORS)预检请求(OPTIONS 请求),核心作用是告诉浏览器:“允许哪些跨域请求是被允许的”,从而让后续的实际请求(如 GET)能正常执行。以下是具体含义和允许的操作:
set $allow_origin "";
- 初始化变量
$allow_origin为空字符串,默认拒绝所有跨域来源(“默认不允许” 是安全原则)。
if ($http_origin ~* "...") { ... }- 作用:校验客户端的来源域名(
$http_origin)是否在白名单内。
正则^https://(XXXXXX\.cn|[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.XXXXXX\.cn)$:
仅匹配https://XXXXXX.cn(主域名)或https://xxx.XXXXXX.cn(符合规范的子域,如www.XXXXXX.cn、api-test.XXXXXX.cn)。
匹配成功时:set $allow_origin $http_origin将允许的来源设为客户端实际域名(动态允许白名单内的跨域)。
- 作用:校验客户端的来源域名(
if ($request_method = 'OPTIONS') { ... }作用:处理浏览器的跨域预检请求(
OPTIONS方法),告知浏览器是否允许后续的实际请求(如POST)。用于处理浏览器的跨域资源共享(CORS)预检请求(OPTIONS 请求),核心作用是告诉浏览器:“允许哪些跨域请求是被允许的”,从而让后续的实际请求(如 GET)能正常执行。以下是具体含义和允许的操作:
含义:当客户端发送的请求方法是
OPTIONS时,执行花括号内的逻辑。背景:浏览器在处理跨域的复杂请求(如带自定义头、非简单方法的请求)时,会先自动发送一个
OPTIONS请求(预检请求),询问服务器 “是否允许后续的实际请求”。只有预检通过后,浏览器才会发送真正的请求(如 GET)。
add_header 'Access-Control-Allow-Origin' $allow_origin always;- 含义:允许 “发起请求的域名” 跨域访问服务器。
- 细节:
$http_origin是 Nginx 的内置变量,代表客户端的来源域名(如https://client.com)。always确保这个头在所有状态码的响应中都生效(避免遗漏)。
- 允许的操作:仅允许 “实际发起请求的域名” 跨域,拒绝其他未请求的域名(比
*更安全)。
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;- 含义:告诉浏览器,服务器允许的跨域请求方法是
GET和OPTIONS。 - 允许的操作:客户端后续只能用
GET方法发起跨域请求(OPTIONS是预检本身,不算实际请求),其他方法(如 POST、PUT)会被浏览器拦截。
- 含义:告诉浏览器,服务器允许的跨域请求方法是
add_header 'Access-Control-Allow-Headers' 'Content-Type' always;- 含义:告诉浏览器,服务器允许跨域请求中携带
Content-Type这个请求头。 - 允许的操作:客户端在跨域请求中可以指定
Content-Type(如application/json),服务器会接受该头信息,否则浏览器会因 “携带了不允许的头” 而拦截请求。
- 含义:告诉浏览器,服务器允许跨域请求中携带
add_header 'Access-Control-Max-Age' 1728000 always;- 含义:指定预检请求的结果(即上述允许规则)可以被浏览器缓存1728000 秒(20 天)。
- 允许的操作:缓存期间,相同的跨域请求不会重复发送预检请求,减少服务器压力和网络开销。
return 204:预检请求无需返回内容,用204 No Content快速响应。
安装nginx最新版本
查看版本信息
1 | lsb_release -a |
备份配置
1 | # 备份整个Nginx配置目录(防止配置丢失) |
移除 Ubuntu 默认 Nginx(保留配置)
1 | # 仅删除程序文件,保留/etc/nginx配置(--purge会删配置,绝对不用) |
1 | # 1. 先更新APT缓存(获取最新的包信息) |
更换 Nginx 官方源并更新的完整操作
1 | # 1. 首先备份当前的源列表(防止出错) |
下面两个配置是示例:四选一就可以了,可以通过lsb_release -a命令查看版本,然后根据自己版本修改下面参数
**创建Nginx官方源独立配置文件(/etc/apt/sources.list.d/nginx-official.list)如下的版本是22.04 **
1 | sudo tee /etc/apt/sources.list.d/nginx-official.list << 'EOF' |
版本18.04
1 | sudo tee /etc/apt/sources.list.d/nginx-official.list << 'EOF' |
版本20.04
1 | sudo tee /etc/apt/sources.list.d/nginx-official.list << 'EOF' |
版本 24.04
1 | sudo tee /etc/apt/sources.list.d/nginx-official.list << 'EOF' |
1 | # 5. 设置源优先级(确保优先使用Nginx官方源,优先级1001高于系统源) |
1 | # 6. 更新软件源并升级Nginx 更新源缓存(仅读取Nginx独立配置,无冲突) |
配置 Nginx 自动更新(独立配置文件)
创建/etc/apt/apt.conf.d/60-nginx-auto-upgrade,仅自动更新 Nginx,不影响系统其他包:
对于不同版本:
1 | Ubuntu 18.04 → bionic |
18.04
1 | # 创建自动更新规则文件(仅更新Nginx,不影响系统其他包) |
20.04
1 | # 创建自动更新规则文件(仅更新Nginx,不影响系统其他包) |
22.04
1 | # 创建自动更新规则文件(仅更新Nginx,不影响系统其他包) |
24.04
1 | # 创建自动更新规则文件(仅更新Nginx,不影响系统其他包) |
创建一键手动更新脚本(备用)
创建/usr/local/bin/update-nginx脚本,执行即可更新到最新版:
1 | # 编写一键更新脚本,包含验证+重启逻辑 |
使用方法(更新 Nginx 到最新版)
自动更新(无需手动操作)
配置完成后,系统会每天自动检查 Nginx 官方源的更新,发现新版本会自动下载、安装,并在配置语法正常的情况下重启 Nginx。
手动更新(主动升级)
只需执行一行命令,即可一键完成更新 + 验证 + 重启:
1 | update-nginx |
验证自动更新规则(可选)
1 | sudo unattended-upgrade --dry-run --debug | grep nginx |
故障回滚(若更新后异常)
1 | # 恢复备份配置 |
http2
1 | http2 on; |
| 参数 | 作用 | 推荐值 |
|---|---|---|
| http2_idle_timeout | HTTP/2 空闲连接超时时间,超时后关闭连接 | 3m 或 5m |
| http2_max_concurrent_streams | 单个 HTTP/2 连接允许的最大并发流数量,控制多路复用的上限 | 128(默认值已经够用) |
| http2_max_field_size | 单个请求头字段的最大大小 | 4k 或 8k |
| http2_max_header_size | 整个请求头部分的最大大小 | 16k |
| http2_max_requests | 单个 HTTP/2 连接最大请求数,超过后关闭连接以释放资源 | 1000 |
| http2_recv_buffer_size | 接收缓冲区大小 | 256k |
| http2_recv_timeout | 接收数据超时,适用于慢客户端场景 | 30s |
| http2_chunk_size | 响应体分块大小 | 8k |
| http2_body_preread_size | 请求体预读缓冲区大小 | 64k |