nginx error_page处理
语法error_page code [ code... ] [ = | =answer-code ] uri | @named_location
示例
error_page 502 503 /50x.html;
location = /50x.html {
root errorPage;
}
502 503
为code,当http响应是502 503时,跳转到/50x.html
这个url上,对应location再次进行跳转。不要误会/50x.html
是什么正则匹配,这里只是url字符串。
此处返回静态页面,所以直接写root映射到对应位置,默认会拼接上nginx目录,因此若你的错误页面在nginx的errorPage
下且名为50x.html
,则root写为errorPage
,处理后会跳转到nginx目录/``errorPage/50x.html
修改返回状态码
设定自定义返回码:error_page 502 503 =200 /50x.html;
,这样502 503 会返回错误页面,同时状态码为200.
上述同样可以简写为error_page 502 503 = /50x.html;
,等号默认返回200【未核实】
_
淘宝错误页面写法
直接导向图片地址,返回图片。
#错误页面优化显示 注意将下面两个图片上传至服务器中
error_page 500 501 502 503 504 http://www.abc.com/error2.jpg;
error_page 400 403 404 405 408 410 412 413 414 415 http://www.abc.com/error1.jpg;
返回动态页面
nginx error_page 使用
nginx保留原始host
场景描述
后台系统富文本上传图片时,对图片路径的处理有几种方法,1是保留相对路径,2是直接写死服务器的域名,3是动态获取当前服务器域名,再保存数据库。
当采用第三种方法时,使用nginx反向代理的情况下,下述url会获取到http://127.0.0.1:8081/
,图片保存的路径也会为http://127.0.0.1:8081/image/xxx.jpg
,这在后台显示没问题,但是给前端显示就不行了。
String url2 = request.getScheme() + "://" + request.getServerName() + ":" + request.getLocalPort()
+ request.getContextPath() + "/" + tsysDatas.getFilePath();
原因分析
原因是nginx代理时默认会替换掉请求头中的host等信息(具体未知)。因此需要在转发时保留好原host。
如下述代码所示:proxy_set_header Host $host;
location / {
#保留原请求头
proxy_set_header Host $host;
#代理的ip地址和端口号
proxy_pass http://127.0.0.1:8081/;
#代理的连接超时时间(单位:毫秒)
proxy_connect_timeout 600;
#代理的读取资源超时时间(单位:毫秒)
proxy_read_timeout 600;
}
$host
变量:www.baidu.com,不包含端口和后续url
参考:Nginx中$http_host、$host、$proxy_host的区别
这样以来图片保存路径为http://www.xxx.com:8081/image/yyy.jpg
,端口其实也可以不写,这样更加解耦。
nginx 转发IIS请求
场景描述
服务器部署了tomcat和IIS服务器,都想通过80端口访问,但是IIS占用80端口后无法访问tomcat,因此用nginx对IIS和tomcat请求进行分别代理。
tomcat指定每个服务的端口,而IIS统一转到8088端口,再由IIS根据域名跳转。因此对IIS的代理需要通配符处理所有请求。
解决方案
将myWebSite.cn
的域名进行统一转发:server_name *.myWebSite.cn;
转发到8088端口:proxy_pass http://$host:8088/$request_uri;
此处进行了域名转发,因此需要对http服务器设置域名服务器,否则无法转发: http{ resolver 8.8.8.8; } 这个应该是谷歌的DNS服务器。
# IIS
server {
listen 80;
#域名名称
server_name *.myWebSite.cn;
location / {
#代理的ip地址和端口号
proxy_pass http://$host:8088/$request_uri;
#代理的连接超时时间(单位:毫秒)
proxy_connect_timeout 600;
#代理的读取资源超时时间(单位:毫秒)
proxy_read_timeout 600;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
tomcat的server_name
进行精确匹配:server_name signupmanage.myWebSite.cn;
nginx文件大小限制
场景描述
一个图片1.9m,无法上传,原因是超出了nginx转发大小限制:client intended to send too large body
error.log日志记录为:
*37426 client intended to send too large body: 1356885 bytes, client: 101.88.142.235, server: signupmanage.zheyousoft.cn, request: "POST /UeditorController/ueditor?action=uploadimage HTTP/1.1", host: "signupmanage.xxx.cn"
解决方法
在conf的http中添加:
http{
# 上传文件大小限制,此处为最大50m
client_max_body_size 50m;
}