开发者学堂课程【Nginx 企业级 Web 服务实战:Nginx location 基础使用、四层访问控制、账户认证及自定义日志路径】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/649/detail/10757
六、自定义错误界面
1、有一个自定义错误页面,当用户访问到某些不存在的页面或者报错时,希望报错的页面精美一些,至少不只是显示401界面。比如访问一下 index.html,这个页面是不存在的,就会报错。
会有开发或者设计,先设计一个好看的图片或者一个页面,然后把它放到一个服务器上,这个页面通常是一个静态服务器,有 nginx 就足够了,不用太复杂。以后再遇到报错,就会把用户的显示调动到这台服务器上或者直接转发。
2、直接写一个报错界面,对于应用型的系统就会显示业务升级中,公司内部用的比如财务系统或者订单系统,如果业务系统销售要紧急用,会把开发人员的联系方式如电话、微信、QQ 直接留在报错界面上,这样用户可以直接联系开发人员。对于那种给用户用的义务型系统,可能显示这个代码升级中或者维护中,虽然有可能是内部报错了,但也不会直接显示。
3、首先要有一个报错的 uri:500 502 503 504 404 /error.html,或者有自己开发的程序代码,然后有 nginx 捕获到这些状态码, 404和401的都可以,之后再把它转发到相应路径。这个捕获也可以写在 nginx.com 主配置文件里,就相当于对整个server 生效,如果只写了一个server的配置文件,它只针对当前server生效,也就是只针对 www.magedu.net 这个域名生效,对其它不会生效,所以还是放到 nginx.com 里比较好。
4、先捕获404,把 error_log 定义一下,写个 location,一直往下写。
error_page 404 /error.html;
location / {
}
location =/error.html {
root html;
}
如果捕获到404这个状态码,就会调用 error.html 这个文件
如果不写就默认在这 /data/nginx/html/,如果要精确匹配,访问到 error.html {,把root 放在相应位置,这个 root 可以指定。改一下
error_page 404 /error.html;
location / {
root /data/nginx/html/pc;
index index.html index.htm;
}
location =/error.html {
root /data/nginx/html/pc;
}
要创建一个 error.html 到这 /data/nginx/html/pc,在 vim 写一个 /data/nginx/html/pc/error.html,一般会写 error 负责人,这个是给公司内部的人员看的,方便他们直接联系运营或者开发,紧急通知修复这个问题,因为销售要实时寄订单,每卖一笔单子就到这个系统记录,涉及很多钱,不能耽误时间,系统一般从七八点开始用一直到晚上12点左右。因为销售也在不断地和客户联系,有的客户可能回复比较晚,所以系统也会用到比较晚。
4、一旦出问题,可以设置联系人是谁, QQ 和电话是多少,这个一般是开发写的,他们会设计好界面,这个界面是有图形的,他把这个图形打包发给你,之后就放在一个目录里面了,那个界面就会直接调到当前目录下的图片,还会放个状态码比如404或者501,502,502比较重要,把这个状态码放上,判断在哪个状态码才会出现这个页面,然后再根据状态码去解决问题。
假设写个502,之后把 nginx 重启,然后再试一下它就会显示联系方式。所以那些业务员或者销售如果遇到报错,就是所有服务不可用了或者调用出问题了,就会看到联系方式界面,让他们联系电话或者 QQ,抓紧做修复,联系之后一般都是重启,重启之后就好了,这是内部的。如果是给客户访问的外部系统,一般就会设计一个完善的页面,显示业务维护中、业务申请中或者稍后回来。
七、自定义访问日志
1、错误日志一般会单独放,就是基于 access_log 或者 error_logo 把某些域名的日志放到指定文件里。如果不指定路径,就会统一放到 nginx 下面的 access_log
access_log /data/nginx/logs/www-mage-net_access.log
error_logo /data/nginx/logs/www-mage-net_ error_logo
也就是把所有的域名和日志放在一起,但有时会拆开放,而且会拆得比较细,可能每个域名都有对应的访问日志和错误日志,还有更详细的也就是每个location都可以放,比如 tfs 可能是存储系统,要统计当天访问存储系统的日志访问量,或者它的日志都是什么样的,要单独记下来,这个时候把日志放到这 root/data/nginx/static。得看日志能放在什么地方,这是基于 access_log 和 error_logo 这两个关键字来定义的,access_log 能放的地方非常多,比如 http、server、location 还有 if in location,如果想把这个日志精确到 server 级别,就是一个 server 放一个日志,可以在 server 下面单独放。
2、假如想把 www.magedu.ne t这个域名的访问日志单独抽出来放置,首先找到access_log,然后基于这个关键字来指定放在哪里,这后面要指定的路径 path 可以指定 format,就是调用格式的,默认的格式叫 mat,还可以自定义其它格式。这个路径假设放在根下的 apps 下的 nginx,然后 logs,会用这个域名 www.magedu.net来做名称,还有一个是错误日志,如果想把错误日志单独抽出来,就是每个域名放一个错误日志文件,那就再定义一个 error_logo。当然前提是启动 nginx 这个账号对这个目录有权限,才能放的进去
access_log/apps/nginx/logs/www-mage-net_access.log
error_log /apps/nginx/logs/www-mage-net_ error_logo
然后把 nginx reload 一下,单独访问 www.magedu.net 这个域名的请求日志和错误日志都会放到它自己的路径里,不再往默认的 access_log 和 error_log 放。reload 后它就会创建出来,然后再 ll 看一下就有了,其实只要重启就有了
然后再访问一下,这个时候访问日志就会单独写在这
/apps/nginx/logs/www-mage-net_access.log
这个就是刚刚的访问日志
它就不会在默认的日记里记了。
3、所以这种方式对于单独统计某个域名的访问量或者某个域名的日志做分析非常有用,可以很方便地把这个日志从众多域名里剥离出来,单独保存。还有一些可能做的更精确,就是把某个 location 日志都记下来,比如可以把访问 tfs 这个日志记下来,把
access_log/apps/nginx/logs/www-mage-net_access.log
error_log /apps/nginx/logs/www-mage-net_ error_logo
放到tfs下面,假设名称叫 tfs- access.log 和 tfs-error_logo,假如这个是访问存储的location,想把这个访问存储的日志单独记下来,就这样记就可以:
location/tfs {
root /data/nginx/static;
index index.html index.html;
access_log/apps/nginx/logs/www-mage-net_tfs-access.log
error_log /apps/nginx/logs/www-mage-net_ tfs-error_logo
}
再把它 reload,这样它又会生成两个新的文件,一个是记录访问 tfs 的访问值,一个是错误日志。
5、直接访问 tfs:www.magedu/tfs/1.jpg 这个得有图片,访问1.jpg,由于已经把整个www.magedu.net 域名的日志剥离出来了,所以这里面只记到了10:23
过过了10:23就不再记新的日志了,这个日志也不会记在 www.magedu.net _access_log,这是域名的访问值。但是这个日志它也不会记录了,再访问试一下:tail -f/apps/nginx/logs/www-magedu.net_access_log
,会记在这
重启以后就不会记了,所以这个日志还是记在这
6、访问的是 www.magedu/tfs/1.jpg,强制刷新,1.jpg 被其它 location 截走了,所以不能访问这个,得重新写个文件
/data/nginx/static/tfs/index.html
假如是 tfs 下的 index 文件,保存一下,把它 reload,这个时候访问的是 tfs 下的index.html,访问index.html:www.magedu/tfs/index.html
,会显示 tfs index,这次就没有问题了,这个日志到这里了
再看主日志文件,试一下能不能一次 tail 两个文件
tail -f
/apps/nginx/logs/www-magedu.net_tfs-access_log,/apps/nginx/logs/www-magedu.net_access_log
这样也是可以的,就是要查看这个日志的记录位置,一个个去看太慢了,所以就tail -f 多个文件,刷新这个文件进/apps/nginx/logs/www-magedu.net_tfs-access_log
这里,这个/apps/nginx/logs/www-magedu.net_access_log
它就不再记了,除非又访问了它的首页或者它的 index 文件,它才会进到那里。
7、所以这个日志的分层可以单独把某个域名拆出来或者可以把单独把某个 location的日志拆出来,以及可以自定义这些错误界面。这些小功能,首先要有印象,然后在用的时候再到官网查一下或者查看一下文档。