一 nginx与http结合
1. 请求行 (Request Line)
请求行是 HTTP 请求的第一行,它告诉 Nginx 客户端想要做什么、对哪个资源进行操作以及使用哪个版本的 HTTP 协议。
-
方法 (Method):常见的有 GET(获取资源)、POST(发送数据)、PUT(更新资源)等。
-
请求 URI (Request-URI) :标识要访问的资源,比如
/index.html
或/api/user
。 -
HTTP 版本 (HTTP Version) :通常是
HTTP/1.1
或HTTP/2
。GET /index.html HTTP/1.1
Nginx 处理:
- Nginx 会根据请求的方法和 URI 来决定如何处理这个请求。
- 如果是 GET 请求,Nginx 可能会直接从文件系统中读取相应的文件并返回给客户端。
- 如果是 POST 请求,Nginx 可能会将请求转发到后端的应用服务器,比如通过反向代理到一个 PHP 或者 Node.js 应用。
2. 请求头 (Request Headers)
请求头提供了关于请求的附加信息,如客户端类型、接受的内容类型等。这些信息帮助 Nginx 更好地理解客户端的需求,并做出适当的响应。
常见的请求头字段:
- Host: 指定请求的目标主机名和端口号,这对于虚拟主机配置非常重要。
- User-Agent: 提供发起请求的应用程序的信息,比如浏览器类型和版本。
- Accept: 告诉服务器客户端能够处理的内容类型。
- Content-Type : 在 POST 请求中,指明发送的数据类型,如
application/x-www-form-urlencoded
或application/json
。 - Content-Length: 指明请求体的长度(字节数),对于 POST 请求很重要。
- Cookie: 携带之前服务器设置的 cookie 信息,用于会话管理和身份验证。
- Authorization: 用于认证,例如 Basic 或 Bearer 认证。
示例:
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Nginx 处理:
- Nginx 可以根据
Host
头来路由请求到不同的虚拟主机。 User-Agent
和Accept
等头可以帮助 Nginx 决定返回哪种格式的内容。Content-Type
和Content-Length
对于处理 POST 请求中的数据至关重要。Cookie
和Authorization
用于会话管理和用户认证。
3. 请求体 (Request Body)
请求体包含了实际的数据内容,这些数据通常在 POST 和 PUT 请求中发送。请求体可以包含表单数据、JSON 数据、文件上传等。
示例 (对于 POST 请求):
Content-Type: application/x-www-form-urlencoded
name=John&age=30
或者对于 JSON 数据:
Content-Type: application/json
{
"name": "John",
"age": 30
}
Nginx 处理:
- 对于静态文件请求(如 GET 请求),Nginx 直接读取文件并返回给客户端。
- 对于动态内容请求(如 POST 请求),Nginx 通常会将请求体中的数据转发到后端应用服务器(如 PHP-FPM、Node.js 应用等)。
- Nginx 可以配置为缓存某些请求的结果,减少后端服务器的压力。
结合 Nginx 的配置示例
假设你有一个简单的 Nginx 配置文件,如下:
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
index index.html index.htm;
}
location /api/ {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- 当客户端发送一个 GET 请求到
http://example.com/index.html
时,Nginx 会查找/var/www/html/index.html
文件并返回给客户端。 - 当客户端发送一个 POST 请求到
http://example.com/api/data
时,Nginx 会将请求转发到http://backend_server/api/data
,并将客户端的真实 IP 地址和其他必要的头信息传递给后端服务器。
二 nginx处理http请求的11个阶段详解
1. POST READ 阶段
- 功能:在这个阶段,Nginx 已经读取了完整的客户端请求头,但还没有开始处理请求体。
- 用途:可以用来进行一些预处理,例如检查请求是否合法、限制请求大小等。
- 示例 :
ngx_http_limit_req_module
模块用于限制请求速率。
2. SERVER REWRITE 阶段
- 功能:在这个阶段,Nginx 可以修改请求 URI 和参数。
- 用途:通常用于 URL 重写,将一个 URL 转换为另一个 URL。
- 示例 :
ngx_http_rewrite_module
模块用于 URL 重写。
3. LOCATION 阶段
- 功能 :根据请求 URI 确定哪个
location
块应该处理这个请求。 - 用途 :匹配
location
块,并确定后续处理流程。 - 示例 :
ngx_http_core_module
中的location
指令。
4. LOCATION REWRITE 阶段
- 功能 :与 SERVER REWRITE 类似,但作用于选定的
location
块。 - 用途 :在特定
location
内部进行 URL 重写。 - 示例 :
ngx_http_rewrite_module
模块用于location
内部的 URL 重写。
5. ACCESS 阶段
- 功能:在这个阶段,Nginx 检查客户端是否有权限访问请求的资源。
- 用途:进行访问控制,如 IP 白名单/黑名单、用户认证等。
- 示例 :
ngx_http_access_module
模块用于基于 IP 地址的访问控制。
6. POST ACCESS 阶段
- 功能:在访问控制之后,但在内容生成之前执行。
- 用途:可以用于日志记录或进一步的请求处理。
- 示例 :
ngx_http_realip_module
模块用于设置客户端的真实 IP 地址。
7. TRY FILES 阶段
- 功能:尝试多个文件路径,找到第一个存在的文件并返回。
- 用途:通常用于静态文件服务,确保文件存在。
- 示例 :
ngx_http_core_module
中的try_files
指令。
8. CONTENT 阶段
- 功能:生成响应内容。
- 用途:处理实际的内容生成,如从文件系统读取文件、调用后端应用等。
- 示例 :
ngx_http_static_module
模块用于提供静态文件服务,ngx_http_proxy_module
模块用于反向代理。
9. LOG 阶段
- 功能:记录日志信息。
- 用途:记录请求和响应的相关信息,用于监控和调试。
- 示例 :
ngx_http_log_module
模块用于日志记录。
10. HEADER FILTER 阶段
- 功能:修改响应头。
- 用途:在响应头发送给客户端之前对其进行修改。
- 示例 :
ngx_http_headers_module
模块用于添加或删除响应头。
11. BODY FILTER 阶段
- 功能:修改响应体。
- 用途:在响应体发送给客户端之前对其进行修改,如压缩、加密等。
- 示例 :
ngx_http_gzip_module
模块用于响应体的 GZIP 压缩。
示例配置
假设你有一个简单的 Nginx 配置文件,如下所示:
server {
listen 80;
server_name example.com;
# POST READ 阶段
limit_req zone=one burst=5 nodelay;
# SERVER REWRITE 阶段
rewrite ^/oldpage /newpage permanent;
location / {
# LOCATION 阶段
root /var/www/html;
index index.html index.htm;
# LOCATION REWRITE 阶段
if ($request_uri ~* "^/oldpath") {
rewrite ^/oldpath/(.*)$ /newpath/$1 break;
}
# ACCESS 阶段
allow 192.168.1.0/24;
deny all;
# TRY FILES 阶段
try_files $uri $uri/ =404;
# CONTENT 阶段
autoindex on;
}
# LOG 阶段
access_log /var/log/nginx/access.log main;
# HEADER FILTER 阶段
add_header X-Frame-Options SAMEORIGIN;
# BODY FILTER 阶段
gzip on;
}
解释
- POST READ 阶段 :使用
limit_req
模块限制请求速率。 - SERVER REWRITE 阶段 :使用
rewrite
指令将/oldpage
重定向到/newpage
。 - LOCATION 阶段 :定义了根目录
/var/www/html
并设置了默认索引文件。 - LOCATION REWRITE 阶段 :如果请求 URI 匹配
/oldpath
,则将其重写为/newpath
。 - ACCESS 阶段 :只允许来自
192.168.1.0/24
网络的请求。 - TRY FILES 阶段:尝试查找请求的文件,如果不存在则返回 404 错误。
- CONTENT 阶段:启用目录列表功能。
- LOG 阶段:记录访问日志。
- HEADER FILTER 阶段 :添加
X-Frame-Options
头以防止点击劫持。 - BODY FILTER 阶段:启用 GZIP 压缩。
通过这些阶段,Nginx 可以高效地处理各种 HTTP 请求,并提供了灵活的配置选项来满足不同的需求。理解这些阶段有助于更好地配置 Nginx 以优化性能和安全性。