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;
}
}