(1)nginx运行工做进程个数,通常设置cpu的核心或者核心数x2javascript
若是不了解cpu的核数,能够top命令以后按1看出来,也能够查看/proc/cpuinfo文件 grep ^processor /proc/cpuinfo | wc -l php
[root@lx~]# vi/usr/local/nginx1.10/conf/nginx.confcss
worker_processes 4;html
[root@lx~]# /usr/local/nginx1.10/sbin/nginx-s reload前端
[root@lx~]# ps -aux | grep nginx |grep -v grepjava
root 9834 0.0 0.0 47556 1948 ? Ss 22:36 0:00 nginx: master processnginxnode
www 10135 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processmysql
www 10136 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processlinux
www 10137 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker processnginx
www 10138 0.0 0.0 50088 2004 ? S 22:58 0:00 nginx: worker process
Nginx运行CPU亲和力
好比4核配置
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000
好比8核配置
worker_processes 8;
worker_cpu_affinity 00000001 00000010 00000100 0000100000010000 00100000 01000000 10000000;
worker_processes最多开启8个,8个以上性能提高不会再提高了,并且稳定性变得更低,因此8个进程够用了。
Nginx最多能够打开文件数
worker_rlimit_nofile 65535;
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,可是nginx分配请求并非那么均匀,因此最好与ulimit -n的值保持一致。
注:
文件资源限制的配置能够在/etc/security/limits.conf设置,针对root/user等各个用户或者*表明全部用户来设置。
* soft nofile 65535
* hard nofile 65535
用户从新登陆生效(ulimit -n)
(2)Nginx事件处理模型
events {
use epoll;
worker_connections 65535;
multi_accept on;
}
nginx采用epoll事件模型,处理效率高
work_connections是单个worker进程容许客户端最大链接数,这个数值通常根据服务器性能和内存来制定,实际最大值就是worker进程数乘以work_connections
实际咱们填入一个65535,足够了,这些都算并发值,一个网站的并发达到这么大的数量,也算一个大站了!
multi_accept 告诉nginx收到一个新链接通知后接受尽量多的链接,默认是on,设置为on后,多个worker按串行方式来处理链接,也就是一个链接只有一个worker被唤醒,其余的处于休眠状态,设置为off后,多个worker按并行方式来处理链接,也就是一个链接会唤醒全部的worker,直到链接分配完毕,没有取得链接的继续休眠。当你的服务器链接数很少时,开启这个参数会让负载有必定的下降,可是当服务器的吞吐量很大时,为了效率,能够关闭这个参数。
(3)开启高效传输模式
http {
include mime.types;
default_type application/octet-stream;
……
sendfile on;
tcp_nopush on;
……
Include mime.types; //媒体类型,include 只是一个在当前文件中包含另外一个文件内容的指令
default_type application/octet-stream; //默认媒体类型足够
sendfile on;//开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,若是用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,下降系统的负载。
注意:若是图片显示不正常把这个改为off。
tcp_nopush on;必须在sendfile开启模式才有效,防止网路阻塞,积极的减小网络报文段的数量(将响应头和正文的开始部分一块儿发送,而不一个接一个的发送。)
(4)链接超时时间
主要目的是保护服务器资源,CPU,内存,控制链接数,由于创建链接也是须要消耗资源的
keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
server_tokens off;
client_max_body_size 10m;
keepalived_timeout客户端链接保持会话超时时间,超过这个时间,服务器断开这个连接
tcp_nodelay;也是防止网络阻塞,不过要包涵在keepalived参数才有效
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个能够根据你的系统分页大小来设置,通常一个请求头的大小不会超过 1k,不过因为通常系统分页都要大于1k,因此这里设置为分页大小。分页大小能够用命令getconf PAGESIZE取得。
open_file_cache max=102400 inactive=20s;
这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件
数一致,inactive 是指通过多长时间文件没被请求后删除缓存。
open_file_cache_valid 30s;
这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的inactive 参数时间内文件的最少使用次数,若是超过这个数字,文
件描述符一直是在缓存中打开的,如上例,若是有一个文件在inactive 时间内一次没被使用,它将被移除。
client_header_timeout设置请求头的超时时间。咱们也能够把这个设置低些,若是超过这个时间没有发送任何数据,nginx将返回request time out的错误
client_body_timeout设置请求体的超时时间。咱们也能够把这个设置低些,超过这个时间没有发送任何数据,和上面同样的错误提示
reset_timeout_connection 告诉nginx关闭不响应的客户端链接。这将会释放那个客户端所占有的内存空间。
send_timeout响应客户端超时时间,这个超时时间仅限于两个活动之间的时间,若是超过这个时间,客户端没有任何活动,nginx关闭链接
server_tokens 并不会让nginx执行的速度更快,但它能够关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。
client_max_body_size上传文件大小限制
(5)fastcgi调优
fastcgi_connect_timeout 600;
fastcgi_send_timeout 600;
fastcgi_read_timeout 600;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_temp_path/usr/local/nginx1.10/nginx_tmp;
fastcgi_intercept_errors on;
fastcgi_cache_path/usr/local/nginx1.10/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;
fastcgi_connect_timeout 600; #指定链接到后端FastCGI的超时时间。
fastcgi_send_timeout 600; #向FastCGI传送请求的超时时间。
fastcgi_read_timeout 600; #指定接收FastCGI应答的超时时间。
fastcgi_buffer_size 64k; #指定读取FastCGI应答第一部分须要用多大的缓冲区,默认的缓冲区大小为fastcgi_buffers指令中的每块大小,能够将这个值设置更小。
fastcgi_buffers 4 64k; #指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答请求,若是一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存,若是页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp_path指定的路径中,可是这并非好方法,由于内存中的数据处理速度要快于磁盘。通常这个值应该为站点中php脚本所产生的页面大小的中间值,若是站点大部分脚本所产生的页面大小为256KB,那么能够把这个值设置为“8 32K”、“4 64k”等。
fastcgi_busy_buffers_size 128k; #建议设置为fastcgi_buffers的两倍,繁忙时候的buffer
fastcgi_temp_file_write_size 128k; #在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,该数值设置小时若负载上来时可能报502BadGateway
fastcgi_temp_path #缓存临时目录
fastcgi_intercept_errors on;#这个指令指定是否传递4xx和5xx错误信息到客户端,或者容许nginx使用error_page处理错误信息。
注:静态文件不存在会返回404页面,可是php页面则返回空白页!!
fastcgi_cache_path /usr/local/nginx1.10/fastcgi_cachelevels=1:2 keys_zone=cache_fastcgi:128minactive=1d max_size=10g;# fastcgi_cache缓存目录,能够设置目录层级,好比1:2会生成16*256个子目录,cache_fastcgi是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提升访问速度),inactive表示默认失效时间,若是缓存数据在失效时间内没有被访问,将被删除,max_size表示最多用多少硬盘空间。
fastcgi_cache cache_fastcgi; #表示开启FastCGI缓存并为其指定一个名称。开启缓存很是有用,能够有效下降CPU的负载,而且防止502的错误放生。cache_fastcgi为proxy_cache_path指令建立的缓存区名称
fastcgi_cache_valid 200 302 1h; #用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一小时,要和fastcgi_cache配合使用
fastcgi_cache_valid 301 1d; #将301应答缓存一天
fastcgi_cache_valid any 1m; #将其余应答缓存为1分钟
fastcgi_cache_min_uses 1; #该指令用于设置通过多少次请求的相同URL将被缓存。
fastcgi_cache_key http://$host$request_uri; #该指令用来设置web缓存的Key值,nginx根据Key值md5哈希存储.通常根据$host(域名)、$request_uri(请求的路径)等变量组合成proxy_cache_key 。
fastcgi_pass #指定FastCGI服务器监听端口与地址,能够是本机或者其它
总结:
nginx的缓存功能有:proxy_cache / fastcgi_cache
proxy_cache的做用是缓存后端服务器的内容,多是任何内容,包括静态的和动态。
fastcgi_cache的做用是缓存fastcgi生成的内容,不少状况是php生成的动态的内容。
proxy_cache缓存减小了nginx与后端通讯的次数,节省了传输时间和后端宽带。
fastcgi_cache缓存减小了nginx与php的通讯的次数,更减轻了php和数据库(mysql)的压力。
CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。Fastcgi是用来提升CGI程序性能的。php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的
(6)gzip调优
使用gzip压缩功能,可能为咱们节约带宽,加快传输速度,有更好的体验,也为咱们节约成本,因此说这是一个重点。
Nginx启用压缩功能须要你来ngx_http_gzip_module模块,apache使用的是mod_deflate
通常咱们须要压缩的内容有:文本,js,html,css,对于图片,视频,flash什么的不压缩,同时也要注意,咱们使用gzip的功能是须要消耗CPU的!
gzip on;
gzip_min_length 2k;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_typestext/plain text/css text/javascriptapplication/json application/javascript application/x-javascriptapplication/xml;
gzip_vary on;
gzip_proxied any;
gzip on; #开启压缩功能
gzip_min_length 1k; #设置容许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,无论页面多大都进行压缩,建议设置成大于1K,若是小与1K可能会越压越大。
gzip_buffers 4 32k; #压缩缓冲区大小,表示申请4个单位为32K的内存做为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.1; #压缩版本,用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认便可
gzip_comp_level 6; #压缩比例,用来指定GZIP压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度快,可是处理慢,也比较消耗CPU资源。
gzip_types text/css text/xml application/javascript; #用来指定压缩的类型,‘text/html’类型老是会被压缩。
默认值: gzip_types text/html (默认不对js/css文件进行压缩)
# 压缩类型,匹配MIME��型进行压缩
# 不能用通配符 text/*
# (不管是否指定)text/html默认已经压缩
# 设置哪压缩种文本文件可参考 conf/mime.types
gzip_vary on; #varyheader支持,改选项可让前端的缓存服务器缓存通过GZIP压缩的页面,例如用Squid缓存通过nginx压缩的数据
(7)expires缓存调优
缓存,主要针对于图片,css,js等元素更改机会比较少的状况下使用,特别是图片,占用带宽大,咱们彻底能够设置图片在浏览器本地缓存365d,css,js,html能够缓存个10来天,这样用户第一次打开加载慢一点,第二次,就很是快了!缓存的时候,咱们须要将须要缓存的拓展名列出来, Expires缓存配置在server字段里面
location ~* \.(ico|jpe?g|gif|png|bmp|swf|flv)$ {
expires 30d;
#log_not_found off;
access_log off;
}
location ~* \.(js|css)$ {
expires 7d;
log_not_found off;
access_log off;
}
注:log_not_found off;是否在error_log中记录不存在的错误。默认是。
总结:
expire功能优势 (1)expires能够下降网站购买的带宽,节约成本(2)同时提高用户访问体验(3)减轻服务的压力,节约服务器成本,是web服务很是重要的功能。 expire功能缺点:被缓存的页面或数据更新了,用户看到的可能仍是旧的内容,反而影响用户体验。解决办法:第一个缩短缓存时间,例如:1天,但不完全,除非更新频率大于1天;第二个对缓存的对象更名。
网站不但愿被缓存的内容 1)网站流量统计工具2)更新频繁的文件(google的logo)
(8)防盗链
防止别人直接从你网站引用图片等连接,消耗了你的资源和网络流量,那么咱们的解决办法由几种: 1:水印,品牌宣传,你的带宽,服务器足够 2:防火墙,直接控制,前提是你知道IP来源 3:防盗链策略下面的方法是直接给予404的错误提示
location ~*^.+\.(jpg|gif|png|swf|flv|wma|wmv|asf|mp3|mmf|zip|rar)$ {
valid_referers noneblocked www.benet.com benet.com;
if($invalid_referer) {
#return 302 http://www.benet.com/img/nolink.jpg;
return 404;
break;
}
access_log off;
}
参数可使以下形式:
none 意思是不存在的Referer头(表示空的,也就是直接访问,好比直接在浏览器打开一个图片)
blocked 意为根据防火墙假装Referer头,如:“Referer:XXXXXXX”。
server_names 为一个或多个服务器的列表,0.5.33版本之后能够在名称中使用“*”通配符。
(9)内核参数优化
fs.file-max = 999999:这个参数表示进程(好比一个worker进程)能够同时打开的最大句柄数,这个参数直线限制最大并发链接数,需根据实际状况配置。
net.ipv4.tcp_max_tw_buckets = 6000 #这个参数表示操做系统容许TIME_WAIT套接字数量的最大值,若是超过这个数字,TIME_WAIT套接字将马上被清除并打印警告信息。该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。
注:主动关闭链接的服务端会产生TIME_WAIT状态的链接
net.ipv4.ip_local_port_range = 1024 65000 #容许系统打开的端口范围。
net.ipv4.tcp_tw_recycle = 1#启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1#开启重用。容许将TIME-WAIT sockets从新用于新的TCP链接。这对于服务器来讲颇有意义,由于服务器上总会有大量TIME-WAIT状态的链接。
net.ipv4.tcp_keepalive_time = 30:这个参数表示当keepalive启用时,TCP发送keepalive消息的频度。默认是2小时,若将其设置的小一些,能够更快地清理无效的链接。
net.ipv4.tcp_syncookies = 1#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.core.somaxconn = 40960 #web 应用中 listen 函数的 backlog 默认会给咱们内核参数的 net.core.somaxconn 限制到128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,因此有必要调整这个值。
注:对于一个TCP链接,Server与Client须要经过三次握手来创建网络链接.当三次握手成功后,咱们能够看到端口的状态由LISTEN转变为ESTABLISHED,接着这条链路上就能够开始传送数据了.每个处于监听(Listen)状态的端口,都有本身的监听队列.监听队列的长度与如somaxconn参数和使用该端口的程序中listen()函数有关
somaxconn参数:定义了系统中每个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个常常处理新链接的高负载 web服务环境来讲,默认的 128 过小了。大多数环境这个值建议增长到 1024 或者更多。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。
net.core.netdev_max_backlog = 262144 #每一个网络接口接收数据包的速率比内核处理这些包的速率快时,容许送到队列的数据包的最大数目。
net.ipv4.tcp_max_syn_backlog = 262144 #这个参数标示TCP三次握手创建阶段接受SYN请求队列的最大长度,默认为1024,将其设置得大一些可使出现Nginx繁忙来不及accept新链接的状况时,Linux不至于丢失客户端发起的链接请求。
net.ipv4.tcp_rmem = 10240 87380 12582912#这个参数定义了TCP接受缓存(用于TCP接受滑动窗口)的最小值、默认值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912:这个参数定义了TCP发送缓存(用于TCP发送滑动窗口)的最小值、默认值、最大值。
net.core.rmem_default = 6291456:这个参数表示内核套接字接受缓存区默认的大小。
net.core.wmem_default = 6291456:这个参数表示内核套接字发送缓存区默认的大小。
net.core.rmem_max = 12582912:这个参数表示内核套接字接受缓存区的最大大小。
net.core.wmem_max = 12582912:这个参数表示内核套接字发送缓存区的最大大小。
net.ipv4.tcp_syncookies = 1:该参数与性能无关,用于解决TCP的SYN攻击。
下面贴一个完整的内核优化设置:
fs.file-max = 999999
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 10240 87380 12582912
net.ipv4.tcp_wmem = 10240 87380 12582912
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 40960
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
执行sysctl -p使内核修改生效
(10)关于系统链接数的优化:
linux 默认值 open files为1024
#ulimit -n
1024
说明server只容许同时打开1024个文件
使用ulimit -a 能够查看当前系统的全部限制值,使用ulimit -n 能够查看当前的最大打开文件数。
新装的linux 默认只有1024 ,看成负载较大的服务器时,很容易遇到error: too many open files。所以,须要将其改大
在/etc/security/limits.conf最后增长:
* soft nofile 65535
* hard nofile 65535
* soft noproc 65535
* hard noproc 65535
Nginx的配置是以模块为单位来组织的,每个模块包含一个或多个指令,指令是配置文件中的最小配置单元,一切配置项皆为指令。如http核心模块中的include、default_type、sendfile指令,都属于http模块。nginx全部模块中的指令见官方文档说明:http://nginx.org/en/docs/dirindex.html
注意:如下配置中的“上下文”表示指令能够配置在哪些模块中。 main:顶层配置,约束服务器的行为
指令 | 上下文 | 语法 | 默认值 | 功能描述 |
---|---|---|---|---|
user | main | user nobody nobyd; | nobody | 以哪一个用户权限运行工做线程 |
daemon | main | daemon yes; | yes | nginx是否以守护进程运行 |
worker_processes | main | worker_processes number; | 1 | 配置工做进程数。传统的web服务器(如apache)都是同步阻塞模型,一请求一进(线)程模式,当进(线)程数增达到必定程度后,更多CPU时间浪费在线程和进程切换当中,性能急剧降低,因此负载率不高。Nginx是基于事件的非阻塞多路复用(epoll或kquene)模型,一个进程在短期内就能够响应大量的请求。建议将该值设置<=cpu核心数量,通常高于cpu核心数量不会带来好处,反而可能会有进程切换开销的负面影响。 |
worker_connections | events | worker_connections number; | 1024 | 并发响应能力的关键配置值,表示每一个进程容许的最大同时链接数。maxConnection = work_connections * worker_processes;通常一个浏览器会同时开两条链接,若是是反向代理,nginx到后服务器的链接数量也要占用2条链接数,因此,作静态服务器,通常maxConnection = work_connections * worker_processes / 2; 作反代理服务器时maxConnection = work_connections * worker_processes / 4; |
use | events | use epoll; | 根据不一样的平台,选择最高效的链接处理方法 | 指定处理链接请求的方法。linux内核2.6以上默认使用epoll方法,其它平台请参考:http://nginx.org/en/docs/events.html 备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数 |
worker_cpu_affinity | main | worker_cpu_affinity cpumask …; | 无 | 将工做进程绑定到特定的CPU上,减小CPU在进程之间切换的开销。用二进制bit位表示进程绑定在哪一个CPU内核。如8内核4进程时的设置方法:worker_cpu_affinity 00000001 00000010 00000100 10000000 |
worker_rlimit_nofile | main | worker_rlimit_core size; | 受linux内核文件描述符数量限制 | 设置nginx最大能打开的文件描述符数量。由于Linux对每一个进程所能打开的文件描述数量是有限制的,默认通常是1024个,可经过ulimit -n FILECNT或/etc/securit/limits.conf配置修改linux默认能打开的文件句柄数限制。建议值为:系统最大数量/进程数。但进程间工做量并非平均分配的,因此能够设置在大一些。推荐值为:655350 |
error_log | main, http, mail, stream, server, location | error_log 日志文件路径 日志级别; | error_log logs/error.log error; | 配置错误日志文件的路径和日志级别。日志级别有debug, info, notice, warn, error, crit, alert和emerg几种。nginx的日志使用syslog输出,因此输出的日志格式是有规律的,系统运维人员能够根据日志规则进行查错或统计分析。更多说明请参考官方文档:http://nginx.org/en/docs/ngx_core_module.html#error_log |
pid | main | pid 守护进程socket文件路径; | pid logs/nginx.pid | 配置nginx守护进程ID存储文件路径(不是工做进程) |
以上是nginx的顶层配置,管理服务器级别的行为。更多配置请参考官方文档:http://nginx.org/en/docs/ngx_core_module.html#working_directory
nginx作为一个HTTP反向代理服务器,平时接触得最多的应该是针对http请求的相关配置了,和http模块有关的全部配置都放在http { ... }
配置中。
指令 | 上下文 | 语法 | 功能描述 |
---|---|---|---|
types | http, server, location | types { mime类型 文件后缀;}; | 配置能处理的文件类型。如:text/html html htm shtml; |
include | any | include 文件路径; | 将外部文件的内容作为配置拷贝到nginx.conf文件中。如:include mime.type; 将当前目录下的mime.type配置文件拷贝到nginx配置文件中。文件路径能够是相对路径或绝对路径。文件名能够用*来表示通配符。 |
default_type | http, server, location | default_type mime类型; | 文件名到后缀的映射关系。配置默认的mime类型,当在types指令中找不到请求的文件类型时,就使用default_type指定的类型。默认为text/plain类型。 |
access_log | http, server, location, if in location, limit_except | access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; |
关闭或开启访问日志。默认配置为:access_log logs/access.log combined; 表示根据combined定义的日志格式,写入logs/access.log文件中,combined是http模块默认格式。若是定义了buffer和gzip其中一个参数,日志默认会先写入缓存中,当缓存满了以后,经过gzip压缩缓存中的日志并写入文件,启用了gzip压缩必须保证nginx安装的时候添加了gzip模块。缓存大小默认为64K。能够配置gzip的1~9的压缩级别,级别越高压缩效率越大,日志文件占用的空间越小,但要求系统性能也越高。默认值是1。http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log |
log_format | http | log_format 格式名称 日志格式; | 定义http访问日志的格式,在日志格式中能够访问http模块的内嵌变量,若是变存在的话,会作为日志输出。如:remoteaddr,remoteaddr,request等,更多变量请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#variables |
sendfile | http, server, location, if in location | sendfile on | off; | 启用内核复制模式。做为静态服务器能够提升最大的IO访问速度。传统的文件读写采用read和write方式,流程为:硬盘 >> kernel buffer >> user buffer>> kernel socket buffer >>协议栈,采用sendfile文件读写的流程为:硬盘 >> kernel buffer (快速拷贝到kernelsocket buffer) >>协议栈,很明显sendfile这个系统调用减小了内核到用户模式之间的切换和数据拷贝次数,直接从内核缓存的数据拷贝到协议栈,提升了很大的效率。这篇文章介绍比较详细:http://xiaorui.cc/?p=1673 |
tcp_nodelay | http, server, location | off|on; | |
tcp_nopush | http, server, location | off|on; | tcp_nodelay和tcp_nopush这两个参数是配合使用的,启动这两项配置,会在数据包达到必定大小后再发送数据。这样会减小网络通讯次数,下降阻塞几率,但也会影响响应及时性。比较适合于文件下载这类的大数据通讯场景。 |
keepalive_timeout | http, server, location | keepalive_time 65; | 客户端到服务器创建链接的超时时长,超过指定的时间服务器就会断开链接。默认为75秒。下降每一个链接的alive时间可在必定程度上提升可响应链接数量,因此通常可适当下降此值 |
gzip | http, server, location, if in location | gzip on | off; | 开启内容压缩,能够有效下降客户端的访问流量和网络带宽 |
gzip_min_length | http, server, location | gzip_min_length length; | 单位为k,默认为20k。内容超过最少长度后才开启压缩,由于过短的内容压缩效果不佳,且压缩过程还会浪费系统资源。这个压缩长度会做为http响应头Content-Length字段返回给客户端。 建议值:1000 |
gzip_comp_level | http, server, location | gzip_comp_level 1~9; | 压缩级别,默认值为1。范围为1~9级,压缩级别越高压缩率越高,但对系统性能要求越高。建议值:4 |
gzip_types | http, server, location | gzip_types mime-type …; | 压缩内容类型,默认为text/html;。只压缩html文本,通常咱们都会压缩js、css、json之类的,能够把这些常见的文本数据都配上。如:text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; |
open_file_cache | http, server, location | open_file_cache off; open_file_cache max=N [inactive=time]; | 默认值为off; 设置最大缓存数量,及缓存文件未使用的存活期。建议值:max=655350(和worker_rlimit_nofile参数一致) inactive=20s; |
open_file_ cache_min_uses |
http, server, location | open_file_cache_min_uses number; | 默认为1,有效期内文件最少使有的次数。建议值:2 |
open_file _cache_valid |
http, server, location | open_file_cache_valid time; | 默认为60s,验证缓存有效期时间间隔。 表示每隔60s检查一下缓存的文件当中,有哪些文件在20s之内没有使用超过2次的,就从缓存中删除。采用lru算法。 |
server | server { … } | http | HTTP服务器的核心配置,用于配置HTTP服务器的虚拟主机,能够配置多个 |
listen | listen ip[:端口] | server | 配置虚拟主机监听的IP地址和端口,默认监听本机IP地址和80或8000端口。若是只设置了IP没设端口,默认使用80端口。若是只设置了端口,没设置IP默认使用本机IP。详细配置请参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#listen |
server_name | server_name domain_name …; | server | 配置虚拟主机的域名,能够指定多个,用空格分隔。默认为空 |
charset | http, server, location, if in location | charset charset | off; | 设置请求编码,和url参数乱码问题有关。 |
location | server, location | location [ = | ~ | ~* | ^~ ] uri { … } location @name { … } |
http请求中的一个重要配置项,用于配置客户端请求服务器url地址的匹配规则。能够配置多个匹配规则 |
# nginx不一样于apache服务器,当进行了大量优化设置后会魔术般的明显性能提高效果 # nginx在安装完成后,大部分参数就已是最优化了,咱们须要管理的东西并很少 #user nobody; #阻塞和非阻塞网络模型: #同步阻塞模型,一请求一进(线)程,当进(线)程增长到必定程度后 #更多CPU时间浪费到切换一,性能急剧降低,因此负载率不高 #Nginx基于事件的非阻塞多路复用(epoll或kquene)模型 #一个进程在短期内能够响应大量的请求 #建议值 <= cpu核心数量,通常高于cpu数量不会带好处,也许还有进程切换开销的负面影响 worker_processes 4; #将work process绑定到特定cpu上,避免进程在cpu间切换的开销 worker_cpu_affinity 0001 0010 0100 1000 #8内核4进程时的设置方法 worker_cpu_affinity 00000001 00000010 00000100 10000000 # 每进程最大可打开文件描述符数量(linux上文件描述符比较广义,网络端口、设备、磁盘文件都是) # 文件描述符用完了,新的链接会被拒绝,产生502类错误 # linux最大可打开文件数可经过ulimit -n FILECNT或 /etc/security/limits.conf配置 # 理论值 系统最大数量 / 进程数。但进程间工做量并非平均分配的,因此能够设置的大一些 worker_rlimit_nofile 65535; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { # 并发响应能力的关键配置值 # 每一个进程容许的最大同时链接数,work_connectins * worker_processes = maxConnection; # 要注意maxConnections不等同于可响应的用户数量, # 由于通常一个浏览器会同时开两条链接,若是反向代理,nginx到后端服务器的链接也要占用链接数 # 因此,作静态服务器时,通常 maxClient = work_connectins * worker_processes / 2 # 作反向代理服务器时 maxClient = work_connectins * worker_processes / 4 # 这个值理论上越大越好,但最多可承受多少请求与配件和网络相关,也可最大可打开文件,最大可用sockets数量(约64K)有关 worker_connections 65535; # 指明使用epoll 或 kquene (*BSD) use epoll; # 备注:要达到超高负载下最好的网络响应能力,还有必要优化与网络相关的linux内核参数 } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; # 关闭此项可减小IO开销,但也没法记录访问信息,不利用业务分析,通常运维状况不建议使用 access_log off # 只记录更为严重的错误日志,可减小IO压力 error_log logs/error.log crit; #access_log logs/access.log main; # 启用内核复制模式,应该保持开启达到最快IO效率 sendfile on; # 简单说,启动以下两项配置,会在数据包达到必定大小后再发送数据 # 这样会减小网络通讯次数,下降阻塞几率,但也会影响响应及时性 # 比较适合于文件下载这类的大数据包通讯场景 #tcp_nopush on; 在 #tcp_nodelay on|off on禁用Nagle算法 #keepalive_timeout 0; # HTTP1.1支持持久链接alive # 下降每一个链接的alive时间可在必定程度上提升可响应链接数量,因此通常可适当下降此值 keepalive_timeout 30s; # 启动内容压缩,有效下降网络流量 gzip on; # 太短的内容压缩效果不佳,压缩过程还会浪费系统资源 gzip_min_length 1000; # 可选值1~9,压缩级别越高压缩率越高,但对系统性能要求越高 gzip_comp_level 4; # 压缩的内容类别 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; # 静态文件缓存 # 最大缓存数量,文件未使用存活期 open_file_cache max=65535 inactive=20s; # 验证缓存有效期时间间隔 open_file_cache_valid 30s; # 有效期内文件最少使用次数 open_file_cache_min_uses 2; server { listen 80; server_name localhost; charset utf-8; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } ... } ... }
1. gzip压缩优化 2. expires缓存有还 3. 网络IO事件模型优化 4. 隐藏软件名称和版本号 5. 防盗链优化 6. 禁止恶意域名解析 7. 禁止经过IP地址访问网站 8. HTTP请求方法优化 9. 防DOS攻击单IP并发链接的控制,与链接速率控制 10. 严格设置web站点目录的权限 11. 将nginx进程以及站点运行于监牢模式 12. 经过robot协议以及HTTP_USER_AGENT防爬虫优化 13. 配置错误页面根据错误码指定网页反馈给用户 14. nginx日志相关优化访问日志切割轮询,不记录指定元素日志、最小化日志目录权限 15. 限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件 16. FastCGI参数buffer和cache配置文件的优化 17. php.ini和php-fpm.conf配置文件的优化 18. 有关web服务的Linux内核方面深度优化(网络链接、IO、内存等) 19. nginx加密传输优化(SSL) 20. web服务器磁盘挂载及网络文件系统的优化 21. 使用nginx cache
通常来讲,软件的漏洞都和版本相关,因此咱们要隐藏或消除web服务对访问用户显示的各类敏感信息。
1 [root@db01 rpm]# curl -I 10.0.0.8 2 HTTP/1.1 401 Unauthorized 3 Server: nginx #隐藏版本号 4 Date: Thu, 21 Jul 2016 03:23:38 GMT 5 Content-Type: text/html 6 Content-Length: 188 7 Connection: keep-alive 8 WWW-Authenticate: Basic realm="oldboy training" 9 过程: 10 vim /application/nginx/conf/nginx.conf 11 在http模块下加入: 12 server_tokens off; 13 /application/nginx/sbin/nginx -t 14 /application/nginx/sbin/nginx -s reload
要修改内容的路径:
第一路径:
1 /home/oldboy/tools/nginx-1.6.3/src/core/nginx.h 第14,16行 2 #define NGINX_VERSION "1.6.2" 修改成想要的版本号如2.4.3 3 #define NGINX_VER "nginx/" NGINX_VERSION 将nginx修改成想要修改的软件名称,如Apache。
第二路径
1 /home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_header_filter_module.c第49行 2 grep 'Server:nginx' ngx_http_header_filter_module.cstatic 3 sed -i 's#Server:nginx#Server:Apache#g' ngx_http_header_filter_module.c
第三路径
/home/oldboy/tools/nginx-1.6.3/src/http/ngx_http_special_response.c第21,30行 "<hr><center>"NGINX_VER "(http://oldboy.blog.51cto.com)</center>" CRLF "<hr><center>OWS</center>" CRLF
而后从新编译
第一种方法:
直接更改配置文件nginx.conf.default参数,将默认的#user nobody;改成user nginx.nginx;
第二种方法:
直接在编译nginx的时候指定用户和用户组命令以下:
./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module
1 useradd inca 2 cd /home/inca/ 3 mkdir conf logs www 4 echo inca >www/index.html 5 chown -R inca.inca * 6 ln -s /application/nginx/conf/mime.types conf/mime.types #mime.types媒体类型文件
egrep -v "#|^$" /application/nginx/conf/nginx.conf.default >conf/nginx.conf
nginx.conf配置文件
worker_processes 1; error_log /home/inca/logs/error.log; pid /home/inca/logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 8080; server_name localhost; location / { root /home/inca/www; index index.html index.htm; } access_log /home/inca/logs/access.log main; } }
su - inca -c "/application/nginx/sbin/nginx -c /home/inca/conf/nginx.conf" #启动nginx服务
重点强调:
1.nginx.conf里面的相关路径都要更改
2.普通用户的端口问题
在高并发、高访问量的web服务场景,须要事先启动好更多的nginx进程,以保证快速响应并处理大量并发用户的请求。
worker_processes 1;通常调整到与CPU的颗数相同
(1)查看LInux可查看CPU个数及总核数
grep processor /proc/cpuinfo|wc -l
(2)查看CPU总颗数
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
(3)经过执行top命令,而后按数字1,便可显示全部的CPU核数
top 按1键就会显示第一个的信息 Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0
默认状况下,nginx的进程跑在某一个CPU或CPU的某一个核上,致使nginx进程使用硬件的资源不均,本节的优化是不一样的nginx进程给不一样的CPU处理,充分有效的利用有效的硬件资源
四核cpu配置
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
双核配置
worker_processes 2; worker_cpu_affinity 0101 1010;
还有一个命令taskset -c用来分配服务给CPU
nginx的链接处理机制在于不一样的操做系统会采用不一样的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。
要根据系统类型不一样选择不一样的事务处理模型,选择有“use [ kqueue | rtsig |epool |dev/pool |select |pllo ];”咱们使用的是Centos6.5的linux,所以将nginx的事件处理模型调整为epool模型。
events { worker_connections 1024; use epoll; }
官方说明:在不指定事件处理模型时,nginx默认会自动的选择最佳的事件处理模型服务
参数语法:worker_connections number
默认配置:worker_connections 512
放置位置:events 标签
events { worker_connections 1024; #一个worker进程的并发 }
总并发= worker_processes* worker_connections
参数语法:worker_rlimit_nofile number
放置位置:主标签段
说明:做用是改变worker processes能打开的最大文件数
worker_rlimit_nofile 65535;
这各参数受系统文件的最大打开数限制,解决方法:
[root@admin nginx]# cat /proc/sys/fs/file-max 8192
文件系统最大可打开文件数
[root@admin nginx]# ulimit -n 1024
程序限制只能打开1024个文件
使用# ulimit -n 8192调整一下
或者永久调整打开文件数 可在启动文件/etc/rc.d/rc.local末尾添加(在/etc/sysctl.conf末尾添加fs.file-max=xxx无效)
设置参数 sendfile on;
sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘i/o阻塞,提高nginx工做效率。
http { sendfile on; #放在http,server,location均可以 }
设置参数tcp_nopush;
激活tcp_nopush参数能够容许把httpresponse header和文件的开始放在一个文件里发布,积极的做用是减小网络报文段的数量(只有sendfile on开启才生效)
例: sendfile on; tcp_nopush on; tcp_nodelay on; server_tokens off; server_names_hash_bucket_size 128; server_names_hash_max_size 512; keepalive_timeout 65; client_header_timeout 15s; client_body_timeout 15s; send_timeout 60s;
fastcgi参数是配合nginx向后请求PHP动态引擎服务的相关参数。
fastcgi_connect_timeout 240; fastcgi_send_timeout 240; fastcgi_read_timeout 240; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; #fastcgi_temp_path /data/ngx_fcgi_tmp; fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
nginx压缩功能的介绍:
nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送给客户端以前,nginx服务器会根据一些具体的策略实施压缩,以节省网站出口带宽,同时加快了数据传输效率,提高了用户的访问体验。
提高网站用户体验:因为发给用户的内容小了,因此用户访问单位大小的页面就快了,用户体验就提高了
节约网站带宽成本:因为数据时压缩传输的,所以,会消耗一些cpu资源
纯文本内容压缩比很高,所以,纯文本的内容最好要压缩
被压缩的纯文本文件必需要大于1KB,因为压缩算法的特殊缘由,极小的文件压缩反而变大
图片、视频(流媒体)等文件尽可能不要压缩,由于这些文件大多都是通过压缩的,若是再压缩极可能不会减少或减少不多,或者有可能增大,而在压缩时还会消耗大量的CPU、内存资源
gzip on; #表示开启压缩功能
gzip_min_length 1k; #表示容许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,表示无论页面多大都进行压缩,建议设置成大于1K。若是小于1K可能会越压越大
gzip_buffers 4 32k; #压缩缓存区大小
gzip_http_version 1.1; #压缩版本
gzip_comp_level 9; #压缩比率
gzip_types text/css text/xml application/javascript; #指定压缩的类型
gzip_vary on; #vary header支持
完美配置:
nginx.conf http模块 gzip on; gzip_min_length 1k; gzip_buffers 4 32k; gzip_http_version 1.1; gzip_comp_level 9; gzip_types text/css text/xml application/javascript; gzip_vary on;
为用户访问网站的内容设定一个过时时间,当用户第一次访问到这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站,浏览器就会检查已经缓存在用户浏览器本地的内容,就不会去浏览器下载了,直到缓存的内容过时或者被清除为止。
expires能够下降网站的带宽,节约成本
加快用户访问网站的速度,提高了用户访问体验
服务器访问量下降,服务器压力就减轻了,服务器的成本也会下降,甚至能够节约人力成本
几乎对于全部web服务来讲,这是很是重要的功能之一,apache服务也有此功能。
## Add expires header according to URI(path or dir). location ~ ^/(images|javascript|js|css|flash|media|static)/ { expires 360d; }
当网站被缓存的页面或数据更新了,此时用户端看到的可能仍是旧的已经缓存的内容,这样就会影响用户体验,那么如何解决这个问题呢?
第一:对于常常须要的变更图片等文件,能够缩短对象缓存时间,例如,百度、谷歌等网站的首页图片常常会换成一些节日的图,这里能够将缓存期修改成1天
第二:当网站改版或更新内容时,能够在服务器将缓存的对象更名(网站代码程序)
对于网站的图片、附件,通常不会被用户直接修改,用户层面上的修改图片,其实是从新传到服务器,虽然内容同样可是一个新的图片名了
网站改版升级会修改JS、CSS元素,若改版的时候对这些元素改了名,会使得前端的CDN以及用户端须要从新缓存内容
编写脚本实现nginx access日志轮询
用户咋请求一个软件时,绝大多数软件都会记录用户的访问状况,nginx软件目前没有相似apache经过cronolog或者rotatelog对日志分隔处理的功能,可是,运维人员能够经过利用脚本开发、nginx的信号控制功能或reload从新加载,来实现日志的自动切割、轮询。
操做步骤:
写一个定时任务
mv www_access.log www_access_$(date +F -d -1day).log /applocation/nginx/sbin/nginx -s reload
在实际工做中,对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,通常不须要记录下来,由于在统计PV时是按照页面计算的,并且日志写入的太频繁会消耗磁盘i/o,下降服务的性能
具体配制方法: location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ { access_log off; }
假如日志目录为/app/logs,则受权方法为:
chown -R root.root /app/logs chmod -R 600 /app/logs
不须要在日志目录上给nginx用户读写或者读写许可,不少人都没有注意这个问题,这就称为了安全隐患。
web2.0时代,绝大多数网站都是以用户为中心的,这些产品有一些共同点,就是不容许用户发布内容到服务器,还容许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。
下面将利用nginx配置禁止访问上传资源目录下的PHP,SHELL,PERL,PYTHON程序文件,这样就算是用户上传了木马文件也没办法执行
1 location ~ ^/images/.*\.(php|php5|.sh|.pl|.py)$ 2 { 3 deny all; 4 } 5 location ~ ^/static/.*\.(php|php5|.sh|.pl|.py)$ 6 { 7 deny all; 8 } 9 location ~* ^/data/(attachment|avatar)/.*\.(php|php5)$ 10 { 11 deny all; 12 }
对于上述目录的限制必须写在nginx处理PHP服务配置的前面
配置禁止访问指定的单个或多个目录
location ~ ^/(static)/ { deny all; } location ~ ^/static { deny all; }
禁止访问目录而且返回代码404
server { listen 80; server_name www.etiantian.org etiantian.org; root /data0/www/www; index index.html index.htm; access_log /app/logs/www_access.log commonlog; location /admin/ { return 404; } location /templates/ { return 403; } }
使用ngx_http_access_module限制网站来源IP访问。
范例1:禁止外界访问,但容许某个IP访问该目录
location ~ ^/oldboy/ { allow 202.111.12.211; deny all; }
范例2:限制及指定IP或IP段访问。
location / { deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; deny all; }
问题:nginx如何防止用户IP访问网站(恶意域名解析,至关于直接使用IP访问网站)
方法1:直接报错,用户体验很差
server { listen 80 default_server; server_name _; return 501; }
方法2:经过301跳转到主页
server { listen 80 default_server; server_name _; rewrite ^(.*) http//:blog.etiantian.org/$1 permanent; }
简单的说,没有通过你的容许在本身网站嵌入你的图片。
被盗链的网站配置
1 #Preventing hot linking of images and other file types 2 3 location ~* ^.+\.(jpg|png|swf|flv|rar|zip)$ { 4 5 valid_referers none blocked *.etiantian.org etiantian.org; 6 7 if ($invalid_referer) { 8 9 rewrite ^/ http://bbs.etiantian.org/img/nolink.gif; 10 11 } 12 13 root html/www; 14 15 }
范例:当出现403错误会跳转到403.html页面
error_page 403 /403.html;
8. 部署网站程序权限设置
(1)wordpress站点目录权限设置
方案1:推荐方案
目录:755
文件:644
全部者:root
图片及上传目录设置全部者为www
cd /application/apache/html/ chown -R root.root blog find ./blog/ -type f|xargs chmod 644 find ./blog/ -type d|xargs chmod 755
配置
if ($http_user_agent ~* LWP:Simple|BBBike|wget) { return 403 ; rewrite ^(.*) http://blog.etiantian.org/$1 permanent; }
配置:
if ($request_method !~ ^(GET|HEAD|POST)$ ) { return 501; }
配置上传服务器限制HTTP的GET的配置
#Only allow these request methods ## if ($request_method ~*(GET)$ ) { return 501; }
本地Cache加速 提升了企业站点(尤为含有大量图片和静态页面站点)的访问速度,并大大提升以上性质站点的稳定性
镜像服务 消除了不一样运营商之间互联的瓶颈形成的影响,实现了跨运营商的网络加速,保证不一样网络中的用户都能获得良好的访问质量。
远程加速 远程访问用户根据DNS负载均衡技术智能自动选择Cache服务器,选择最快的Cache服务器,加快远程访问的速度
带宽优化 自动生成服务器的远程Mirror(镜像)cache服务器,远程用户访问时从cache服务器上读取数据,减小远程访问的带宽、分担网络流量、减轻原站点WEB服务器负载等功能。
集群抗攻击 普遍分布的CDN节点加上节点之间的智能冗余机制,能够有效地预防黑客入侵以及下降各类D.D.o.S攻击对网站的影响,同时保证较好的服务质量 。
解决方案
给Nginx服务降权,用普通用户跑Nginx服务,给开发及运维设置普通帐号
开发人员使用普通帐号便可管理nginx服务及站点下的程序和日志
责任划分:网络问题:运维责任,网站打不开开发责任。(共同承担)
实战配置:
useradd inca cd /home/inca mkdir conf www log echo inca >www/index.html
修改配置文件
error_log /home/inca/log/error.log pid /home/inca/log/nginx.pid
ngx_http_limit_conn_module这个模块用于限制每一个定义key值得链接数,特别是单个TP的链接数。
不是全部的链接数都会被计算。一个符合计数要求的链接是整个请求头已经被读取的链接。
控制Nginx并发链接数量参数的说明
1)limit_conn_zone参数:
语法:limit_conn_zone key zone=name:size;
上下文:http
用于设置共享内存区域,key能够是字符串、Nginx自带变量或前两个组合。name为内存区域的名称,size为内存区域的大小。
2)limit_conn参数
语法:limit_conn zone number;
上下文:http、server、location
用于指定key设置最大链接数。当超时最大链接数时,服务器会返回503报错。
ngx_http_limit_req_module模块用于限制每一个IP访问每一个定义key的请求速率。
limit_req_zone参数说明以下。
语法:limit_req_zone key zone=name:size rate=rate;
上下文:http
用于设置共享内存区域,key能够是字符串,Nginx自带变量或前两个组合。name为内存区域的名称,size为内存区域的大小,rate为速率,单位为r/s,每秒一个请求。
limit_req参数说明以下:
语法:limit_req zone=name [burst-number] [nobelay] 上下文:http、server、location 这里运用了令牌桶原理,burst=num,一个有num快令牌,令牌发完后,多出来的那些请求就会返回503。 nodelay默认在不超过burst值得前提下会排队等待处理,若是使用此参数,就会处理完num+1次请求,剩余的请求为超时,返回503。