❶ 从nginx访问日志中怎么看后端服务器的状态信息(nginx前端传给后端看后端响应
nginx的日志格式是可以通过日橘蔽志模块去配置的。
比如:棚余$status 记录请求状态,$body_bytes_sent 发送给客户端的字节数,不链伍滚包括响应头的大小,$bytes_sent 发送给客户端的总字节数等。可在nginx配置文件中这样配置:
配置完后重启nginx服务,再查看日志。
❷ nginx反向代理忽略证书异常
nginx反向代理亏岁忽略证判银书异常:可以在nginx上配置证书,后端服务器就不再需要配置证书了。
反向代理配置有误:没有正确配置反向代理,如反向代理的机器地址、域名解析、端口号等配置错误。
所有的可用冗余机器全部不可访问:反向代理可以配置多个冗余的机器,也可以只配置一个,当所有配置的被反向代掘空宴理的机器全不可访问,如网络异常等,会导致反向代理后不能显示。
支持操作系统:
FreeBSD 3— 10 / i386; FreeBSD 5— 10 / amd64。
linux 2.2— 4 / i386; Linux 2.6— 4 / amd64; Linux 3— 4 / armv6l, armv7l, aarch64。
Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v。
AIX7.1 /powerpc。
HP-UX 11.31 / ia64。
Mac OS X/ ppc, i386。
Windows XP,Windows Server 2003,Windows 10。
❸ 如何通过配置NGINX和NGINX Plus来缓解DDoS攻击
DDOS是一种通过大流量的请求对目标进行轰炸式访问,导致提供服务的服务器资源耗尽进而无法继续提供服务的攻击手段。
一般盯枣情况下,攻击者通过大量耐举请求与连接使服务器处于饱和状态,以至于无法接受新的请求或变得很慢。
应用层DDOS攻击的特征
应用层(七层/HTTP层)DDOS攻击通常由木马程序发起,其可以通过设计更好的利用目标系统的脆弱点。例如,对于无法处理大量并发请求的系统,仅仅通过建立大量的连接,并周期性的发出少量数据包来保持会话就可以耗尽系统的资源,使其无法接受新的连接请求达到DDOS的目的。其他还有采用发送大量连接请求发送大数据包的请求进行攻击的形式。因为攻击是由木马程序发起,攻击者可以在很短时间内快速建立大量的连接,并发出大量的请求。
以下是一些DDOS的特证,我们可以据此特征来抵抗DDOS(包括但不限于):
攻击经常来源于一些相对固定的IP或IP段,每个IP都有远大于真实用户的连接数和请求数。
备注:这并不表明这种请求都是代表着DDOS攻击。在很多使用NAT的网络架构中,很多的客户端使用网关的IP地址访问公网资源。但是,即便如此,这样的请求数和连接数也会远少于DDOS攻击。
因为攻击是由木马发出且目的是使昌则碧服务器超负荷,请求的频率会远远超过正常人的请求。
User-Agent通常是一个非标准的值
Referer有时是一个容易联想到攻击的值
使用Nginx、Nginx Plus抵抗DDOS攻击
结合上面提到的DDOS攻击的特征,Nginx、Nginx Plus有很多的特性可以用来有效的防御DDOS攻击,可以从调整入口访问流量和控制反向代理到后端服务器的流量两个方面来达到抵御DDOS攻击的目的。
限制请求速度
设置Nginx、Nginx Plus的连接请求在一个真实用户请求的合理范围内。比如,如果你觉得一个正常用户每两秒可以请求一次登录页面,你就可以设置Nginx每两秒钟接收一个客户端IP的请求(大约等同于每分钟30个请求)。
php">limit_req_zone$binary_remote_addrzone=one:10mrate=30r/m;
server{
...
location/login.html{
limit_reqzone=one;
...
}
}`limit_req_zone`命令设置了一个叫one的共享内存区来存储请求状态的特定键值,在上面的例子中是客户端IP($binary_remote_addr)。location块中的`limit_req`通过引用one共享内存区来实现限制访问/login.html的目的。
限制连接数量
设置Nginx、NginxPlus的连接数在一个真实用户请求的合理范围内。比如,你可以设置每个客户端IP连接/store不可以超过10个。
limit_conn_zone$binary_remote_addrzone=addr:10m;
server{
...
location/store/{
limit_connaddr10;
...
}
}
`limit_conn_zone`命令设置了一个叫addr的共享内存区来存储特定键值的状态,在上面的例子中是客户端IP( $binary_remote_addr)。location块中`limit_conn`通过引用addr共享内存区来限制到/store/的最大连接数为10。
关闭慢连接
有一些DDOS攻击,比如Slowlris,是通过建立大量的连接并周期性的发送一些数据包保持会话来达到攻击目的,这种周期通常会低于正常的请求。这种情况我们可以通过关闭慢连接来抵御攻击。
`client_body_timeout`命令用来定义读取客户端请求的超时时间,`client_header_timeout`命令用来定于读取客户端请求头的超时时间。这两个参数的默认值都是60s,我们可以通过下面的命令将他们设置为5s:
server{
client_body_timeout5s;
client_header_timeout5s;
...
}
设置IP黑名单
如果确定攻击来源于某些IP地址,我们可以将其加入黑名单,Nginx就不会再接受他们的请求。比如,你已经确定攻击来自于从123.123.123.1到123.123.123.16的一段IP地址,你可以这样设置:
location/{
deny123.123.123.0/28;
...
}
或者你确定攻击来源于123.123.123.3、123.123.123.5、123.123.123.7几个IP,可以这样设置:
location/{
deny123.123.123.3;
deny123.123.123.5;
deny123.123.123.7;
...
}
设置IP白名单
如果你的网站仅允许特定的IP或IP段访问,你可以结合使用allow和deny命令来限制仅允许你指定的IP地址访问你的网站。如下,你可以设置仅允许192.168.1.0段的内网用户访问:
location/{
allow192.168.1.0/24;
denyall;
...
}
deny命令会拒绝除了allow指定的IP段之外的所有其他IP的访问请求。
使用缓存进行流量削峰
通过打开Nginx的缓存功能并设置特定的缓存参数,可以削减来自攻击的流量,同时也可以减轻对后端服务器的请求压力。以下是一些有用的设置:
`proxy_cache_use_stale `的updating参数告诉Nginx什么时候该更新所缓存的对象。只需要到后端的一个更新请求,在缓存有效期间客户端对该对象的请求都无需访问后端服务器。当通过对一个文件的频繁请求来实施攻击时,缓存功能可极大的降低到后端服务器的请求。
`proxy_cache_key `命令定义的键值通常包含一些内嵌的变量(默认的键值$scheme$proxy_host$request_uri包含了三个变量)。如果键值包含`$query_string`变量,当攻击的请求字符串是随机的时候就会给Nginx代理过重的缓存负担,因此我们建议一般情况下不要包含`$query_string`变量。
屏蔽特的请求
可以设置Nginx、Nginx Plus屏蔽一些类型的请求:
针对特定URL的请求
针对不是常见的User-Agent的请求
针对Referer头中包含可以联想到攻击的值的请求
针对其他请求头中包含可以联想到攻击的值的请求
比如,如果你判定攻击是针对一个特定的URL:/foo.PHP,我们就可以屏蔽到这个页面的请求:
location/foo.php{
denyall;
}
或者你判定攻击请求的User-Agent中包含foo或bar,我们也可以屏蔽这些请求:
location/{
if($http_user_agent~*foo|bar){
return403;
}
...
}
http_name变量引用一个请求头,上述例子中是User-Agent头。可以针对其他的http头使用类似的方法来识别攻击。
限制到后端服务器的连接数
一个Nginx、Nginx Plus实例可以处理比后端服务器多的多的并发请求。在Nginx Plus中,你可以限制到每一个后端服务器的连接数,比如可以设置Nginx Plus与website upstream中的每个后端服务器建立的连接数不得超过200个:
upstreamwebsite{
server192.168.100.1:80max_conns=200;
server192.168.100.2:80max_conns=200;
queue10timeout=30s;
}
`max_conns`参数可以针对每一个后端服务器设置Nginx Plus可以与之建立的最大连接数。`queue`命令设置了当每个后端服务器都达到最大连接数后的队列大小,`timeout`参数指定了请求在队列中的保留时间。
处理特定类型的攻击
有一种攻击是发送包含特别大的值的请求头,引起服务器端缓冲区溢出。Nginx、Nginx Plus针对这种攻击类型的防御,可以参考[Using NGINX and NGINX Plus to Protect Against CVE-2015-1635](http://nginx.com/blog/nginx-protect-cve-2015-1635/?_ga=1.14368116.2137319792.1439284699)
优化Nginx性能
DDOS攻击通常会带来高的负载压力,可以通过一些调优参数,提高Nginx、Nginx Plus处理性能,硬抗DDOS攻击,详细参考:[Tuning NGINX for Performance](http://nginx.com/blog/tuning-nginx/?_ga=1.48422373.2137319792.1439284699)
识别DDOS攻击
到目前为止,我们都是集中在如何是用Nginx、Nginx Plus来减轻DDOS攻击带来的影响。如何才能让Nginx、Nginx Plus帮助我们识别DDOS攻击呢?`Nginx Plus Status mole`提供了到后端服务器流量的详细统计,可以用来识别异常的流量。Nginx Plus提供一个当前服务状态的仪表盘页面,同时也可以在自定义系统或其他第三方系统中通过API的方式获取这些统计信息,并根据历史趋势分析识别非正常的流量进而发出告警。
总结
Nginx和Nginx Plus可以作为抵御DDOS攻击的一个有力手段,而且Nginx Plus中提供了一些附加的特性来更好的抵御DDOS攻击并且当攻击发生时及时的识别到,另外,你还可以第三方安全防御来防DDOS,比如:知道创宇抗D保,既可以防DDOS,也能防CC,效果也不错
❹ Nginx服务器错误是什么原因
Nginx服务器错误一般有以下几点原因:
1、请求的header过大。nginx默认的header长度上限是4k,如果超过了这个值,nginx会直接返回400错误.
解决方法:配置nginx.conf相关设置。可以通过以下2个参数来调整header上限:
client_header_buffer_size 16k;large_client_header_buffers 4 16k。
2、上传文件过程中出现错误。这时浏览器显示“413 Request Entity Too Large”。这是因为没有设置client_max_body_size,这个参数默认只是1M,也就是说发布的文章内容大小不能超过1M。
解决方法:增加如下两行到nginx.conf的http{}段, 增大nginx上传文件大小限制:设置允许发布内容为8M:client_max_body_size 8M;client_body_buffer_size 128k。
另外如果运行的是php,那么还要检查php.ini,这个大小client_max_body_size要和php.ini中的如下值的最大值一致或者稍大,这样就不会因为提交数据大小不一致出现的错误:post_max_size = 8M;upload_max_filesize = 6M。
修改完配置后,别忘记重新加载。
3、客户端在为等到服务器相应返回前就关闭了客户端描述符。一般出现在客户端设置超时后,服务器主动关闭。
解决方法:根据实际Nginx后端服务器的处理时间修改客户端超时时间。
4、脚本错误(php语法错误、lua语法错误)。
解决方法:查看nginx_err_log php_err_log。
5、访问量过大,系统资源限制,不能打开过多文件。 磁盘空间不足。(access log开启可能导致磁盘满溢,服务器主动关闭)。
解决方法:修改/etc/sysctl.conf文件,并使用下面的命令确认: #sysctl -p。要使 limits.conf 文件配置生效,必须要确保 pam_limits.so 文件被加入到启动文件中。
6、后端服务无法处理,业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问题。
7、后端服务器在超时时间内,未响应Nginx代理请求。
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
8、网站页面缓存过大。
解决方法:配置nginx.conf相关设置:fastcgi_buffers 8 128k;send_timeout 60。
❺ nginx网站502问题怎么排查
502一般是后端的服务挂了
例如nginx后端转发请求到tomcat,但tomcat进程意外终止了,nginx就会报正巧502错误
检举谈键查后端服务侍缺器是否可以正常工作
❻ nginx容易出现哪些问题
404 bad request
一般原因:请求的Header过大
解决方法:配置nginx.conf相关设置
client_header_buffer_size 16k;
large_client_header_buffers 4 64k;
client_max_body_size 10m;
配置php.ini如下(必须和nginx.conf配置一致)
post_max_size=10M
upload_max_filesize=2M
499 Client Closed Request
一般原因:客户端在为等到服务器相应返回前就关闭了客户端描述符。一般出现在客户端设置超时后,主动关闭socket.
解决方法:根嫌散据实际Nginx后端服务器的处理时间修改客户端超时时间。
500 Internal Server Rrror
一般原因:脚本错误,(php语法错误、lua语法错误)
访问量过大,系统资源限制,不能打开过多文件
磁盘空间不足。(access log开启可能导致磁盘满溢 关闭)
解决方法:语法错误查看nginx_err_log php_err_log。
文件访问量:
1.修改nginx配置文件
worker_rlimit_nofile 65535;
2.修改/etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
502 Bad Gateway、503 Serveice Unavailable
一般原因:后端服务无法处理,芹孝氏业务中断。
解决方法:从后端日志获取错误原因,解决后端服务器问慎凯题。
504 Gateway Timeout
一般原因:后端服务器在超时时间内,未响应Nginx代理请求
解决方法:根据后端服务器实际处理情况,调正后端请求超时时间。
❼ nginx不得不说的参数之 为什么nginx error
nginx不得不说的参数之 proxy_intercept_errors与fastcgi_intercept_errors
为什么我的error_page 配置没有生效,没有正常跳转?我也遇到过这个问题,所以这才促使我对proxy_intercept_errors与fastcgi_intercept_errors这两个参数做了详细的了解。
由于我们商户和点评信息相关web应用是给用户做消费决策的商户和相关点评等信息,浏览功能一般比互动功能要重要一些,但是由于一些内部出错可能会导致整个应用出现异常,导致用户无法浏览到商户的相关信息。
为了提升商户页面的可用性,我们通过静态抓取现有页面保存在静态文件服务器上,在应用服务器nginx上配置相关规则,当应用出现异常的时候就会将用户的请求转发到降级用途的静态文件服务器上。
在整个规则配置过程中,发现了一些问题,就是在nginx上配置了相关error_page的跳转页面,发现后端应用异常的时候,预期中的nginx跳转规则并没有生效。
error_page 500 501 502 503 504 @shopstatic;
location @shopstatic {
access_log logs/shop-web.access.log maintry;
proxy_pass url;
}
我们业务应用使用的是nginx+java容信激器的结构形式,nginx做反向代理和日志记录,当用户请求到达服务器时,先判断nginx配置的根目录下是否存在对应的静态文件,不存在的时候转发到后端的java容器server。我们滑败袜在nginx中配置了error_page 异常跳转的规则,预期当后端java容器出现异常错枯姿误的时候,对应的请求会被nginx转发到我们静态降级的服务,但是实际上,当后端java容器出现异常或者过载的时候,nginx是直接吐出java容器后端的异常信息。
由于第一次配置这样奇特的nginx规则,搞不清楚是什么原因,在google上搜了半晌,由于搞不清楚状况,也描述不清楚,所以一直没有什么收获,后来终于用关键词error_page proxy搜索搞定了,一个老外回答了类似的问题,给了proxy_intercept_errors on;这个配置,自己试了下还真的ok了。
发现学会如何提问,才是自己要努力的方向。
nginx proxy 启用自定义错误页面:
语法:proxy_intercept_errors on | off;
默认值:
proxy_intercept_errors off;
上下文:http, server, location
当被代理的后端服务器的响应状态码大于等于300时,决定是否直接将响应发送给客户端,亦或将响应转发给nginx由error_page指令来处理。
❽ nginx 是怎么对 后端服务器 做健康检查的
apache 相对于nginx 的优点:
rewrite ,比nginx 的rewrite 强大动态页面,nginx处理动态请求是鸡银清肋,一般动态请求要猛轮apache去做,nginx只适合静态锋知前和反向。
模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多超稳定!
❾ 从刚刚“简书”平台的短暂异常,谈Nginx An error occurred报错~
An error occurred.
Sorry, the page you are looking for is currently unavailable.
Please try again later.
If you are the system administrator of this resource then you should check theerror log for details.
Faithfully yours, nginx.
如上,刚老徐正打算上平台,写文章,出现如上错误,应该持续了几分钟~不知道有多少用户有感知,平台响应还不错,几分钟后已恢复正常~
一般nginx的此类报错,原因如下(当然,老徐对nginx了解不深,如下都是一些可能原因)
出现问题,首先是去分析nginx的日志,得到一些线索~
可能的常见原因:
/ 1 /
很明显这是一个nginx的错误,查看nginx.conf的文件过程中分析可能是以下的问题,在nginx.xml中有如下配置:
标红的部分是很大的嫌疑,恰好应用中在提交数据的一瞬间和服务器有多次交互,这些交互都要过nginx。再加上用户IP来做key,假如多个用户访问在网上的最后一跳是同一个路由器,很显然会被服务器当成是一台电脑,从而出现判断错误。那么又一个新问题来了,出现503错误后为啥返回的是那个错误页面呢?
带着这个问题在nginx.conf中又发现了一段配置,如下图:
这个配置的意思是当出现500、502、503、504的错误时返回50x.html页面,这个页面在nginx安装目录的html文件夹下,内容如下:
这个页面经过浏览器解析就是开头第一幅图的样子。
分析到这里,就大概估计出原因了,把之前的rate值该大一点即可。那么到底改多大?这个要根据不同的业务而定,甚至去掉这个配置,所以这个是个经验值,通过多次试验可以得到一个相对于应用合理的值,这里就不说了。
实际nginx出现这个错误原因应该有很多,这里提供一种可能原因,以供网友参考。
/ 2 /
日志记录中HTTP状态码出现499错误有多种情况,我遇到的一种情况是nginx反代到一个永远打不开的后端,就这样了,日志状态记录是499、发送字节数是0。
老是有用户反映网站系统时好时坏,因为线上的产品很长时间没有修改,所以前端程序的问题基本上可以排除,于是就想着是Get方式调用的接口不稳定,问了相关人员,说没有问题,为了拿到确切证据,于是我问相关人员要了nginx服务器的日志文件(awstats日志),分析后发现日志中很多错误码为499的错误,约占整个日志文件的1%,而它只占全部报错的70%左右(全部报错见下图),那么所有报错加起来就要超过1%了,这个量还是特别大的。
499错误是什么?让我们看看NGINX的源码中的定义:
ngx_string(ngx_http_error_495_page), /* 495, https certificate error */
ngx_string(ngx_http_error_496_page), /* 496, https no certificate */
ngx_string(ngx_http_error_497_page), /* 497, http to https */
ngx_string(ngx_http_error_404_page), /* 498, canceled */
ngx_null_string, /* 499, client has closed connection */
可以看到,499对应的是 “client has closed connection”。这很有可能是因为服务器端处理的时间过长,客户端“不耐烦”了。
Nginx 499错误的原因及解决方法
打开Nginx的access.log发现在最后一次的提交是出现了HTTP1.1 499 0 -这样的错误,在网络搜索nginx 499错误,结果都是说客户端主动断开了连接。
但经过我的测试这显然不是客户端的问题,因为使用端口+IP直接访问后端服务器不存在此问题,后来测试nginx发现如果两次提交post过快就会出现499的情况,看来是nginx认为是不安全的连接,主动拒绝了客户端的连接.
但搜索相关问题一直找不到解决方法,最后终于在google上搜索到一英文论坛上有关于此错误的解决方法:
proxy_ignore_client_abort on;
Don’t know if this is safe.
就是说要配置参数 proxy_ignore_client_abort on;
表示代理服务端不要主要主动关闭客户端连接。
以此配置重启nginx,问题果然得到解决。只是安全方面稍有欠缺,但比总是出现找不到服务器好多了。
还有一种原因是 我后来测试发现 确实是客户端关闭了连接,或者说连接超时 ,无论你设置多少超时时间多没用 原来是php进程不够用了 改善一下php进程数 问题解决
/ 3 /
今天网站突然出现如下错误:
The page you are looking for is temporarily unavailable.Please try again later.
很奇怪,我对服务器端的技术不是很熟悉,于是查询了下google,在https://wiki.archlinux.org/index.php/Nginx
上面的解决方法:
Error: The page you are looking for is temporarily unavailable. Please try again later.
This is because the FastCGI server has not been started.
如何解决呢?
刚开始我怀疑是不是nginx挂了,我首先通过 ps aux | grep nginx ,结果出现:
root 3769 0.0 0.0 5760 692 ? Ss Apr21 0:00 nginx: master process /usr/local/nginx/sbin/nginx
www 3770 0.0 0.1 18680 14252 ? S Apr21 0:03 nginx: worker process
www 3771 0.0 0.1 18680 14252 ? S Apr21 0:03 nginx: worker process
www 3772 0.0 0.1 18712 14276 ? S Apr21 0:03 nginx: worker process
www 3774 0.0 0.1 18680 14248 ? S Apr21 0:03 nginx: worker process
www 3776 0.0 0.1 18712 14240 ? S Apr21 0:03 nginx: worker process
www 3777 0.0 0.1 18680 14252 ? S Apr21 0:03 nginx: worker process
www 3778 0.0 0.1 18680 14232 ? S Apr21 0:02 nginx: worker process
root 24068 0.0 0.0 5196 756 pts/1 S+ 14:33 0:00 grep nginx
可见nginx是正常的,本来打算重启nginx的:
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf的,
突然觉得有没有其他方法,有同事提示先在一个目录下运行下test.html和test.php,结果html可以运行,php无法运行。
证实是php没有启动,我刚才也检测过php的进程,的确是没有php进程,这台服务器我不熟悉,同事帮忙查看了下
cd /etc/init.d,就是web管理员经常看的地方,是随着系统自动启动的服务,程序等。可以看看:
http://blog.wgzhao.com/2008/12/27/talk-about-rc-local.html的《 说说? /etc/rc.d/rc.local 》
找到:
/usr/local/php/sbin/php-fpm start,首先什么是php-fpm呢?
就是FastCGI Process Manager,是一种可选的PHP FastGCI执行模式,有一点很有特点的应用,尤其是一个繁忙的网站中:
(1)可适应的进行再生(NEW!)
(2)基本的统计功能(Apache's mod_status)
(3)高级进程管理功能,能够优雅的停止/开始
(4)能够使用不同的工作用户和不同的php.ini
(5)输入,输出日志记录...
开启后,一切恢复正常!自己的服务器端技术还是有很多地方使用的不够。需要多学习使用!
总结:
1、试检查一下nginx.conf的设置,是不是有limit的设置,比如limit_zone、limit_conn,这些参数也是有影响的。
2、检查一下防火墙,是不是有相关的设置限制。
3、检查一下nginx.conf的设置,看看有没有valid_referers none blocked的防链设置。
4、看下访问静态文件是否正常,错误排除~
OK,如上只是一些猜测~
具体原因,具体分析~
越来越多的系统,采用nginx,大家有必要了解些nginx的知识~
❿ 如何判断nginx upstream比较忙
可以在server下添加
add_header backendIP $upstream_addr;
add_header backendCode $upstream_status;
这样可纳宏在浏览器的响应头中看到backendIP字段,为后端访问的IP地址
backendCode字段,为后端服亏陪务器返回的HTTP状态码
可洞空册以用来判断哪个服务器接受了请求,并是否正常