Skip to content

Commit d52b92e

Browse files
ds
1 parent a665551 commit d52b92e

File tree

1 file changed

+277
-0
lines changed

1 file changed

+277
-0
lines changed

middleware/nginx.md

Lines changed: 277 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,287 @@ client_body_buffer_size size;
342342
client_body_temp_path dir-path[level1[level2[level3]]]
343343
```
344344
345+
*reset_timeout_connection*
346+
```bash
347+
reset_timeout_connection on|off;
348+
```
349+
连接超时后将通过向客户端发送RST包来直接重置连接。这个选项打开后,Nginx会在某个连接超时后,不是使用正常情形下的四次握手关闭TCP连接,而是直接向用户发送RST重
350+
置包,不再等待用户的应答,直接释放Nginx服务器上关于这个套接字使用的所有缓存(如TCP滑动窗口)。相比正常的关闭方式,它使得服务器避免产生许多处于FIN_WAIT_1、
351+
FIN_WAIT_2、TIME_WAIT状态的TCP连接。
352+
*keepalive_disable[msie6|safari|none]...*
353+
```bash
354+
keepalive_disablemsie6 safari
355+
```
356+
*tcp_nodelay*
345357
358+
```bash
359+
tcp_nodelay on;
360+
```
361+
### 文件操作的优化
362+
*sendfile系统调用*
363+
```bash
364+
sendfile on|off;
365+
```
366+
可以启用Linux上的sendfile系统调用来发送文件,它减少了内核态与用户态之间的两次内存复制,这样就会从磁盘中读取文件后直接在内核态发送到网卡设备,提高了发送文件的
367+
效率。
368+
*AIO系统调用*
369+
```bash
370+
aio on|off;
371+
```
372+
此配置项表示是否在FreeBSD或Linux系统上启用内核级别的异步文件I/O功能。注意,
373+
它与sendfile功能是互斥的。
346374
375+
*directio*
376+
```bash
377+
directio size|off;
378+
```
379+
此配置项在FreeBSD和Linux系统上使用O_DIRECT选项去读取文件,缓冲区大小为size,通常对大文件的读取速度有优化作用。注意,它与sendfile功能是互斥的。
380+
*directio_alignment*
381+
```bash
382+
directio_alignment size;
383+
# eg
384+
directio_alignment 512;
385+
```
386+
它与directio配合使用,指定以directio方式读取文件时的对齐方式。一般情况下,512B已经足够了,但针对一些高性能文件系统,如Linux下的XFS文件系统,可能需要设置到4KB
387+
作为对齐方式。
388+
*open_file_cache max=N[inactive=time]|off;*
389+
```bash
390+
open_file_cache off;
391+
```
392+
文件缓存会在内存中存储以下3种信息:
393+
- 文件句柄、文件大小和上次修改时间。
394+
- 已经打开过的目录结构。
395+
- 没有找到的或者没有权限操作的文件信息。
396+
这样,通过读取缓存就减少了对磁盘的操作。
397+
### 对客户端请求的特殊处理
398+
*ignore_invalid_headers on|off;*
399+
```bash
400+
ignore_invalid_headers on;
401+
```
402+
*HTTP头部是否允许下划线*
403+
```bash
404+
underscores_in_headers on|off;
405+
```
406+
默认为off,表示HTTP头部的名称中不允许带 `_`(下划线)。
347407
408+
*对If-Modified-Since头部的处理策略*
409+
```bash
410+
if_modified_since[off|exact|before];
411+
# eg
412+
if_modified_since exact;
413+
```
414+
*文件未找到时是否记录到error日志*
415+
```bash
416+
log_not_found on|off;
417+
```
418+
*merge_slashes*
419+
```bash
420+
merge_slashes on|off;
421+
# eg
422+
merge_slashes on;
423+
```
424+
此配置项表示是否合并相邻的“”,例如,/test///a.txt,在配置为on时,会将其匹配为location/test/a.txt;如果配置为off,则不会匹配,URI将仍然是//test///a.txt。
348425
426+
*设置DNS名字解析服务器地址*
427+
设置的地址用来对域名进行解析
428+
```bash
429+
resolver address...;
430+
```
431+
*DNS解析的超时时间*
432+
```bash
433+
resolver_timeout time;
434+
# eg
435+
resolver_timeout 30s;
436+
```
437+
*返回错误页面时是否在Server中注明Nginx版本*
438+
```bash
439+
server_tokens on|off;
440+
```
441+
442+
### ngx_http_core_module模块提供的变量
443+
444+
`ngx_http_core_module` 是 Nginx 中非常重要的一个模块,它提供了许多用于配置和控制 HTTP 请求处理过程的指令。此外,该模块还提供了一系列预定义变量,这些变量可以在 Nginx 配置文件中使用,以获取请求的各种信息或控制请求处理的行为。以下是一些常用的由 `ngx_http_core_module` 提供的变量:
349445
446+
1. **$args**:这个变量包含请求行中的参数,即URL查询字符串。
447+
2. **$binary_remote_addr**:客户端地址的二进制表示,长度总是4个字节(对于IPv4地址)或16个字节(对于IPv6地址)。
448+
3. **$body_bytes_sent**:发送给客户端的字节数,不包括响应头的大小。
449+
4. **$content_length**:HTTP请求头中的"Content-Length"字段。
450+
5. **$content_type**:HTTP请求头中的"Content-Type"字段。
451+
6. **$document_root**:当前请求的root目录。
452+
7. **$document_uri / $uri**:与请求相关的当前URI(不带请求参数),可被内部重写。
453+
8. **$host**:请求中的Host(主机名),如果请求中没有Host,则为按照server_name指令进行匹配后得到的值。
454+
9. **$http_HEADER**:匹配任意请求头,将HEADER替换为要获取的头部字段名称,注意字段名称应全部大写,并用下划线替代连字符。
455+
10. **$https**:如果连接使用SSL/TLS则值为"on",否则为空字符串。
456+
11. `$is_args`:如果$args设置则返回"?",否则返回空字符串。
457+
12. **$limit_rate**:设置对客户端输出数据的速率限制,单位是字节/秒。
458+
13. **$msec**:当前时间戳,单位是秒,精度达到毫秒级。
459+
14. **$nginx_version**:Nginx版本号。
460+
15. **$pid**:worker进程的PID。
461+
16. `$query_string`:等同于$args
462+
17. **$realpath_root**:基于root或者alias指令计算出来的当前请求的真实文件系统路径。
463+
18. **$remote_addr**:客户端地址。
464+
19. **$remote_port**:客户端端口号。
465+
20. **$remote_user**:使用basic认证时的用户名。
466+
21. **$request**:完整的原始请求行。
467+
22. **$request_body**:客户端请求主体信息。
468+
23. **$request_body_file**:临时存储客户端请求主体的文件名。
469+
24. **$request_completion**:如果请求成功完成则为"OK",如果客户端在完整消息接收前断开连接则为空。
470+
25. **$request_filename**:当前请求的文件路径,由root或alias转换而来。
471+
26. **$request_method**:请求方法(如GET、POST等)。
472+
27. **$request_uri**:完整的原始请求URI(含查询字符串)。
473+
28. **$scheme**:所用协议,http 或 https。
474+
29. **$sent_http_HEADER**:对应响应头中HEADER的值,可以用来查看或记录响应头的内容。
475+
30. **$server_addr**:接受请求的服务器IP地址。
476+
31. **$server_name**:请求中Host首部对应的虚拟主机的名字。
477+
32. **$server_port**:接受请求的服务器端口。
478+
33. **$server_protocol**:请求使用的协议,通常为HTTP/1.0、HTTP/1.1或HTTP/2.0。
479+
34. **$status**:HTTP响应状态码。
480+
35. **$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space**:TCP连接的相关信息。
350481
482+
### 负载均衡的基本配置
483+
作为代理服务器,一般都需要向上游服务器的集群转发请求。这里的负载均衡是指选择一种策略,尽量把请求平均地分布到每一台上游服务器上。下面介绍负载均衡的配置项
484+
485+
#### *upstream块*
486+
```bash
487+
upstream name{...}
488+
```
351489
490+
upstream块定义了一个上游服务器的集群,便于反向代理中的proxy_pass使用
491+
```bash
492+
upstream backend {
493+
server backend1.example.com;
494+
server backend2.example.com;
495+
server backend3.example.com;
496+
}
497+
server {
498+
location / {
499+
proxy_pass http://backend;
500+
}
501+
}
502+
```
503+
504+
`server name[parameters];` server配置项指定了一台上游服务器的名字,这个名字可以是域名、IP地址端口、UNIX句柄等,在其后还可以跟下列参数
505+
- weight=number:设置向这台上游服务器转发的权重,默认为1。
506+
- max_fails=number:该选项与fail_timeout配合使用,指在fail_timeout时间段内,如果向当前的上游服务器转发失败次数超过number,则认为在当前的fail_timeout时间段内这台上游服务器不可用。max_fails默认为1,如果设置为0,则表示不检查失败次数。
507+
- fail_timeout=time:fail_timeout表示该时间段内转发失败多少次后就认为上游服务器暂时不可用,用于优化反向代理功能。
508+
- down:表示所在的上游服务器永久下线,只在使用ip_hash配置项时才有用。
509+
- backup:在使用ip_hash配置项时它是无效的。它表示所在的上游服务器只是备份服务器,只有在所有的非备份上游服务器都失效后,才会向所在的上游服务器转发请求。
510+
511+
```bash
512+
upstream backend {
513+
server backend1.example.com weight=5;
514+
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
515+
server unix:/tmp/backend3;;
516+
}
517+
```
518+
519+
*ip_hash*
520+
```bash
521+
upstream backend {
522+
ip_hash;
523+
server backend1.example.com;
524+
server backend2.example.com;
525+
server backend3.example.com down;
526+
server backend4.example.com;
527+
}
528+
```
529+
在有些场景下,我们可能会希望来自某一个用户的请求始终落到固定的一台上游服务器中。假设上游服务器会缓存一些信息,如果同一个用户的请求任意地转发到集群中的
530+
任一台上游服务器中,那么每一台上游服务器都有可能会缓存同一份信息,这既会造成资源的浪费,也会难以有效地管理缓存信息。ip_hash就是用以解决上述问题的,它首先根据客户端的IP地址计算出一个key,将key按照upstream集群里的上游服务器数量进行取模,然后以取模后的结果把请求转发到相应的上游服务器中。这样就确保了同一个客户端的请求只会转发到指定的上游服务器中。
531+
ip_hash与weight(权重)配置不可同时使用。如果upstream集群中有一台上游服务器暂时不可用,不能直接删除该配置,而是要down参数标识,确保转发策略的一贯性。
532+
533+
*记录日志时支持的变量*
534+
535+
| 变量名 | 意义 |
536+
|---|---|
537+
| $upstream_addr | 处理请求的上游服务器地址 |
538+
| $upstream_cache_status | 表示是否命中缓存,取值范围:MISS、EXPIRED、PDATING、STALE、HIT |
539+
| $upstream_status | 上游服务器返回的响应中的 HTTP 响应码 |
540+
| $upstream_response_time | 上游服务器的响应时间,精度到毫秒 |
541+
| `$upstream_http_$HEADER` | HTTP 的头部,如 upstream_http_host |
542+
### 反向代理的基本配置
543+
*proxy_pass*
544+
```bash
545+
proxy_pass URL;
546+
```
547+
此配置项将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或IP地址加端口的形式
548+
```bash
549+
proxy_pass http://localhost:8000/uri/
550+
```
551+
还可以如上节负载均衡中所示,直接使用upstream块
552+
用户可以把HTTP转换成更安全的HTTPS
553+
```bash
554+
proxy_pass https://192.168.0.1
555+
```
556+
默认情况下反向代理是不会转发请求中的Host头部的。如果需要转发,那么必须加上配置
557+
```bash
558+
proxy_set_header Host $host;
559+
```
560+
*proxy_method*
561+
```bash
562+
proxy_method method;
563+
# eg, 客户端发来的GET请求在转发时方法名也会改为POST
564+
proxy_method POST;
565+
```
566+
此配置项表示转发时的协议方法名。
567+
*proxy_hide_header*
568+
```bash
569+
proxy_hide_header the_header;
570+
```
571+
Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、`X-Pad和X-Accel-*`。使用proxy_hide_header后可以任意地指定哪些HTTP头部
572+
字段不能被转发。
573+
```bash
574+
proxy_hide_header Cache-Control;
575+
proxy_hide_header MicrosoftOfficeWebServer;
576+
```
577+
*proxy_pass_header*
578+
```bash
579+
proxy_pass_header the_header;
580+
```
581+
与proxy_hide_header功能相反,proxy_pass_header会将原来禁止转发的header设置为允许转发。
582+
*proxy_pass_request_body*
583+
```bash
584+
proxy_pass_request_body on|off;
585+
```
586+
作用为确定是否向上游服务器发送HTTP包体部分。
587+
*proxy_pass_request_headers*
588+
```bash
589+
proxy_pass_request_headers on|off;
590+
```
591+
作用为确定是否转发HTTP头部。
592+
*proxy_redirect*
593+
```bash
594+
proxy_redirect[default|off|redirect replacement];
595+
# eg
596+
proxy_redirect default;
597+
```
598+
当上游服务器返回的响应是重定向或刷新请求(如HTTP响应码是301或者302)时,proxy_redirect可以重设HTTP头部的location或refresh字段。例如,如果上游服务器发出的响
599+
应是302重定向请求,location字段的URI是http://localhost:8000/two/some/uri/ ,那么在下面的配置情况下,实际转发给客户端的location是http://frontendonesome/uri/ 。
600+
```bash
601+
proxy_redirect http://localhost:8000/two/ http://frontendone;
602+
```
603+
这里还可以使用ngx-http-core-module提供的变量来设置新的location字段。例如:
604+
```bash
605+
proxy_redirect http://localhost:8000/ http://$host:$server_port/;
606+
```
607+
也可以省略replacement参数中的主机名部分,这时会用虚拟主机名称来填充。
608+
```bash
609+
proxy_redirect http://localhost:8000/two/one;
610+
```
611+
*proxy_next_upstream*
612+
```bash
613+
proxy_next_upstream[error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
614+
# eg
615+
proxy_next_upstream error timeout;
616+
```
617+
此配置项表示当向一台上游服务器转发请求出现错误时,继续换一台上游服务器处理这个请求。前面已经说过,上游服务器一旦开始发送应答,Nginx反向代理服务器会立刻把应
618+
答包转发给客户端。因此,一旦Nginx开始向客户端发送响应包,之后的过程中若出现错误也是不允许换下一台上游服务器继续处理的。这很好理解,这样才可以更好地保证客户端只
619+
收到来自一个上游服务器的应答。proxy_next_upstream的参数用来说明在哪些情况下会继续选择下一台上游服务器转发请求。
620+
- error:当向上游服务器发起连接、发送请求、读取响应时出错。
621+
- timeout:发送请求或读取响应时发生超时。
622+
- invalid_header:上游服务器发送的响应是不合法的。
623+
- http_500:上游服务器返回的HTTP响应码是500。
624+
- http_502:上游服务器返回的HTTP响应码是502。
625+
- http_503:上游服务器返回的HTTP响应码是503。
626+
- http_504:上游服务器返回的HTTP响应码是504。
627+
- http_404:上游服务器返回的HTTP响应码是404。
628+
- off:关闭proxy_next_upstream功能—出错就选择另一台上游服务器再次转发

0 commit comments

Comments
 (0)