nginx反向代理与负载均衡详解

反向代理

tcp/udp对应 steam 模块

应用层 可以反向代理很多服务,可以是php,python ,go http ,grpc等等

proxy_pass url;

带/ 与不带/的区别

1location /bbs/{
2		proxy_pass http://127.0.0.1:8080;
3}
4
5用户请求 /bbs/abc/test.html
6请求到达nginx 的url  /bbs/abc/test.html
7请求达到上游应用服务器的url   /bbs/abc/test.html
1location /bbs/{
2		proxy_pass http://127.0.0.1:8080/;
3}
4
5用户请求 /bbs/abc/test.html
6请求到达nginx 的url  /bbs/abc/test.html
7请求达到上游应用服务器的url: /abc/test.html

nginx接受用户请求包体的处理方式

proxy_request_buffering on |off;

on. 吞吐量高 ,上游服务器处理并发能力低。

更及时的响应、减少磁盘io

client_max_body_size size

上下文 http 、server、location

client_body_buffer_size size;

上下文 http、server、location

当请求体 content-length > client_max_body_size 413 request too large

请求体大小(content-length) < client_body_buffer_size,请求存储到内存中 ,请求成功

当 请求体大小(content-length) < client_max_body_size , > client_body_buffer_size,请求体会存到磁盘 client_body_temp_path 。

client_body_temp_path path [level1] [level2]

client_body_in_file_only on|off ; 开启则都放到磁盘上

client_body_timeout time;

client_body_timeout 60s;

具体见 nginx常用模块 这篇文章

steam反代

注意内容:

nginx.conf

