try_files

类似py中的异常处理

配置语法

server {
    listen         80;
        server_name    192.168.2.20 www.lotus.com;
        sendfile       on;
        root           /opt/app/code;
        location / {
            try_files $uri @flask_backup;
        }

        location @flask_backup {
            proxy_pass http://127.0.0.1:5001;
        }

}

flask脚本内容

import sys
from flask import Flask, request
app = Flask(__name__)

@app.route('/', defaults={'path': ''})
@app.route('/<path:path>')
def catch_all(path):
    return 'You want path: %s, But not exsit...' % path

if __name__ == '__main__':
    app.run()

if __name__ == '__main__':
    port = int(sys.argv[1])
    app.run(host='0.0.0.0', port=port, debug=True)

如果请求的文件存在,则返回文件内容,如果请求的文件不存在,则通过@flask_backup访问其他服务

[root@bj-vmware-test1 conf.d]# curl www.lotus.com/index.html
Real Server.
[root@bj-vmware-test1 conf.d]# mv /opt/app/code/index.html{,.bak}
[root@bj-vmware-test1 conf.d]# curl www.lotus.com/index.html
You want path: index.html, But not exsit...

这里异常情况是404,不知道是否支持403、500、502、503等异常,如果支持这些的话,那就厉害了~

使用示例

简化维护页面

之前一个工作经历是在维护期间显示特定页面,当时折腾好一会才弄完的,现在看看,简直太简单了。

    server {
        listen       80;
        server_name  localhost;
        location / {
            # $document_root为主目录/html
            if ( -f $document_root/maintenance.html ) {
                # 返回503状态码
                return 503;
                # error_page 捕获503状态
                # 内部跳转使用maintenance匹配
                error_page 503 @maintenance;
            }
        }
        location @maintenance {
            # 匹配所有请求,统一转到维护页面,break停止匹配处理
            rewrite ^(.*)$ /maintenance.html break;
        }
    }

创建测试文件

# echo "maintenance..." > html/maintenance.html

检查重载配置

./sbin/nginx -s reload

测试访问效果

# curl  127.0.0.1:80
maintenance...
root@VM-128-6-ubuntu:/usr/local/openresty/nginx# mv html/maintenance.html{,_disable}
# curl  127.0.0.1:80
OpenResty.
# mv html/maintenance.html{_disable,}
# curl  127.0.0.1:80
maintenance...

降级访问

server {
    server_name tryfiles.taohui.tech;
    error_log  logs/myerror.log  info;
    root html/;
    default_type text/plain;

    location /first {
            # 1. 检查维护页面 
            # 2. 检查请求页面(first)
            # 3. 检查first/index.html
            # 4. 检查first.html
            # 5. 内部跳转@lasturl
            try_files /system/maintenance.html
                      $uri $uri/index.html $uri.html
                      @lasturl;
    }

    location @lasturl {
            # return 返回特定字符串
            return 200 'lasturl!\n';
    }

    location /second {
            # 1. 检查second文件是否存在
            # 2. 检查second/index.html是否存在
            # 3. 检查second.html是否存在
            # 4. 返回404状态码和404页面
        try_files $uri $uri/index.html $uri.html =404;
    }

}

results matching ""

    No results matching ""