nginx error_page处理

语法
error_page code [ code... ] [ = | =answer-code ] uri | @named_location

示例

  1. error_page 502 503 /50x.html;
  2. location = /50x.html {
  3. root errorPage;
  4. }

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
image.png
参考: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;
}