1load_module /usr/lib/nginx/modules/ngx_stream_module.so;
2include /etc/nginx/sites-enabled/*.tcp;

下面是gitlab ssh拉取代码的反代配置

 1stream{
 2    tcp_nodelay on;
 3    log_format proxy '$remote_addr:$remote_port [$time_local] '
 4                 '$protocol $status $bytes_sent $bytes_received '
 5                 '$session_time "$upstream_addr" '
 6                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
 7    upstream sshgitlab {
 8                server 127.0.0.1:9022;   #这里IP是虚拟机的,对应虚拟机的IP+Port
 9     }
10    server {
11                listen 8022 so_keepalive=on;
12                proxy_connect_timeout 1h;
13                proxy_timeout 1h;
14                proxy_pass sshgitlab;
15                access_log /var/log/nginx/xxx.log proxy;
16   }
17}

负载均衡

当我们的应用单例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台、几十台、几百台,我们需要一个入口,将客户端请求均衡分布在后台的多个服务器上。

负载均衡在服务端开发中算是一个比较重要的特性,nginx提供的负载均衡可以实现上游服务器的负载均衡、故障转移、失败重试、容错、健康检查,当某些上游服务器出现问题时,可以将请求转到其它的上游服务器从而保障高可用。

第一步我们需要给nginx配置上游服务器,即负载均衡到真实的处理业务的服务器

通过在http指令下配置upstream即可。

语法: upstream name { … }

默认值: —

上下文: http

指令集

- -
upstream 段名,以 {开始,} 结束 ,中间是定义上游服务器的url
server 定义上游服务器地址
zone 定义共享内存、用于跨worker子进程
keepalive 对上游服务 启用长连接
keepalive_requests 一个长连接最大请求个数
keepalive_timeout 空闲情况下,一个长连接的超时时长
Hash hash 负载均衡
Ip_hash 根据ip hash 负载均衡
Least_conn 最小连接数负载均衡
Least_time 最短时间负载均衡
Random 随机负载均衡

upstream 指令当中包含server指令

语法: server address [parameters];

默认值: —

上下文: upstream

可以定义下面的参数:

weight=number 设定服务器的权重,默认是1,权重越大被访问机会越大,要根据机器的配置情况来配置

max_fails=number 设定Nginx与服务器通信的尝试失败的次数。在fail_timeout参数定义的时间段内,如果失败的次数达到此值,Nginx就认为服务器不可用。在下一个fail_timeout时间段,服务器不会再被尝试。 失败的尝试次数默认是1。

可以通过指令proxy_next_upstream 和memcached_next_upstream来配置什么是失败的尝试。 默认配置时,http_404状态不被认为是失败的尝试。

fail_timeout=time

统计失败尝试次数的时间段。在这段时间中,服务器失败次数达到指定的尝试次数,服务器就被认为不可用。默认情况下,该超时时间是10秒。

backup

标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器,配置这个指令可以实现故障转移。

down

标记服务器永久不可用,可以跟ip_hash指令一起使用。

当访问Nginx时,会将请求反向代理到backend配置的upstream server。

max_conns=number 上游服务器最大并发链接数

配置示例

1upstream back_end {
2	server 127.0.0.1:8080 weight=3 max_conns=1000 fail_timeout=10s max_fails=2;
3  keepalive 32;
4  keepalive_request 50;
5  keepalive_timeout 30s;
6}

以前公司的例子

 1upstream backend {
 2    server 10.64.1.106:80 weight=8;  # fn1042
 3    server 10.64.1.107:80 weight=8;  # fn1043
 4    server 10.64.1.110:80 weight=10; # fn1046
 5    server 10.64.1.111:80 weight=10; # fn1047
 6    server 10.64.1.146:80 weight=10; # fn1051
 7}
 8
 9server {
10    listen 443;
11    server_name xxx.com;
12    root /dev/null;
13
14    ssl on;
15    ssl_certificate /xxx.cert.pem;
16    ssl_certificate_key /xxxx.key.pem;
17
18    location / {
19        proxy_set_header X-Real-IP $remote_addr;
20        proxy_set_header Host $host;
21        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
22        proxy_set_header X-Request-Uuid $request_uuid;
23        proxy_pass http://huan_api;
24    }
25
26    location /v1/wechat/upload {
27        proxy_set_header X-Real-IP $remote_addr;
28        proxy_set_header Host $host;
29        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
30        proxy_set_header X-Request-Uuid $request_uuid;
31        proxy_pass http://huan_upload;
32    }
33
34    location /m {
35        proxy_set_header Host $host;
36        proxy_pass http://huan_h5;
37    }
38 }

负载均衡的方法

nginx支持以下负载均衡机制:

1、 轮询

默认轮训方式

每一个来自网络中的请求,轮流分配给内部的服务器,从1到N然后重新开始。此种负载均衡算法适合服务器组内部的服务器都具有相同的配置并且平均服务请求相对均衡的情况。

2、加权轮询

通过weight参数控制权重

根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。例如:服务器A的权值被设计成1,B的权值是3,C的权值是6,则服务器A、B、C将分别接受到10%、30%、60%的服务请求。此种均衡算法能确保高性能的服务器得到更多的使用率,避免低性能的服务器负载过重。

3、IP Hash

在upstream当中配置ip_hash;

这种方式通过生成请求源IP的哈希值,并通过这个哈希值来找到正确的真实服务器。这意味着对于同一主机来说他对应的服务器总是相同。使用这种方式,你不需要保存任何源IP。

将客户端会话"沾住"或者"持久化",以便总是能选择特定服务器,那么可以使用ip-hash负载均衡机制。

使用ip-hash时,客户端IP地址作为hash key使用,用来决策选择服务器集群中的哪个服务器来处理这个客户端的请求。这个方法保证从同一个客户端发起的请求总是定向到同一台服务器,除非服务器不可用。

1upstream backend {
2		ip-hash;
3    server 10.64.1.106:80;
4    server 10.64.1.107:80; 
5    server 10.64.1.110:80; 
6    server 10.64.1.111:80; 
7    server 10.64.1.146:80; 
8}

4、最少连接数

在upstream当中配置least_conn实现最少连接数

客户端的每一次请求服务在服务器停留的时间可能会有较大的差异,随着工作时间加长,如果采用简单的轮循或随机均衡算法,每一台服务器上的连接进程可能会产生极大的不同,并没有达到真正的负载均衡。最少连接数均衡算法对内部中需负载的每一台服务器都有一个数据记录,记录当前该服务器正在处理的连接数量,当有新的服务连接请求时,将把当前请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡。

1upstream backend {
2    zone test 10M; //内存  连接数 内存
3		least_conn;
4    server 10.64.1.106:80;
5    server 10.64.1.107:80; 
6    server 10.64.1.110:80; 
7    server 10.64.1.111:80; 
8    server 10.64.1.146:80; 
9}

5、Hash

1upstream backend {
2		hash $key;           # $key 是可以 通过request_uri 匹配出来的 如商品id 值, set $key $1 这样获得
3    server 10.64.1.106:80;
4    server 10.64.1.107:80; 
5    server 10.64.1.110:80; 
6    server 10.64.1.111:80; 
7    server 10.64.1.146:80; 
8}

失败重试

通过配置上游服务器max_fails和 fail_timeout,指定每个上游服务器,当fail_timeout时间内失败了max_fails次请求,则认为该上游服务器不可用/不存活,然后这段时间将不会访问这台上游服务器,fail_timeout时间后会再次进行重试。

max_fails=2 fail_timeout=30s 这2个一起搭配使用,表示:当失败2次的时候,就停止使用30秒

好处:

既可以避免重复请求,不能访问或者暂时不能访问的服务,增大服务器的压力,也可以灵活的做到当服务器可用时再次访问。

proxy_next_upstream 指令

在nginx的配置文件中,proxy_next_upstream 项定义了什么情况下进行重试

语法: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 http_503 | http_504 |http_404 | off …;

默认值: proxy_next_upstream error timeout;

上下文: http, server, location

其中: error 表示和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误。 timeout 表示和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时。 invalid_header 表示后端服务器返回空响应或者非法响应头 http_500 表示后端服务器返回的响应状态码为500

…………. off 表示停止将请求发送给下一台后端服务器

重试不能无限制进行,因此,需要如下两个指令控制重试次数和重试超时时间

proxy_next_upstream_tries number:设置重试次数,默认0表示不限制,注意此重试次数指的是所有请求次数(包括第一次和之后的重试次数之和)。

proxy_next_upstream_timeout time:设置重试最大超时时间,默认0表示不限制。

即在proxy_next_upstream_timeout时间内允许proxy_next_upstream_tries次重试。如果超过了其中一个设置,则Nginx也会结束重试并返回客户端响应(可能是错误码)。

proxy_send_timeout 后端服务器数据回传时间(代理发送超时时间)

proxy_read_timeout 连接成功后,后端服务器响应时间(代理接收超时时间)

proxy_connect_timeout nginx连接后端的超时时间,一般不超过75s

 1    
 2     upstream backend {
 3          #ip_hash;   #哈希
 4          #least_conn; #最少连接数
 5          server  nginx.xxx.com:9502 max_fails=3 fail_timeout=5s;
 6          #server  nginx.xxx.com:9503 backup max_fails=3 fail_timeout=5s;#back 备份服务器
 7          #server  nginx.xxx.com:9503 down max_fails=3 fail_timeout=5s;  #down 永久宕机
 8          server  nginx.xxx.com:9502 max_fails=3 fail_timeout=5s;
 9          server  nginx.xxx.com:9502 max_fails=3 fail_timeout=5s;
10   }
11    location /up {
12              proxy_next_upstream timeout; #超时切换到下一台服务器,注意备用服务器切换问题
13              #超时时间
14              proxy_connect_timeout 20; # nginx连接后端的超时时间,一般不超过75s
15              proxy_send_timeout 30;    # 后端服务器数据回传时间(代理发送超时时间)
16              proxy_read_timeout 30;    #  连接成功后,后端服务器响应时间(代理接收超时时间)
17              proxy_next_upstream_tries 2; #代理请求的重试次数
18              proxy_next_upstream_timeout 2; #重试的超时时间
19              proxy_pass   http://backend;
20}

backup(故障转移)

标记为备用服务器。当主服务器不可用以后,请求会被传给这些服务器

 1  upstream backend {
 2            #ip_hash;   #哈希
 3            #least_conn; #最少连接数
 4            server  nginx.23673.com:9502 max_fails=3 fail_timeout=5s; #此服务现在不可用
 5            server  nginx.23673.com:9503 backup; #备胎服务器, 9502不可用才使用9503
 6     }
 7     
 8  location /up {
 9        #proxy_next_upstream timeout; #超时切换到下一台服务器,注意备用服务器切换问题,使用备胎服务器这个必须关闭
10        #超时时间
11        proxy_connect_timeout 20;
12        proxy_send_timeout 30;
13        proxy_read_timeout 30;
14        proxy_next_upstream_tries 1; #代理请求的重试次数
15        proxy_next_upstream_timeout 1; #重试的超时时间
16        proxy_pass   http://backend;
17  }

down

标记服务器永久不可用,可以跟ip_hash指令一起使用。

1 upstream backend {
2            #ip_hash;   #哈希
3            #least_conn; #最少连接数
4            server  nginx.23673.com:9502 max_fails=3 fail_timeout=5s;
5            server  nginx.23673.com:9503 down max_fails=3 fail_timeout=5s; //这台肯定不能使用了
6        
7     }

动态负载均衡

微博开源的,大厂适用。

nginx-upsync-module 提供了动态的负载均衡,动态更新上游的服务器不需要 reload nginx ,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。 consul 作为 Nginx 的 db,利用 consul 的 KV 服务,每个 Nginx work 进程独立的去拉取各个

upstream 的配置,并更新各自的路由。 挂了第三方模块无法结束进程或者是当前进程尚未结束。

nginx -s reload 是平滑重启,不会强制结束正在工作的连接,需要等所有连接都结束才会重启。想象一个场景上线繁忙,想要多添加几台服务器处理更多的 流量

改配置文件并重新启动 Nginx 可能并不总是很方便。 例如,当遇到大流量和高负载,重启 Nginx 并在此时重新加载配置会进一步增加系统负载,并可能暂时 降低性能

 1nx,它的功能是拉取 consul 的后端 server 的列表,并更新 Nginx 的路由信息。此模块不依赖于任何第三方模块。 consul 作为 Nginx 的 db,利用 consul 的 KV 服务,每个 Nginx work 进程独立的去拉取各个 upstream 的配置,并更新各自的路由。
 2
 3wget  https://github.com/weibocom/nginx-upsync-module/archive/v2.1.0.tar.gz
 4
 5--add-module=/root/nginx-upsync-module-2.1.0
 6
 7      示例:
 8upstream swoole_test {
 9		   # 使用动态负载均衡 ,异步更新 持久化到 upsync_dump_path对应到配置文件中
10        upsync  127.0.0.1:8700/v1/kv/upstreams/swoole_test upsync_timeout=6m upsync_interval=500ms  upsync_type=consul  strong_dependency=off;
11        upsync_dump_path /usr/local/nginx/conf/servers_test.conf;
12        include /usr/local/nginx/conf/servers_test.conf;
13}
14
15
16upsync模块会去consul拉取最新的upstream信息并存到本地的文件中
17upsync_timeout 配置从consul拉取上游服务器的超时时间
18upsync_interval 配置从consul拉取上游服务器的间隔时间
19upsync_type 指定使用配置服务器的类型,当前是consul
20strong_dependency 启动时是否强制依赖配置服务器,如果配置为on,则拉取失败,nginx同样会启用失败
21
22upsync_dump_path 指定从consul拉取的上游服务器后持久化到的位置,这样即使Consul服务器出问题了,本地同样会有备份

添加的时候要注意名称模块的匹配:

安装consul

 1 #对于consul的介绍可以移步到另外的文档,暂时先了解就行,我们可以先通过docker的方式pull一个consul
 2 
 3    curl -X PUT -d '{"weight":1, "max_fails":2, "fail_timeout":10}' http://$consul_ip:$port/v1/kv/$dir1/$upstream_name/$backend_ip:$backend_port
 4
 5   curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0.1:8700/v1/kv/upstreams/swoole_test/127.0.0.1:9501
 6   
 7
 8      curl -X PUT -d '{"weight":1,"max_fails":2,"fail_timeout":10}' http://127.0.0.1:8700/v1/kv/upstreams/swoole_test/127.0.0.1:9502
 9   
10#查看所有已经存储的k/v
11	 curl  http://127.0.0.1:8700/v1/kv/?recurse
12#删除
13   curl  -X  DELETE  http://127.0.0.1:8700/v1/kv/upstreams/swoole_test/127.0.0.1:9501

测试nginx.conf 内容如下

  1
  2user  root;
  3worker_processes  1;
  4#跟cpu核数一致
  5
  6#error_log  logs/error.log;
  7#error_log  logs/error.log  notice;
  8#error_log  logs/error.log  info;
  9
 10#pid        logs/nginx.pid;
 11events {
 12    worker_connections  1024;
 13}
 14
 15
 16http {
 17
 18    #limit_req_zone 113.246.155.223 zone=one:1m rate=1r/s;
 19
 20    include       mime.types;
 21    default_type  application/octet-stream;
 22    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 23                      '$status $body_bytes_sent "$http_referer" '
 24                      '"$http_user_agent" "$http_x_forwarded_for"';
 25
 26    #access_log  /usr/local/nginx/logs/access.log  main;
 27
 28    sendfile        on;
 29    #tcp_nopush     on;
 30
 31    #keepalive_timeout  0;
 32    keepalive_timeout  65;
 33
 34    #gzip  on;
 35
 36    #include  /usr/local/nginx/conf/default/*.conf;
 37
 38
 39    #判断客户端地址是否在白名单列表,如果在返回0在白名单列表,否则返回1
 40    geo  $white  {
 41        default        1;
 42        #include '/conf/ip.conf';
 43        127.0.0.1/32   0;
 44        192.168.1.0/24 0;
 45
 46    }
 47
 48    #如果满足条件返回二进制ip地址
 49    map $white  $limit {
 50       1  $binary_remote_addr;
 51       0  "";
 52    }
 53
 54    map $request_uri  $no_cache {
 55       default  0;
 56       ~*/admin 1; #uri当中包含了admin
 57    }
 58
 59
 60     limit_req_zone $limit  zone=two:10m  rate=1r/s;
 61     limit_req_status 503;
 62     limit_req_log_level info;
 63
 64     #设置缓存目录
 65    proxy_cache_path  /usr/local/nginx/cache  levels=1:2  keys_zone=my_cache:10m  max_size=1g inactive=10s use_temp_path=off;
 66
 67     upstream backend {
 68            #ip_hash;   #哈希
 69            #least_conn; #最少连接数
 70            server  nginx.23673.com:9502 max_fails=3 fail_timeout=5s;
 71            #server  nginx.23673.com:9503 backup max_fails=3 fail_timeout=5s;
 72            #server  nginx.23673.com:9503 down max_fails=3 fail_timeout=5s;
 73            server  nginx.23673.com:9502 max_fails=3 fail_timeout=5s;
 74            server  nginx.23673.com:9502 max_fails=3 fail_timeout=5s;
 75     }
 76
 77     upstream swoole_test {
 78    				 # 得有一台固定的
 79             server  nginx.23673.com:9500 max_fails=3 fail_timeout=5s;
 80             upsync 127.0.0.1:8700/v1/kv/upstreams/swoole_test upsync_timeout=20s upsync_interval=500ms  upsync_type=consul strong_dependency=off;
 81             upsync_dump_path /usr/local/nginx/conf/servers_test.conf; # 生成配置文件
 82             include /usr/local/nginx/conf/servers_test.conf; # 引入生成的配置文件 ,得先建立个空文件不然报错。
 83     }
 84
 85     server {
 86            listen       80;
 87            server_name  nginx.23673.com;
 88            access_log  /usr/local/nginx/logs/$host  main;
 89            set   $cachePATH   "/cache/";
 90
 91            gzip on;
 92            gzip_comp_level 6;
 93            gzip_types  application/javascript text/css;
 94
 95        #查看上游服务器列表
 96        location = /upstream_show {
 97                  upstream_show;
 98              }
 99
100          location /test_stream  {
101                 proxy_pass   http://swoole_test;
102          }
103
104
105
106            location /up {
107                #proxy_next_upstream timeout; #超时切换到下一台服务器,注意备用服务器切换问题
108                #超时时间
109                proxy_connect_timeout 20;
110                proxy_send_timeout 30;
111                proxy_read_timeout 30;
112
113                proxy_next_upstream_tries 1; #代理请求的重试次数
114                proxy_next_upstream_timeout 1; #重试的超时时间
115
116                proxy_pass   http://backend;
117            }
118
119
120            #缓存清除
121            location ~ /purge(/.*) {
122                  allow 127.0.0.1;
123                  deny  all;
124                  proxy_cache_purge my_cache  $host$1$is_args$args;
125                  #default_type text/html;
126                  #return 200 $host$1$is_args$args;
127                  #error_page  404              /404.html;
128            }
129
130            location ^~ /cache {
131                        proxy_http_version  1.1;
132                        proxy_pass       http://127.0.0.1:9502;
133                        #设置当前请求是否缓存
134                        #proxy_cache_bypass  $no_cache;
135
136                        #default_type text/html;
137                        #return 200 $host$uri$is_args$args;
138                        #请求头设置
139                        proxy_set_header X-Real-IP $remote_addr;
140                        proxy_set_header connection keep-alive;
141                        proxy_set_header REMOTE-HOST $remote_addr;
142                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
143
144                        #时间设置
145                        proxy_connect_timeout 30;
146                        proxy_send_timeout 30;
147                        proxy_read_timeout 60;
148
149                        proxy_cache my_cache;  #开启缓存了
150                        proxy_cache_valid 200 302 10s;  #不同的响应头设置不同缓存时间
151                        proxy_cache_valid 404   1s;
152
153                        #设置缓存key
154                        proxy_cache_key $host$uri$is_args$args;
155                        #proxy_ignore_headers Cache-Control;
156
157                        proxy_cache_min_uses 3; #至少3次之后才会缓存
158                        proxy_cache_lock on; #如果说是并发情况下,只会有一个请求落到后端服务器
159
160            }
161
162
163            location / {
164                 #limit_req zone=one burst=3 nodelay;
165                root   /www;
166
167                #limit_req zone=two;
168                 #default_type text/html;
169                 #return 200  "$limit";
170                index  nginx.23673.html index.htm;
171
172            }
173
174            #~* \.(gif|jpeg|jpg|mp3)$
175
176            #location ^~ /img/ {
177            #     alias /www/img/;
178                 #alias /www/img/1.jpg 正则匹配出完整路径
179            #     expires 10s;
180            #     access_log off;
181
182            #}
183
184            #正则匹配的形式
185            location ~*  (.*)(\.gif|jpeg|jpg|mp3)$ {
186                     alias /www/img/$1$2;
187                     #alias /www/img/1.jpg 正则匹配出完整路径
188                     expires 10s;
189                     access_log off;
190            }
191
192          #	server_name_in_redirect off;
193
194            location /if {
195
196                 #if ( $http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry) ) {
197                 #     rewrite  ^(.*)    http://peter.23673.com$1 permanent;
198                 #}
199
200                 #匹配文件不存在
201                 #if (!-e $request_filename) {
202                          #proxy_pass http://127.0.0.1:9501;
203                 #}
204            }
205
206            #隐藏index.php  xxxx/api/public/index.php -> xxxx/api/aa/bb
207            location /api {
208                 #匹配文件不存在
209                 #if (!-e $request_filename) {
210
211                 #}
212                 #rewrite  ^/api/(.*)$    /api/public/index.html/$1  break;
213                 #框架根据请求地址,路由
214                 #rewrite  ^/api/(.*)$    /abc/public/index.html/$1  last;  隐藏了真实的路径
215
216            }
217
218
219            location /abc/ {
220                   root /www;
221            }
222
223            location /ecshop {
224                    root /www;
225                    #商品页面
226                   # /ecshop/goods-3.html ---->/ecshop/goods.php?id=3
227                   rewrite  goods-(\d+)\.html$    /ecshop/goods.php?id=$1 break;
228
229                   # 栏目页面
230                   #/ecshop/category-2-b1.html -> /ecshop/category.php?id=3&brand=1
231
232
233            }
234
235
236            #location ~.*\.(sql|log|txt|jar|war|sh|py|php) {
237            #     deny all;
238            #}
239
240            location /test {
241                root   /www;
242                allow 47.98.147.49;
243                deny  192.168.1.0/24;
244                deny  113.246.155.223;
245                deny all;
246                #index  nginx.23673.html index.htm;
247            }
248            #location  ^~ /test {
249            #    default_type text/html;
250            #    return 200 'test';
251            #}
252
253
254
255
256
257
258            #error_page  404              /404.html;
259
260            # redirect server error pages to the static page /50x.html
261            #
262            error_page   500 502 503 504  /50x.html;
263            location = /50x.html {
264                root   html;
265            }
266        }
267
268
269    # another virtual host using mix of IP-, name-, and port-based configuration
270    #
271    #server {
272    #    listen       8000;
273    #    listen       somename:8080;
274    #    server_name  somename  alias  another.alias;
275
276    #    location / {
277    #        root   html;
278    #        index  index.html index.htm;
279    #    }
280    #}
281
282
283    # HTTPS server
284    #
285    #server {
286    #    listen       443 ssl;
287    #    server_name  localhost;
288
289    #    ssl_certificate      cert.pem;
290    #    ssl_certificate_key  cert.key;
291
292    #    ssl_session_cache    shared:SSL:1m;
293    #    ssl_session_timeout  5m;
294
295    #    ssl_ciphers  HIGH:!aNULL:!MD5;
296    #    ssl_prefer_server_ciphers  on;
297
298    #    location / {
299    #        root   html;
300    #        index  index.html index.htm;
301    #    }
302    #}
303
304}