常用的 web 服务器简介
Web 服务器也称为 WWW (WORLD WIDE WEB)服务器、HTTP 服务器,主要功能是提供网上信息浏览服务。
Unix 和Linux 平台下的常用 Web服务器有 Apache、 Nginx Lightpd 、Tomcat等,其中应用最广泛的是 Apache。
nginx特性:
1.反向代理:
真实的服务器不能被外部网络直接访问 ,所以需要一台代理服务器,它不仅可以被外部网络直接访问也同时跟真实服务器在同一个网络坏境,也可以是同一台服务器的不同端口。
2.负载均衡:
nginx常用的一个功能,就是分摊到多个操作单元上执行,例如:web服务器,FTP服务器等从而共同完成任务。
简单来说:就是当有两台或者两台以上的服务器,根据规则或者随机分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡 ,目前nginx支持自带三种负载均衡策略,还有两种常用的第三方策略
负载均衡通过upstream指令来实现。
3.动静分离:
动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源 分开,动静资源做好了拆分后 就可以根据静态资源的特点将其做缓存操作 ,这就是网页静态化处理的核心思路
目录
nginx原理:
1.在nginx 启动后,会有一个master进程和多个worker进程,master进程主要用来管理worker进程,包括:接受信号,将信号分发给worker进程,监听worker进程工作状态,当worker进程退出时(非正常),启动新的worker进程。
基本的网络事件会交给worker进程处理。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的 。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。 worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致,原因与nginx的进程模型以及事件处理模型是分不开的 。
2.当master接收到重新加载的信号会怎么处理(./nginx -s reload)?
master会重新加载配置文件,然后启动新的进程,使用的新的worker进程来接受请求,并告诉老的worker进程他们可以退休了,老的worker进程将不会接受新的,老的worker进程处理完手中正在处理的请求就会退出。
3.worker进程是如何处理用户的请求呢?
由于worker进程之间是平等的,每个进程,处理请求的机会也是一样的。
当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,那怎么做到的呢?
首先master会根据配置文件生成一个监听相应端口的socket,然后再faster出多个worker进程,这样每个worker就可以接受从socket过来的消息(其实这个时候应该是每一个worker都有一个socket,只是这些socket监听的地址是一样的)。当一个连接过来的时候,每一个worker都能接收到通知,但是只有一个worker能和这个连接建立关系,其他的worker都会连接失败,这就是所谓的惊群现在,为了解决这个问题,nginx提供一个共享锁accept_mutex,有了这个共享锁后,就会只有一个worker去接收这个连接。当一个worker进程accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。
五个特性:
1、热部署
在master管理进程与worker工作进程的分离设计,使的Nginx具有热部署的功能,那么在7×24小时不间断服务的前提下,升级Nginx的可执行文件。也可以在不停止服务的情况下修改配置文件,更换日志文件等功能。
2、可以高并发连接
这是一个很重要的一个特性!在这一个互联网快速发展,互联网用户数量不断增加,一些大公司、网站都需要面对高并发请求, 理论上,Nginx支持的并发连接上限取决于内存。
3、低的内存消耗
在一般的情况下,10000个非活跃的HTTP Keep-Alive 连接在Nginx中仅消耗2.5M的内存,这也是Nginx支持高并发连接的基础。
4、处理响应请求很快
在正常的情况下,单次请求会得到更快的响应。在高峰期,Nginx可以比其他的Web服务器更快的响应请求。
5、具有很高的可靠性
Nginx是一个高可靠性的Web服务器,选择Nginx的基本条件,现在很多的网站都在使用Nginx,高可靠性来自其核心框架代码的优秀设计、模块设计的简单性;并且这些模块都非常的稳定。
Nginx的主要应用场景?
1.静态网站
2.负载均衡(可以减轻单台服务器的压力)
3.动态代理
4.动静分离
5.虚拟主机
6.解决ddos攻击:
方案:
一. 限制每秒请求数
二.限制IP连接数
三.白名单设置
http_limit_conn和http_limit_req模块限制了单ip单位时间内的并发和请求数,但是如果Nginx前面有lvs或者 haproxy之类的负载均衡或者反向代理,nginx获取的都是来自负载均衡的连接或请求,这时不应该限制负载均衡的连接和请求,就需要geo和map 模块设置白名单
四.测试
使用ab命令来模拟CC攻击,http_limit_conn和http_limit_req模块要分开测试,同时注意 http_limit_conn模块只统计正在被处理的请求(这些请求的头信息已被完全读入)所在的连接。如果请求已经处理完,连接没有被关闭时,是不会 被统计的。这时用netstat看到连接数可以超过限定的数量,不会被阻止。
五.其它一些防CC的方法
1.Nginx模块 ModSecurity、http_guard、ngx_lua_waf
ModSecurity 应用层WAF,功能强大,能防御的攻击多,配置复杂
ngx_lua_waf 基于ngx_lua的web应用防火墙,使用简单,高性能和轻量级
http_guard 基于openresty
2.软件+Iptables
fail2ban 通过分析日志来判断是否使用iptables拦截
DDoS Deflate 通过netstat判断ip连接数,并使用iptables屏蔽
开头说过DDOS是一个系统工程,通过优化系统和软件配置,只能防御小规模的CC攻击。
将 timeout 设低来防止 DOS 攻击
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
限制用户连接数来预防 DOS 攻击
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;
什么是DDoS攻击
DDoS攻击是Distributed Denial of Service的缩写,翻译成中文就是分布式拒绝服务。即不法黑客组织通过控制服务器等资源,发动对包括国家骨干网络、重要网络设施、政企或个人网站在内的互联网上任一目标的攻击,致使目标服务器断网,最终停止提供服务。
nginx防止DDoS攻击
限制每秒的请求数
ngx_http_limit_req_module模块通过漏桶原理来限制单位时间内的请求数,一旦单位时间内请求数超过限制就会返回503错误。
在nginx.conf中新增如下配置:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=100r/s; //触发条件,所有访问ip 限制每秒100个请求 ...
server {
...
location ~ \.php$ {
limit_req zone=one burst=5 nodelay; //执行的动作,通过zone名字对应 }
}
}
以上配置用到的一些参数:
参数 含义
$binary_remote_addr 二进制远程地址
zone=one:10m 定义zone名字叫one,并为这个zone分配10M内存,用来存储会话(二进制远程地址),1m内存可以保存16000会话
rate=100r/s 限制频率为每秒100个请求
burst=5 允许超过频率限制的请求数不多于5个,假设1、2、3、4秒请求为每秒9个,那么第5秒内请求15个是允许的,反之,如果第一秒内请求15个,会将5个请求放到第二秒,第二秒内超过10的请求直接503,类似多秒内平均速率限制。
nodelay 超过的请求不被延迟处理,设置后15个请求在1秒内处理
由于使用的是漏桶原理,所以其实这个配置不止能用来防止DDoS攻击,还能用作服务器的限流。
限制单个IP的连接数
ngx_http_limit_conn_module模块可以用来限制单个IP的连接数,配置如下:
http {
limit_conn_zone $binary_remote_addr zone=addr:10m; //触发条件
...
server {
...
location /download/ {
limit_conn addr 2; // 限制同一时间内2个连接,超出的连接返回503
}
}
}
如何设置能限制某个IP某一时间段的访问次数是一个让人头疼的问题,特别面对恶意的ddos攻击的时候。其中CC攻击(Challenge Collapsar)是DDOS(分布式拒绝服务)的一种,也是一种常见的网站攻击方法,攻击者通过代理服务器或者肉鸡向向受害主机不停地发大量数据包,造成对方服务器资源耗尽,一直到宕机崩溃。
cc攻击一般就是使用有限的ip数对服务器频繁发送数据来达到攻击的目的,nginx可以通过
HttpLimitReqModul和HttpLimitZoneModule配置限制ip在同一时间段的访问次数来防cc攻击。
HttpLimitReqModul用来限制连单位时间内连接数的模块,使用limit_req_zone和limit_req指令配合
使用来达到限制。一旦并发连接超过指定数量,就会返回503错误。
HttpLimitConnModul用来限制单个ip的并发连接数,使用limit_zone和limit_conn指令
这两个模块的区别前一个是对一段时间内的连接数限制,后者是对同一时刻的连接数限制
HttpLimitReqModul 限制某一段时间内同一ip访问数实例
http{
...
#定义一个名为allips的limit_req_zone用来存储session,大小是10M内存,
#以$binary_remote_addr 为key,限制平均每秒的请求为20个,
#1M能存储16000个状态,rete的值必须为整数,
#如果限制两秒钟一个请求,可以设置成30r/m
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
...
server{
...
location {
...
#限制每ip每秒不超过20个请求,漏桶数burst为5
#brust的意思就是,如果第1秒、2,3,4秒请求为19个,
#第5秒的请求为25个是被允许的。
#但是如果你第1秒就25个请求,第2秒超过20的请求返回503错误。
#nodelay,如果不设置该选项,严格使用平均速率限制请求数,
#第1秒25个请求时,5个请求放到第2秒执行,
#设置nodelay,25个请求将在第1秒执行。
limit_req zone=allips burst=5 nodelay;
...
}
...
}
...
}
阻止用户使用代理
#这三句if是禁止使用代理ip来访问,或禁止使用压力测试软件进行dos攻击
(放在nginx.conf的server里面)
if ($http_user_agent ~* ApacheBench|WebBench|java/){
return 403;
}
if ( $http_user_agent ~* (Wget|ab) ) {
return 403;
}
if ( $http_user_agent ~* LWP::Simple|BBBike|wget) {
return 403;
}
7.解决ajax跨域问题
1.静态网站:
在linux中opt目录下新建static文件夹,将ace静态网站项目拷贝到static文件夹下
nginx是一个HTTP的web服务器,可以将服务器上的静态文件通过HTTP协议返回给浏览器客户端
通过过http://192.168.128:80/访问
通过http://192.168.128:80/ace访问
2.负载均衡:
什么是负载均衡?
负载均衡实现方式?
Nginx实现负载均衡?
Nginx实现负载均衡:通过在Nginx.conf文件进行配置即可实现
Nginx常用负载均衡策略?
轮询:(默认)
权重:
ip_hash:
最少连接:
负载均衡的其他几个配置:
3.静态代理:
Nginx如何实现静态代理?
通过在Nginx的Nginx.conf文件进行配置即可实现
4.动静分离:
动静分离示例:
该示例是在一台linux服务器上演示的,两个tomcat服务器,三个Nginx服务器
步骤:
1)启动tomcat:拷贝tomcat,修改端口号
2)cp Nginx.conf Nginx81.conf cp Nginx.conf Nginx82.conf
启动Nginx:Nginx可以在一台Linux上只安装一份,拷贝配置文件,根据配置文件启动多个Nginx
Nginx做负载均衡的Nginx.conf配置:
Nginx做动态代理的配置
在server中修改listen为81
在server中添加静态代理location
Nginx做动态代理的配置
在server中修改listen为82
在server中添加静态代理location
5.虚拟主机:
虚拟主机在工作中使用的相对较少,这里可以简单了解一下
配置虚拟主机一般有两种方式
方式一:基于端口的虚拟主机
方式二:基于域名的虚拟主机
虚拟主机示例: