nginx常见典型故障( 二 )


需求是除了404 页面,其他的错误页面都要返回 json,而且在外界看来是正常的,所以说白了就是后端服务器返回了我定义的错误状态码,需要在nginx这里做一个转换,转换到 200,用户看到的是200,其实是将错误的状态码定向至200,然后再次调度到/api 。
server { listen 80; server_name www.bgx.com; location / { proxy_intercept_errors on; #反向代理默认不支持自定义错误页面,需要增加该参数 proxy_set_header Host $host; proxy_pass http://www_server3_plools; proxy_set_header X-Forwarded-For $remote_addr; proxy_next_upstream error timeout http_503 non_idempotent; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } #出现500等错误都返回给用户200状态,并跳转至/api error_page 500 502 503 504 =200 /api; location = /api{ default_type application/json; return 200 '{"retCode":"1001","retMsg":"invoke failed"}'; }9.负载均衡配置,当挂掉一台服务时,不能流畅地切换
需求:在配置负载均衡时,后端三台web,手动关闭一个web 服务,当轮询到这台关停的时候,总是要卡顿很久?
#可以如下这两个参数:proxy_connect_timeout 600; #1分钟 proxy_read_timeout 600; #1分钟10.Nginx如何封掉真实恶意攻击的IP地址
server { listen 80; server_name bgx.com; location / { set $allow true; if ($http_x_forwarded_for ~ "106.121.*.*|106.121.71.120|106.121.74.130"){ set $allow false; } if ($allow = false){ return 403; } }}11.配置Nginx,仅允许公司网络地址能访问公司后台/admin,其他网络访问返回403错误 。
server { listen 80; server_name bgx.com; location ~ ^/admin { set $allow false; if ($http_x_forwarded_for ~ "36.11.10.254|36.11.10.*"){ set $allow true; } if ($allow = false){ return 403; } }}12.linux系统的65535端口限制是如何来的?
在TCP、UDP协议的开头,会分别有16位来存储源端口号和目标端口号,所以端口个数是2^16-1=65535个 。
TCP端口数65535的限制,这个是由TCP/IP协议栈中的第四层运输层UDP/TCP协议决定的.在UDP/TCP协议中源端口和目的端口都只有16位,也就是说端口的取值范围为0~65535 。
13.四层负载均衡与七层负载均衡误区?
1.四层负载均衡不受系统套接字限制,可以承载的并发量可以远远超过65535,这是因为四层在OSI协议中处于较低的层级,其并非在用户空间,而是在内核空间,是由TCP/IP协议栈处理的!
2.而七层负载均衡是在应用层进行负载均衡,应用层位于OSI协议中的最高层,也就是最接近用户,其维护连接数要受到系统套接字的限制,Linux默认最多可以使用的套接字就65535个,这是系统的限制……更重要的是每个客户端请求到达服务器,服务器处理的时候都是自最下层往上一次拆封数据包的,最上面的应用层需要处理更多的工作,因此其必然承载的并发量不如四层多!
3.但需要注意七层负载均衡可以进行更复杂的控制,比如session会话保持,URL规则控制等,功能比四层更全面!
至于四层和七层可以处理的并发量有多大,这个和硬件密切相关,不同配置的服务器,差异较大,没有准确的量化指标!
14.如何为Nginx配置错误页面?
当我们只有单台web服务器时,需要配置错误返回页面,可以使用error_page来指定 。
[root@web01 conf.d]# cat code3.conf server { listen 80; server_name code.oldboy.com; location / { root /code; } #如服务器返回如下错误状态码,则进行跳转,跳转至/404.html error_page 404 403 /40x.html; #如服务器返回如下错误状态码,则进行跳转,跳转至/50x.html error_page 500 502 503 504 /50x.html; #精准匹配访问 location = /404.html { root /err; } location = /50x.html { root /err; }}15.如何为nginx反向代理设置自定义错误页面,包含proxy、fastcgi
#代理的配置[root@www conf.d]# cat proxy.confserver { listen 80; server_name test.bgx.com; location / { proxy_pass http://127.0.0.1:8080; proxy_intercept_errors on; #接收后端web4xx,5xx错误 error_page 500 502 403 404 = /proxy_error.html; #将后端web抛出的错误定向到指定的页面 } #如果有请求proxy_error.html文件的则指定到对应的目录 location = /proxy_error.html { root /code/proxy; }}#后端web节点配置[root@www conf.d]# cat web.confserver { listen 8080; server_name test.bgx.com; root /code/web; index index.html; error_page 404 /404.html; #如果代理开启proxy_intercept_errors则后端web配置error_page无效}16.Nginx如何禁止IP直接访问?
当用户通过访问IP或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦 。


推荐阅读