示例:在高并发、高访问量的Web服务场景中,需要事先启动好更多的Nginx进程,以保证快速响应并处理大量并发用户的请求。
代码如下(示例):
worker_processes 1; #<==指定了Nginx要开启的进程数,结尾的数字就是进程的个
worker_processes参数大小的设置最好和网站的用户数量相关联,可如果是新配置,不知道网站的用户数量时该怎么办呢?
搭建服务器时,worker进程数最开始的设置可以等于CPU的核数,且worker进程数要多一些,这样起始提供服务时就不会出现因为访问量快速增加而需要临时启动新进程提供服务的问题,缩短了系统的瞬时开销和提供服务的时间,提升了服务用户的速度。
高流量高并发场合也可以考虑将进程数提高至CPU核数×2
通过/proc/cpuinfo可查看CPU的个数及总核数。查看CPU总核数的示例如下:
[caomz@node~]$ grep processor /proc/cpuinfo|wc -l
4 #<==表示为1颗CPU四核
[caomz@node~]# grep -c processor /proc/cpuinfo
4 #<==表示为1颗CPU四核
查看CPU总颗数的示例
grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
1 #<==对physical id去重计数,表示1颗CPU
假设服务器的CPU颗数为1颗,核数为4核,则初始的配置可通过查看默认的nginx.conf里的worker_processes数来了解,命令如下:
grep worker_processes nginx.conf
worker_processes 1;
修改为 worker_processes 4;
worker的进程数为4个。Nginx Master主进程不包含在这个参数内,Nginx Master的主进程为管理进程,负责调度和管理worker进程。
默认情况下,Nginx的多个进程有可能运行在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
#<== worker_cpu_affinity就是配置Nginx进程与CPU亲和力的参数,即把不同的进程分给不同的CPU处理。这里0001 0010 0100 1000是掩码,分别代表第1、2、3、4核CPU,由于worker_processes进程数为4,因此,上述配置会为每个进程分配一核CPU处理,默认情况下进程不会绑定任何CPU,参数位置为main段
八核CPU服务器的参数配置参考如下:
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
worker_cpu_affinity参数的官方说明如下:
syntax: worker_cpu_affinity cpumask ...; #<==此行为CPU亲和力参数语法,
?cpumask为CPU掩码
default: — #<==默认不设置
context: main #<==此行为worker_cpu_affinity
?参数可以放置的位置
Nginx的连接处理机制在不同的操作系统中会采用不同的I/O模型,在Linux下,Nginx使用epoll的I/O多路复用模型
events
#<==events指令是设定Nginx的工作模式及连接数上限
{
use epoll;
#<==use是一个事件模块指令,用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统Linux 2.6+的内核,推荐选择epoll工作模式,这是高性能高并发的设置}
events #<==events指令是设定Nginx的工作模式及连接数上限
{worker_connections 20480;#<==worker_connections也是个事件模块指令,用于定义Ngi
nx
每个进程的最大连接数,默认是1024。最大客户端连接
数由worker_processes和worker_connections决定,即Max_client= wo
rk
er_processes*worker_connec
tions。 进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -HSn 65535”或配
置相
应文件后,worker_connections的设置
才能生
下面是worker_connections的官方说明。
参数语法:worker_connections number
默认配置:worker_connections 512
放置位置:events
调整配置Nginx worker进程的最大打开文件数,这个控制连接数的参数为worker_rlimit_nofile。
worker_rlimit_nofile 65535;
#<==最大打开文件数,可设置为系统优化后的ulimit -HSn的结果
先要将确切名字和通配符名字存储在散列表中。散列表与监听端口关联,每个端口最多关联到三张表:确切名字的散列表、以星号起始的通配符名字的散列表和以星号结束的通配符名字的散列表。
举个例子,如果使用nginx.org和www.nginx.org来访问服务器是最频繁的,那么将它们明确地定义出来就更为有效,命令如下:
server {
list
en 80; serv
er_name nginx.org w
ww.nginx.org *.nginx.org; ...}
下面这种方法更简单,但是效率也更低:
server {
list
en 80; serv
er_name .nginx.org; ...}
如果定义了大量的名字,或者定义了非常长的名字,那就需要在HTTP配置块中调整server_names_hash_max_size和server_names_hash_bucket_size的值。server_names_hash_bucket_size的默认值可能是32或64,也可能是其他值,这取决于CPU的缓存行的长度。如果这个值是32,那么定义“too.long.server.name.nginx.org”作为虚拟主机名就会失败,此时会显示如下的错误信息:
could not build the server_names_hash,
you should increase server_names_hash_bucket_size: 32
若出现了这种情况,那就需要将设置值扩大一倍,命令如下:
http {
se
rver_names_hash_bucket_size 64;
...
sendfile参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可防止网络及磁盘I/O阻塞,提升Nginx工作效率。
参数作用:
激活或禁用sendfile()功能。sendfile()是作用于两个文件描述符之间的数据复制函数,
这个复制操作是发生在内核之中的,被称为“零复制”,
sendfile()比read和write函数要高效很多,因为,read和wrtie函数要把数据复制到应用层再进行操作。
设置参数:tcp_nopush on;
参数作用:
激活或禁用Linux上的TCP_CORK socket选项,此选项仅仅当开启sendfile时才生效,激活这个.tcp_nopush参数可以允许把http response header和文件的开始部分放在一个文件里发布,其积极的作用是减少网络报文段的数量。
Nginx服务建立的连接,当服务器建立的连接没有接收处理请求时,可在指定的时间内让它超时自动退出。
连接超时是服务自我管理、自我保护的一种重要机制。
服务器建立新连接也是要消耗资源的,因此,超时设置得太短而并发很大,就会导致服务器瞬间无法响应用户的请求,导致用户体验下降。
企业生产中有些PHP程序站点会希望设置成短连接,因为PHP程序建立连接消耗的资源和时间相对要少些。而对于Java程序站点来说,一般建议设置成长连接,因为Java程序建立连接消耗的资源和时间更多,这是语言运行机制决定的。
1)设置参数:keepalive_timeout 60;
用于设置客户端连接保持会话的超时时间为60秒。若超过这个时间,服务器就会关闭该连接,此数值仅为参考值。
syntax: keepalive_timeout timeout [header_timeout]; #<==参数语法
default: keepalive_timeout 75s; #<==参数默认大小
context: http, server, location #<==可以放置的标签
此参数设置一个keep-alive(客户端连接在服务器端保持多久后退出),其单位是秒,和HTTP响应header域的“Keep-Alive:timeout=time”参数有关,这些header信息也会被客户端浏览器识别并处理,不过有些客户端并不能按照服务器端的设置来处理
2)设置参数:tcp_nodelay on;
用于激活tcp_nodelay功能,提高I/O性能。
参数作用:默认情况下当数据发送时,内核并不会马上发送,可能会等待更多的字节组成一个数据包,这样可以提高I/O性能。
但是,在每次只发送很少字节的业务场景中,使用tcp_nodelay功能,等待时间会比较长。
3)设置参数:client_header_timeout 15;
用于设置读取客户端请求头数据的超时时间。此处的数值为15,其单位是秒,为经验参考值。
参数作用:设置读取客户端请求头数据的超时时间。如果超过这个时间,客户端还没有发送完整的header数据,那么服务器端将返回“Request time out(408)”错误,可指定一个超时时间,防止客户端利用http协议进行攻击。
4)设置参数:client_body_timeout 15;
用于设置读取客户端请求主体的超时时间,默认值是60。
参数作用:设置读取客户端请求主体的超时时间。这个超时仅仅为两次成功读取操作之间的一个超时,而不是请求整个主体数据的超时时间,如果在这个超时时间内,客户端没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60,这样效果更好。
5)设置参数:send_timeout 25;
用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接,默认值为60秒,可以改为参考值25秒。
参数作用:设置服务器端传送HTTP响应信息到客户端的超时时间,这个超时仅仅为两次成功握手后的一个超时,而不是请求整个响应数据的超时时间,如在这个超时时间内,客户端没有接收任何数据,那么连接将被关闭。
首先,在Nginx的主配置文件里加入如下参数:
client_max_body_size 8m;
具体大小可根据公司的业务做调整,如果不清楚就先设置为8m吧,一般情况下,HTTP的post方法在提交数据时才会携带请求主体信息。
1.Nginx gzip压缩功能介绍
Nginx gzip压缩模块提供了压缩文件内容的功能,用户请求的内容在发送到用户客户端之前,Nginx服务器会根据一些具体的策略实施压缩,以节约网站出口带宽,同时加快数据传输效率,来提升用户访问体验。
2.Nginx gzip压缩的优点
·提升网站的用户体验:发送给用户的内容小了,用户访问单位大小的页面就加快了,用户体验提升了,网站口碑就好了。
·节约网站带宽成本:数据是压缩传输的,因此节省了网站的带宽流量成本,不过压缩时会稍微消耗一些CPU资源,这个一般可以忽略不计。
3.需要和不需要压缩的对象
·纯文本内容的压缩比很高,因此,纯文本的内容最好进行压缩,例如:html、js、css、xml、shtml等格式的文件。
·被压缩的纯文本文件必须要大于1KB,由于压缩算法的特殊原因,极小的文件压缩后可能反而变大。
·图片、视频(流媒体)等文件尽量不要压缩,因为这些文件大多都是经过压缩的,如果再压缩很可能不会减小或减小得很少,甚至还有可能增大,同时压缩时还会消耗大量的CPU、内存资源。
4.参数介绍及配置说明
#压缩配置
gzip on;
1.Nginx expires功能介绍
Nginx expires的功能就是为用户访问的网站内容设定一个过期时间,当用户第一次访问这些内容时,会把这些内容存储在用户浏览器本地,这样用户第二次及以后继续访问该网站时,浏览器会检查加载已经缓存在用户浏览器本地的内容,就不会再去服务器下载了,直到缓存的内容过期或被清除为止。
更深入地理解:expires的功能就是允许通过Nginx配置文件控制HTTP的"Expires"和"Cache-Control"响应头部内容,告诉客户端浏览器是否缓存和缓存多长时间以内访问的内容。这个expires模块控制Nginx服务器应答时的expires头内容和Cache-Control头的max-age指令。缓存的有效期可以设置为相对于源文件的最后修改时刻或客户端的访问时刻。
这些HTTP头向客户端表明了内容的有效性和持久性。如果客户端本地有内容缓存,则内容就可以从缓存(除非已经过期)而不是从服务器中读取,然后客户端会检查缓存中的副本,看其是否过期或失效,以决定是否重新从服务器中获得内容更新。
2.Nginx expires作用介绍
在网站的开发和运营中,视频、图片、CSS、JS等网站元素的更改机会较少,特别是图片,这时可以将图片设置在客户浏览器本地缓存365天或3650天,而将CSS、JS、html等代码缓存10~30天。这样用户第一次打开页面后,会在本地的浏览器中按照过期日期缓存相应的内容,下次用户再打开类似的页面时,重复的元素就无需下载了,从而加快了用户访问速度。用户的访问请求和数据减少了,也可以节省大量的服务器端带宽。
3.Nginx expires功能优点
以location标签为例进行讲解,通过locationURI规则将需要缓存的扩展名罗列出来,然后指定缓存时间。如果针对所有内容设置缓存.
1)根据文件扩展名进行判断,添加expires功能范例
范例1:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{ expires 3650d;}
范例2:
location ~ .*.(js|css)?$
{ expires 30d;}
该范例的意思是当用户访问网站URL结尾的文件扩展名为js、css类型的元素时,设置缓存为30天,即1个月。
5.Nginx expires功能的缺点及解决方法
几乎所有的事物都有两面性,没有十全十美的人和事。Nginx expires功能也不例外,虽然这个功能很好,但是也会给企业带来一些困惑。
当网站被缓存的页面或数据更新了,此时用户端看到的可能还是旧的已经缓存的内容,这样就会影响用户的体验,那么如何解决这个问题呢?解决办法如下。
第一,对于经常发生变动的图片等文件,可以缩短对象缓存时间,例如:谷歌和百度首页的图片经常会根据不同的日期换成一些节日的图片,所以这里可以将这个图片的缓存期设置为1天。
第二,当网站改版或更新时,可以在服务器中将缓存的对象改名(网站代码程序)。
·对于网站的图片、附件,一般不会被用户直接修改,用户层面上的修改图片,实际上是重新传到服务器,虽然内容一样但是是一个新的图片名了。
·网站改版升级会修改JS、CSS元素,若改版时对这些元素名进行了修改,则会使得前端的CDN及用户端需要重新缓存内容。
6.企业网站缓存日期曾经的案例参考
若企业的业务和网站的访问量不同,那么网站缓存期的时间设置也是不同的,比如,如下企业所用的缓存日期就是不一样的。
·51CTO:1周
·新浪:15天
·京东:25年
·淘宝:10年
7.企业网站有可能不希望被缓存的内容
·广告图片,用于广告服务,都缓存了就不好控制展示了。
·网站流量统计工具(JS代码),都缓存了流量统计就不准了。
·更新很频繁的文件(Google的logo),如果按天缓存,效果还是显著的。
利用Nginx配置禁止访问上传资源目录下的PHP、Shell、Perl、Python程序文件,这样用户即使上传了木马文件也没法执行,从而加强了网站的安全。
范例1:配置Nginx,禁止解析指定目录下的指定程序。
location ~ ^/images/.*\.(php|php5|sh|pl|py)$
{ deny all; }
location ~ ^/static/.*\.(php|php5|sh|pl|py)$
{ deny all; }
location ~* ^/data/(attachment|avatar)/.*\.(p
hp|php5)$ { deny all; }
对上述目录的限制必须写在Nginx处理PHP服务配置的前面,如下:
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fcgi.conf; }
范例2:Nginx下配置禁止访问*.txt和*.doc文件。
实际配置信息如下:
location ~* \.(txt|doc)$ {
if (-f $request_filename) {
root /data/www/www;
#rewrite …..可以重定向到某个URL
break; }}
location ~* \.(txt|doc)${
root /data/www/www;
denyall;
}
范例1:配置禁止访问指定的单个或多个目录。
禁止访问单个目录的命令如下:
location ~ ^/(static)/ {
deny all;}location ~ ^/static { deny all;}
禁止访问多个目录的命令如下:
location ~ ^/(static|js) {
deny all;}
范例2:禁止访问目录并返回指定的HTTP状态码,命令如下。
作用:禁止访问目录下的指定文件,或者禁止访问指定目录下的所有内容。
最佳应用场景:对于集群的共享存储,一般是存放静态资源文件,所以可以禁止执行指定扩展名的程序.
Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取。有关robots.txt的配置,本书不会详细讲解。
我们可以根据客户端的user-agents信息,轻松地阻止指定的爬虫爬取我们的网站。
范例1:阻止下载协议代理,命令如下。
## Block download agents ##
if ($http_user_agent ~* LWP
::Simple|BBBike|wget) { return 403;}
这里根据$http_user_agent获取客户端agent,然后判断是否允许或返回指定错误码。
范例2:添加内容防止N多爬虫代理访问网站,命令如下。
这些爬虫代理使用“|”进行分隔,具体要处理的爬虫可以根据需求增加或减少,添加的内容如下:
if ($http_user_agent ~*
"qihoobot|Baiduspider|Go
oglebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Yahoo! Slurp China|YoudaoBot|So
sospider|Sogou spider|Sogou web spider|MSNBot") {return 403;}
范例3:测试禁止不同的浏览器软件访问。
如果浏览器为Firefox或IE,就会跳转到http://blog.etiantian.org。
if ($http_user_agent ~* "Firefox|MSIE")
{ rewrite ^(.*) http://blog.etiantian.org/
$1
permanent;}
最常用的HTTP方法为GET、POST,我们可以通过Nginx限制HTTP请求的方法来达到提升服务器安全的目的,例如,让HTTP只能使用GET、HEAD和POST方法的配置如下:
#Only allow these request methods
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 501; }
#Do not accept DELETE, SEARCH and other methods
CDN的全称是Content Delivery Network,中文意思是内容分发网络。简单地讲,通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的Cache服务器内,通过智能DNS负载均衡技术,判断用户的来源,让用户就近使用与服务器相同线路的带宽访问Cache服务器,取得所需的内容。例如:天津网通用户访问天津网通Cache服务器上的内容,北京电信访问北京电信Cache服务器上的内容。这样可以有效减少数据在网络上传输的时间,从提高访问速度。
CDN是一套全国或全球的分布式缓存集群,其实质是通过智能DNS判断用户的来源地域及上网线路,为用户选择一个最接近用户地域,以及和用户上网线路相同的服务器节点,因为地域近,且线路相同,所以,可以大幅提升用户浏览网站的体验。
DN产生背景之一:BGP机房虽然可以提升用户体验,但是价格昂贵,对于用户来说,CDN的诞生可以提供比BGP机房更好的体验(让同一地区、同一线路的用户访问和当地同一线路的网站),BGP机房和普通机房有将近5~10倍的价格差。CDN多使用单线的机房,根据用户的线路及位置,为用户选择靠近用户的位置,以及相同的运营商线路,不但提升了用户体验,价格也降了下来。
CDN的价值:
通过服务器内存缓存网站数据,提高了企业站点(尤其是含有大量图片、视频等的站点)的访问速度,并大大提高了企业站点的稳定性(省钱且提升用户体验)。
用户根据智能DNS技术自动选择最适合的Cache服务器,降低了不同运营商之间互联瓶颈造成的影响,实现了跨运营商的网络加速,保证不同网络中的用户都能得到良好的访问质量。
加快了访问速度,减少了原站点的带宽。
用户访问时从服务器的内存中读取数据,分担了网络流量,同时减轻了原站点负载的压力等。
使用CDN可以分担源站的网络流量,同时还可以减轻原站点的负载压力,并降低黑客入侵及各种DDoS攻击对网站的影响,从而保证网站有较好的服务质量。
下面是通过curl命令访问163网站的header信息,可以看到163网站的首页就使用了CDN进行加速。
[oldboy@student ~]$ curl -I www.163.com
返回 “Cdn Cache Server V2.0)”表示163首页使用了CDN加速
解耦是开发人员中流行的一个名词,简单地说就是把一堆程序代码按照业务用途分开,然后提供服务,例如:注册登录、上传、下载、浏览列表、商品内容页面、订单支付等都应该是独立的程序服务,只不过在客户端看来是一个整体而已。如果中小公司做不到上述细致的解耦,起码也要让下面的几个程序模块独立。
网页页面服务。
图片附件及下载服务。
上传图片服务。
述三者的功能应尽量分离。分离的最佳方式是分别使用独立的服务器(需要改动程序),如果程序实在不易更改,那么次选方案是在前端负载均衡器Haproxy/Nginx上,根据URI(例如目录或扩展名)过滤请求,然后抛给后面对应的服务器。
例如:根据扩展名分发,请求http://www.etiantian.org/a/b.jpg的就应抛给图片服务器(独立的静态服务器最适合使用CDN);根据URL路径分发,请求http://www.etiantian.org/upload/index.php的就应抛给上传服务器。不符合上面两个要求的,就默认抛给Web服务器。
说明:可以部署3台服务器,人为分布请求服务器。当然了,这适合并发比较高、服务器较多的情况。程序架构分离了,效率、安全性都会提高很多。
(1)安全优化:隐藏Nginx软件名及版本号。
(2)性能加安全优化:连接超时参数及FastCGI相关参数调优。
(3)性能优化:gzip压缩功能及调试查看方法。
(4)性能优化:expires缓存功能及调试查看方法。
(5)安全优化:集群中各角色服务站点目录权限控制策略。
(6)安全优化:站点目录下所有的文件和目录访问控制。
(7)性能加安全优化:robots.txt协议及防爬虫优化解决方案。
(8)性能加安全优化:静态资源防盗链解决方案。
(9)用户体验优化:错误页面优雅显示方法。
(10)安全优化:限制HTTP请求方法。
(11)性能加安全优化:CDN加速知识