uncategorized

Nginx Ninja -- Nginx frequently used recipes

常用配置

client_max_body_size 20m 设置请求体大小,避免在文件上传等场景中,出现413 Request Entity Too Large

Nginx转发端口

常规转发

1
2
3
4
5
6
7
8
server {
listen 8000;
location / {
# 所有请求转发到本机8001
proxy_pass http://127.0.0.1:8001;
}
}

根据来源ip转发

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 8000;
location / {
根据 $remote_addr 远程ip来判断是否需要转发
if ($remote_addr ~ "117.89.79.81"){
proxy_pass http://127.0.0.1:8001;
break;
}
# 匹配到的情况会转发到8001并break出去,break后的语句不执行; 其他情况会转发到 fallback.api.example.com
proxy_pass http://fallback.api.example.com;
}
}

同时匹配多个ip (使用管道)

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 8000;
location / {
根据 $remote_addr 远程ip来判断是否需要转发
if ($remote_addr ~ "(117.89.79.81)|(115.80.79.82)"){
proxy_pass http://127.0.0.1:8001;
break;
}
# 匹配到的情况会转发到8001并break出去,break后的语句不执行; 其他情况会转发到 fallback.api.example.com
proxy_pass http://fallback.api.example.com;
}
}

限制某些ip的访问,使用 allow/deny

譬如在对公网提供接口进行调试的时候,就可以对来源ip进行鉴别和筛选,只能用指定的ip(或ip段)进行访问,其他的都拒绝,从而保证在公网环境下的测试安全问题,可以充当简单的防火墙

allow 后面可以接具体的 ip 地址,也可以接 CIDR来允许一整个网段的访问

1
2
3
4
5
6
7
8
server {
listen 8000;
location / {
allow 192.169.0.0/16; # 允许一个IP段访问
deny all; # 其他都拒绝,拒绝的访问会收到 403 Forbidden
proxy_pass http://fallback.api.example.com;
}
}

或者根据需求,处理网段也可以直接用 正则表达式

关于allow/deny指令序列的处理顺序

The rules are checked in sequence until the first match is found – Nginx Doc

allow 和 deny 的指令序列会按照从上到下常识匹配,匹配到就执行

所以如果把deny all移到最上面,那后面的规则都不会执行,所有请求都会被拒绝, allow all同理

连接限速

限速指令

limit_rate

示例

1
2
3
4
5
6
server {
listen 80;
location / {
limit_rate 200k; # 所有请求都限速200k
}
}

限速是针对请求的,如果客户端同时对该 server 发起两个请求,那客户端的实时传输速度是400k

适用上下文: http, server, location, location 中的 if

如本例就是用在 server 上下文中的,生效范围是进入该 server 的请求

nginx 平滑升级和回退

使用 kill -USER2 [nginx master pid] 来通知nginx主进程,我们需要使用新的环境来启动nginx, 并接管当前所有请求

使用 kill -WINCH [nginx old master pid] 来通知之前老的 worker 进程退出,但保留老的 master 进程,以保障在需要的时候还可以重新拉起老的进程接管当前服务

自动生成 index 页面

在静态资源共享的过程中,用户有时需要像访问自己的文件系统一样,能查看当前目录的结构,文件列表

使用 autoindex: on 可以自动生成这样的一组页面

◉ End.


参考资料:

  1. Nginx DOC – ngx_http_access_module

如博文有叙述不妥以及不准确的地方, 望各位看客不吝赐教, 感谢.

Share