转载地址:http://www.javashuo.com/article/p-qgarrxxw-m.htmljavascript
©著做权归做者全部:来自51CTO博客做者027ryan的原创做品,如需转载,请注明出处,不然将追究法律责任php
一、Apache worker/prefwork模式说明css
在linux中,咱们能够用httpd-l 查看安装的模块是prefork模式仍是worker模式html
[root@LAMP ~]# /application/apache/bin/apachectl -l|egrep "worker|prefoker"前端
worker.cjava
[root@LAMP ~]#node
或者linux
[root@LAMP ~]# /application/apache/bin/apachectl -l |sed -n '/worker|prefork/p'nginx
worker.cweb
[root@LAMP ~]#
prefork模式(默认):
prefork使用的是多个子进程,而每一个子进程只有一个线程,每一个进程在某个肯定的时间只能维持一个链接。
工做原理:
控制进程最初创建若干个子进程,为了避免在请求到来时再生成子进程,因此要根据需求不断的建立新的子进程,最大能够达到每秒32个知道知足需求为止。 简单表示为:
wKiom1bmCdujtTCJAACsn1GHGLI357.jpg
安装方法:
在编译的时候,加入参数--with-mpm=prefork 若是不加也能够,由于默认的话,会采用prefork模式
优势:效率高,稳定,安全。对于线程调试困难的平台来讲,调试更加容易一些。
缺点:和worker模式相比消耗的资源多
配置参数说明:
<Ifmodule mpm_prefork_module>
StartServers 5 #--->最初创建的子进程
MinSpareServers 5 #--->最小空闲进程数,若是空闲的进程小于设定值,Apache会自动创建进程,若是服务器并发及负载大的话,能够考虑加大。
MaxSpareServers 10 #--->最大空闲进程数,若是空闲的进程大于设定值,Apache会自动kill掉多余的进程,若是服务器负载大的话,能够考虑加大
MaxClients 150 #--->设定的是Apache能够同时处理的请求,是对Apache性能影响最大的参数,就是Apache能够同时处理的请求数,就是说若是有150个用户在访问,那么151个用户就要等以前的访问结束后才能访问
MaxRequestPerChild 0 #---->每一个子进程能够处理的请求数。每一个子进程在处理了"maxrequestsperchild"个请求后将自动销毁,0意味着无限,即子进程永不销毁。虽然缺省设为0可使每一个子进程处理更多的请求,但若是设成非零页有两点好处(1)防止意外的内存泄露(2)在服务器负载降低的时候回自动减小子进程数
</Ifmodule mpm_prefork_module>
提示:在设置参数值的时候,MinSpareServers 与StartServers尽可能保持一致,在prefork模式下,MaxClients被认为是Apache的最大并发数
经常使用配置参考:
<IfModule mpm_prefork_module>
StartServers 10 MinSpareServers 10 MaxSpareServers 15 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 5000
</IfModule>
prefork模式环境下,如何查看Apache的并发链接数(进程数):
具体方法以下:
[root@LAMP ~]# ps -ef|grep http|wc -l
6
[root@LAMP ~]#
worker模式:
worker模式是Apache2.x新引进的模式,是线程与进程的结合,在worker模式下会有多个子进程,每一个子进程又会有多个线程。每一个线程在某个肯定时间只能维持一个链接。
简单表示为:
wKioL1bmDRXSrfNVAAEUF1hpmF0636.jpg
工做原理:
由主控制进程生成若干个子进程,而每一个子进程中又包含固定的线程数,各个线程独立处理请求,一样为了避免在请求到来时再生成线程,在配置文件中设置了最小和最大空闲线程数及全部子进程的线程总数,若是现有子进程中的线程总数不能知足并发负载,控制进程将派生新的子进程。
安装方法:
在配置编译的过程当中,加入参数--with-mpm=worker,若是不加的话系统会采用默认的prefork模式
优势:内存占用比prefork模式低,适合高并发高流量的HTTPD服务
缺点:假如一个线程崩溃,整个进程积极会连同其任何线程一块儿“死掉”。因为线程共享内存空间,因此一个程序在运行时必须被系统识别为“每一个线程都是安全的”。服务稳定性不如prefork模式。
配置说明(prefork模式):
[root@LAMP ~]# sed -n '43,58p' /application/apache/conf/extra/httpd-mpm.conf
#worker MPM
#StartServers: initial number of server processes to start
#MaxClients: maximum number of simultaneous client connections
#MinSpareThreads: minimum number of worker threads which are kept spare
#MaxSpareThreads: maximum number of worker threads which are kept spare
#ThreadsPerChild: constant number of worker threads in each server process
#MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0
</IfModule>
生产场景配置4:
<IfModule mpm_worker_module>
StartServers 3 MaxClients 1600 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 64 MaxRequestsPerChild 0
</IfModule>
worker模式下所能同时处理的请求总数是由子进程总数乘以Threadsperchild值决定的,应该大于等于maxclients。若是负载很大,现有的子进程数不能知足时,控制进程会派生新的子进程。
提示: 默认最大的子进程总数为16,如需加大时也须要明显的申明serverlimit的值(最大值时20000)
查看Apache的worker下并发链接数:
[root@LAMP ~]# pstree -a|grep httpd|wc -l
84
[root@LAMP ~]#
二、web防盗链技术
简单的说,就是某些不法的网站,经过在其自身网站程序里未经许可非法调用其余网站的资源,而后在本身的网站上显示这些调用的资源,达到了填充自身网站显示的效果,可是浪费了调用资源网站的网络流量,形成其余网站的带宽及服务压力吃紧,甚至宕机。
网站被盗链的解决方案:
一、根据http referer实现防盗链
在HTTP协议中,有一个表头字段叫referer,使用URL格式来表示从哪里来的连接到当前网页的资源,经过referer能够检测到目标访问的来源网页,若是是资源文件,能够跟踪到显示它的网页地址,一单检测出来源不是本站进行阻止或返回指定页面。 目前Apache,nginx,lighttpd三者都支持根据http referer实现防盗链
二、根据cookie处理
三、经过加密变换访问路径实现防盗链lighttpd有相似的插件mod_secdownload
Apache web服务实现防盗链实战
<VirtualHost *:80>
ServerAdmin ucode@gmail.com DocumentRoot "/var/html/bbs" ServerName ucode.blog.51cto.com ServerAlias www.dummy-host.example.com ErrorLog "logs/bbs-error_log" CustomLog "|/usr/local/sbin/cronolog /app/logs/access_bbs_%Y%m%d.log" combined RewriteEngine On #开启防盗链 RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC] RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/$ [NC] RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com/.*$ [NC] RewriteCond %{HTTP_REFERER}!^http://ucode.blog.51cto.com$ [NC] RewriteCond .*\.(gif|jpg|swf)$ http://ucode.blog.51cto.com/img/nolink.jpg [ R,NC]
</VirtualHost>
知足以上的黑体部分的就会返回:http://ucode.blog.51cto.com/img/nolink.jpg图片
原理流程图:
wKioL1bmEfrRLihmAAJlqSzFQ3A405.jpg
利用referer和rewrite实现Apache防盗链小结
经过判断referer变量的值,来判断图片或资源的引用是否合法,只有在根据配置符合设定需求范围内的referer,这样的网站内容,才能调用访问指定的资源内容,从而实现了资源被网站盗链的目的。须要注意的是:是全部的用户代理(浏览器)都会设置referer变量,并且有的还能够手工修改erferer,referer是能够被伪造的,上面的配置只是一种简单的防御手段。应付通常的盗链足矣。
当网站被盗链,通常能够采起如下措施:
a、对本站的图片、视频、音频等文件标上本身的站名品牌或者相关水印;
b、设置防火墙,从源头IP进行控制
c、设置防盗链(根据referer机制)
网站被非法盗链使用,会致使网站带宽成本加大以及服务器压力加大,严重时会致使巨额的网站及正经常使用户访问受到影响。
##############基于LAMP(LNMP)问架构深度优化---配置文文件#################
三、修改配置文件参数实现隐藏版本号
a、nginx隐藏版本号
syntax server_tokens on|off;
在nginx配置文件中加入“server_token off;”
http
{
......... server_tokens off; .........
}
b、Apache隐藏版本号
[root@LAMP ~]# egrep "Server|ServerS" /application/apache/conf/extra/httpd-default.conf
#This configuration file reflects default settings for Apache HTTP Server.
#ServerName directive.
#ServerTokens
#This directive configures what you return as the Server HTTP response
ServerTokens Full
#Set to "EMail" to also include a mailto: link to the ServerAdmin.
ServerSignature On
[root@LAMP ~]#
其中黑体部分改分别改成以下:
ServerTokens Prod
ServerSignature Off
四、修改nginx/Apache的默认用户及用户组nobody
a、启动nginx服务,使用的默认用户为nobody:
为了防止***猜到这个用户,咱们须要更改下特殊的用户名,提供nginx服务用。
b、更改默认用户的方法有两种,第一种为:
user:nginx nginx;
设置Nginx Worker进程运行的用户以及用户组
useradd nginx -s /sbin/nologin -M <==不须要有系统登陆权限,应该禁止其登陆,至关于Apache里的用户同样
c、更改默认用户的方法有两种,第一种如上面所说,第二种为:
./configure --user=nginx --group=nginx --prefix=/application/nginx1.6.2 --with-http_stub_status_module --with-http_ssl_module
提示:其实在前面编译nginx服务时,咱们就这样带着参数编译的。
d、Apache默认用直接修改配置文件内容:
[root@LAMP ~]# egrep "User|Group" /application/apache/conf/httpd.conf
#User/Group: The name (or #number) of the user/group to run httpd as.
User www
Group www
补充知识:
配置nginx worker进程个数
在高并发场景,咱们须要事先启动更多的nginx进程以保证快速响应并处理用户的请求。具体的配置参数以下:
worker_processes 8 <===指定了Nginx须要开启的进程数,建议指定和CPU的数量相等或者乘2的进程数
work_processes 参数开始的设置能够等于cpu的个数或者核数(work_cpu_affinity参数中的配置能够指定第一个到最后一个进程分别使用的哪一个cpu),进程多一些,其实提供服务就不会临时启动新进程提供服务,减小了系统开销,提高了服务速度。特殊场合也能够考虑提升至CPU*2 的进程数,具体状况要跟根据实际的业务来选择,由于这个参数,除了CPU核数的影响外,和硬盘存储的数据以及负载也有关。
查看linux服务器的核数的方法:
[root@LNMP application]# grep "physical id" /proc/cpuinfo
physical id : 0
physical id : 0
physical id : 1
physical id : 1
[root@LNMP application]#
能够按照physical数量设置,或者将目前数量*2
五、事件处理模型优化
nginx的链接处理机制在于不一样的操做系统采用不一样的IO模型,在linux使用epoll的IO多路复用模型,在FreeBSD使用kqueue的IO多路复用模型,在Solaris使用/dev/poll方式的IO多路复用模型,在Windows中使用的是icop等等。
根据系统类型不一样选择不一样use[kqueue|rtsig|epoll|/dev/poll|select|poll];该参数结合系统使用,不一样系统使用参数不一样,咱们使用的是Centos6.5,所以咱们调整为epoll模型
具体参数配置以下:
events <====envents指令是设定nginx的工做模式及链接数上限 { use epoll; }
六、调整单个进程容许客户端最大链接数
这个值根据根据具体服务器性能和程序的内存使用量来制定(一个进程启动使用的内存根据程序肯定)
events <====指令设定Nginx的工做模式及链接数上限
{
worker_connections 20480;
}
worker_connections也是个模块指令,用于定义Nginx每一个进程的最大链接数,默认是1024,客户端最大链接数由worker_processes和worker_connections决定,即Max_client=worker_processes * worker_connections,进程的最大链接数受linux系统进程的最大打开文件数限制,在执行操做系统命令“umilited -HSn 65535”或者配置相应的文件后,worker_connections的设置才生效
七、配置每一个进程最大文件打开数
worker_rlimit_nofile 65536;
该参数的意思为每一个进程打开的最大文件数,能够设置为系统优化受的ulimit -HSn的结果,在第一章系统安装时调整文件描述符和这个处理的一个问题。
详细查阅:http://nginx.org/en/docs/ngx_core_module.html
八、优化服务器名字的hash表大小
确切名字和通配符名字存储在哈希表中。哈希表和监听端口关联,每一个端口都最多关联三张表:确切的名字的哈希表,以星号()起始的通配符名字的哈希表和以星号结束的通配符名字的哈希表。哈希表的尺寸在配置阶段进行了优化,能够以最小的CPU缓存命中失败来找到名字。nginx首先搜索切确名字的的哈希表,若是没有找到,则搜索以星号()其实的通配符名字的哈希表,若是仍是没有找到,继续搜索以星号结束的通配符名字的哈希表。由于名字是按照域名的节点来搜索的。因此搜索通配符名字的哈希表比搜索确切名字的哈希表慢。注意:nginx.org存储在通配符名字的哈希表中,而不在确切名字的哈希表中。正则表达式是一个一个串行的测试,因此是最慢的,并且不可扩展。因为上述缘由,咱们通常尽量的使用确切的名字。好比若是使用nginx.org和www.nignx.org来访问服务器是最频繁的,那么咱们明确的定义出来对访问搜索域名的速度效率来讲更有效:
若是定义了大量名字,或者定义了很是长的名字,那就须要在php配置模块中调整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{
server_names_hash_bucket_size 64;
}
九、开启高效的文件传输模式
sendfile on; <====sendfile参数用户开启文件高效传输模式,同时将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
十、设置链接的超时时间
php服务,建议但愿短链接;java建议长链接
keepalive_timeout 60;
<==设置客户端保持会话的超时时间,超过这个时间,服务器会关闭链接。
tcp_nodelay on;
<==打开tcp_nodelay,包含了keepalive参数才有效
client_header_timeout 15;
<==设置客户端请求读取超时时间,若是超过这个时间,客户端还没发送任何数据,Nginx将返回“Rquest timeout (408)”错误.
client_body_timeout 15;
<==设置客户端请求主体读取超时时间,若是超过这个时间,客户端还没发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60.
send_timeout 15;
<==指定响应客户端的超时时间,这个超时时间仅限于两个链接活动之间的时间,若是超过这个时间,客户端没有任何活动,Nginx将会关闭链接。
十一、上传文件大小限制(动态应用)
主配置文件里加入以下参数,具体大小根据你本身的业务作调整。 client_max_body_size 10m;
十二、fastcgi调优(配合PHP引擎动态服务)
fastcgi_connect_timeout 300;
<==指定链接到后端FastCGI的超时时间
fastcgi_send_timeout 300;
<==向Fastcgi传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
fastcgi_read_timeout 300;
<==指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间
fastcgi_buffer_size 64k;
<==指定读取FastCGI应答第一部分须要用多大的缓冲区,这个值表示将使用1个64k的缓冲区读取应答的第一部分(应答头),能够设置为fastcgi_buffers 选项指定的缓冲区大小。
fastcgi_buffers 4 64k;
<==指定本地须要用多少和多大的缓冲区来缓冲FastCGI的应答请求,若是一个PHP脚本产生的页面大小为256K,那么会为其分配4个64KB的缓冲区来缓存;若是页面大小大于256KB,那么大于256KB的部分会缓存到Fastcgi_temp指定的路径中,可是这并非好方法;由于内存中的数据处理速度要快于硬盘,通常这个值应该为站点中PHP脚本所产生的页面大小的中间值,若是站点大部分脚本产生的页面大小为256KB,那么能够把这个值设置为“16 16K”、“4 64K”等。
fastcgi_busy_buffers_size 128k;
<==建议为fastcgi_buffers 的两倍
fastcgi_temp_file_write_size 128k;
<==在写入fastcgi_temp_path时将用多大的数据块,默认值是fastcgi_buffers的两倍,设置上述数值设置过小时若负载上来时能报 502 Bad Gateway
fastcgi_cache ucode_nginx;
<==表示开启FastCGI缓存并为其指定一个名称,开启缓存很是有用,能够有效下降CPU的负载,而且防止502错误的发生,可是开启缓存也可能会引发其余问题,要根据具体状况选择。
fastcgi_cache_valid 200 302 1h;
<==用来指定应答代码的缓存时间,实例中的值表示将200和302应答缓存一个小时。
fastcgi_cache_valid 301 1d;
<==将301应答缓存1天
fastcgi_cache_valid any 1m;
<==将其余应答缓存为1分钟
fastcgi_cache_min_uses 1;
<==缓存在fastcgi_cache_path指令inactive参数时间内的最少使用次数
1三、修改nginx源码文件进行优化:具体优化避免显示header为nginx和错误提示显示nginx关键字和版本号
a、隐藏nginx做为header头
修改nginx源码文件中的vim src/http/ngx_http_header_filter_module.c
wKioL1bmHYKCPg3EAAAhJff1enM597.png
光标分别移动到如下两行(4九、50)修改红色部分关键字为其余内容:
wKioL1bmHeihXyhaAAAl5p2V7x8024.png
这里改成Web SERVER和Web Server test
wKioL1bmL-KBIsyLAAAhojLtWy8378.png
即修改以下字段:
"Server: nginx" CRLF;
"Server: NGINX_VER"
修改成:
"Server: Web Server" CRLF;
"Server: Web Server test"
从新编译安装nginx,而后启动,经过curl -I 10.0.0.10 查看结果:
wKioL1bmKy2wLepxAAA36abgfjc198.png
b、隐藏错误信息避免爆出关键字nginx及其版本号
修改错误页面信息修改文件路径为:
vim nginx-1.7.10/src/http/ngx_http_special_response.c
wKioL1bmN6Pi17xOAAAkm_jdyzY573.png
修改成:
wKioL1bmN63x5cHOAAAehyhdw6A174.png
而后从新编译、安装、启动nginx
wKioL1bmOD-SHJdhAAA0eWXUH6c880.png
提示:目前测试nginx版本是nginx-1.7.10,对于nginx其余版本能够根据须要修改对应参数,通常修改参数为:
static u_char ngx_http_error_full_tail[] =
"<hr><center>"NGINX_VER"</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
和
static u_char ngx_http_error_tail[] =
"<hr><center>nginx</center>" CRLF
"</body>" CRLF
"</html>" CRLF
;
对应nginx-1.6版本只须要修改<center>nginx</center>便可
1四、配置nginx gzip压缩功能
nginx gzip 压缩模块提供了对文件内容压缩的功能,容许nginx服务器将输出内容在发送之到客户端以前根据具体的策略进行压缩,以节约网站带宽,同时提高用户体验。 此功能同Apache的mod_deflate压缩功能,依赖ngx_http_gzip_module模块,默认已安装,咱们已经详细介绍过压缩功能。 常见要压缩的的内容,如全部程序文件(js,css,html);而图片、视频、flash文件等文件不进行压缩。
一、对应的压缩参数说明以下:
gzip on;
<==开启gzip压缩功能。
gzip_min_length 1k;
<==设置容许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取,默认值是0,无论页面多大都进行压缩,建议设置成大于1K,若是小于1K可能会越压缩越大。(即:大于1k才压缩,小于1k不压缩)
gzip_buffers 4 16k;
<==压缩缓冲区大小。表示申请4个单位为16k的内存做为压缩结果流缓存,默认值是与原始数据大小相同的内存空间来存储gzip压缩结果。
gzip_http_version 1.0;
<==压缩版本(默认1.1,前端squid2.5时使用1.0)用户设置识别http协议版本,默认是1.1,默认大部分浏览器已经支持GZIP
解压,使用默认便可
gzip_comp_level 2;
<==压缩比率。用来指定GZIP压缩比,1压缩比最小,处理速度最快;9压缩比例最大,传输速度最快,但处理最慢,也比较消耗cpu资源。
gzip_types text/plain application/x-javascript text/css application/xml;
<==用来指定压缩类型,“text/hmtl”类型老是会被压缩。
gzip_vary on;
<==veray header 支持。该选项可让前端的缓存服务器缓存通过GZIP压缩的页面,例如使用squid缓存通过nginx压缩的数据。
二、完整的配置
gzip on;
gzip_min_length 1;
gzip_buffers 4 32k;
gzip_http_version 1.1;
gzip_comp_level 9;
#gzip_types text/plain application/x-javascript text/css application/xml;
gzip_types text/html text/css text/xml application/javascript;
gzip_vary on;
更多官方资料http://nginx.org/en/docs/http/ngx_http_gzip_module.html
提示:gzip_types类型不一样的版本可能会不一样,对应的版本类型到文件mimes.types中查找:
在该路径下查看当前nginx的安装目录下的mimes.types中查找匹配的类型:
[root@LNMP conf]# cat mime.types
types {
text/html html htm shtml; text/css css; text/xml xml; p_w_picpath/gif gif; p_w_picpath/jpeg jpeg jpg; application/javascript js; application/atom+xml atom; application/rss+xml rss; text/mathml mml; text/plain txt; text/vnd.sun.j2me.app-descriptor jad; text/vnd.wap.wml wml; text/x-component htc; p_w_picpath/png png; p_w_picpath/tiff tif tiff; p_w_picpath/vnd.wap.wbmp wbmp; p_w_picpath/x-icon ico; p_w_picpath/x-jng jng; p_w_picpath/x-ms-bmp bmp; p_w_picpath/svg+xml svg svgz; p_w_picpath/webp webp; application/font-woff woff; application/java-archive jar war ear; application/json json; application/mac-binhex40 hqx; application/msword doc; application/pdf pdf; application/postscript ps eps ai; application/rtf rtf; application/vnd.apple.mpegurl m3u8; application/vnd.ms-excel xls; application/vnd.ms-fontobject eot; application/vnd.ms-powerpoint ppt; application/vnd.wap.wmlc wmlc; application/vnd.google-earth.kml+xml kml; application/vnd.google-earth.kmz kmz; application/x-7z-compressed 7z; application/x-cocoa cco; application/x-java-archive-diff jardiff; application/x-java-jnlp-file jnlp; application/x-makeself run; application/x-perl pl pm; application/x-pilot prc pdb; application/x-rar-compressed rar; application/x-redhat-package-manager rpm; application/x-sea sea; application/x-shockwave-flash swf; application/x-stuffit sit; application/x-tcl tcl tk; application/x-x509-ca-cert der pem crt; application/x-xpinstall xpi; application/xhtml+xml xhtml; application/xspf+xml xspf; application/zip zip; application/octet-stream bin exe dll; application/octet-stream deb; application/octet-stream dmg; application/octet-stream iso img; application/octet-stream msi msp msm; application/vnd.openxmlformats-officedocument.wordprocessingml.document docx; application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx; application/vnd.openxmlformats-officedocument.presentationml.presentation pptx; audio/midi mid midi kar; audio/mpeg mp3; audio/ogg ogg; audio/x-m4a m4a; audio/x-realaudio ra; video/3gpp 3gpp 3gp; video/mp2t ts; video/mp4 mp4; video/mpeg mpeg mpg; video/quicktime mov; video/webm webm; video/x-flv flv; video/x-m4v m4v; video/x-mng mng; video/x-ms-asf asx asf; video/x-ms-wmv wmv; video/x-msvideo avi;
}
1五、nginx expire缓存功能
在网站开发和运营中,对于图片,CSS,JS等元素更改机会较少,特别是图片,这时能够将图片设置在浏览器本地缓存365天或者更长,CSS,JS,hmtl等代码缓存10天,这样用户第一次打开页面后,会在本地的浏览器缓存相应的上述内容,这样缓存能够提升下次用户打开相似页面的加速度,并节省服务器端大量的带宽。此功能同Apache的expire,这里经过location的功能,将须要缓存的扩展名列出来,而后指定缓存时间。
一、根据文件扩展名进行判断,添加expire功能范例
企业网站缓存日期案例:
一、51cto 1周
二、sina 15天
三、京东 25年
四、淘宝 10年
通常不但愿被缓存的内容:
1)广告图片
2)网站流量统计工具
3)更新频繁的文件(google的logo)
配置示例:
location ~.*.(gif|jpg|jpeg|png|bpm|swf)$
{
expires 365d;
}
location ~.*.(js|css)?$
{
expires 30d;
}
location标签要配到server标签里
location ~^/(p_w_picpaths|javascript|js|css|flash|media|static)/
{
expire 360d;
}
Nginx防蜘蛛爬虫处理
假定一个场景:某个网站它可能不但愿被网络爬虫抓取,例如测试环境不但愿被抓取,以避免对用户形成误导,那么须要在该网站中申明,本站不但愿被抓取。有以下方法:
方法一:修改nginx.conf,禁止网络爬虫的ua,返回403。
server {
listen 80;
server_name 127.0.0.1;
#添加以下内容便可防止爬虫
if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot")
{
return 403;
}
方法2:网站更目录下增长Robots.txt,放在站点根目录下。
在http://tool.chinaz.com/robots/站点能够针对如今的搜索引擎按照想要的规则生成robots.txt文件。
知识扩展:
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。robots.txt文件告诉蜘蛛程序在服务器上什么文件是能够被查看的。
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,若是存在,搜索机器人就会按照该文件中的内容来肯定访问的范围;若是该文件不存在,全部的搜索蜘蛛将可以访问网站上全部没有被口令保护的页面。百度官方建议,仅当您的网站包含不但愿被搜索引擎收录的内容时,才须要使用robots.txt文件。若是您但愿搜索引擎收录网站上全部内容,请勿创建robots.txt文件。
Robots协议是国际互联网界通行的道德规范,基于如下原则创建:
一、搜索技术应服务于人类,同时尊重信息提供者的意愿,并维护其隐私权;
二、网站有义务保护其使用者的我的信息和隐私不被侵犯。
固然,若是搜索引擎不遵照约定的Robots协议,那么经过在网站下增长robots.txt也是不起做用的。(在正式环境中,能够适当容许搜索引擎抓取收录)
爬虫文件robots.txt
wKioL1bmQqbBAt7pAAAl44Fa0pE447.png
1六、nginx日志相关优化与安全
nginx没有相似Apache的cronolog日志分割处理的功能,可是,能够经过nginxNginx的信号控制功能或者reload重载,而后利用脚原本实现日志的自动切割。
一、配置日志切割脚本:
[root@masterserver conf]# cd
[root@masterserver]# mkdir -p /server/scripts/
[root@masterserver]# cd /server/scripts/
[root@masterserver scripts]# cat cut_nginx_log.sh
cd /application/nginx/logs && \
/bin/mv www_access.log wwwaccess$(date +%F -d -1day).log
/application/nginx/sbin/nginx -s reload
[root@masterserver scripts]#
提示:实际上脚本的功能很简单,就是改名日志,而后从新加载nginx,从新生成文件记录日志
二、将这段脚本保存后加入到Linux的crontab守护进程,让此脚本在天天凌晨0点执行,就能够实现日志的天天分割功能了,操做结果以下:
[root@masterserverscripts]# crontab -l |tail -2
#cut nginx log on 00:00 everynight
00 00 * /bin/sh /server/scripts/cut_nginx_log.sh >/dev/null 2>&1
[root@masterserver scripts]#
[root@masterserver logs]# ll
total 40
-rw-r--r-- 1 root root 1119 Mar 14 11:59 access.log
-rw-r--r-- 1 root root 1000 Mar 14 11:59 error.log
-rw-r--r-- 1 root root 6 Mar 14 11:57 nginx.pid
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-07.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-08.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-09.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-10.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-11.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-12.log
-rw-r--r-- 1 root root 1119 Mar 14 12:58 www_access_2016-03-13.log
[root@masterserver logs]#
1七、不记录不须要访问的日志
对于健康检查的某些(图片,js,css)的日志,通常不须要记录,由于在统计PV时时按照页面计算,并且日志写入频繁会消耗IO,下降服务性能。具体语法以下:
location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)${ access_log off;
}
Apache的处理配置方法:
一、须要根据访问日志统计pv时
由于统计pv时,一个页面才算一个PV图片,JS,CSS等只是图片的元素,若是记录了,日志计算PV就不许确了。
配置方法:
<FilesMatch "\.(css|js|gif|jpg|ico|swf)"> SetEnv IMAG 1 </FilesMatch> 日志配置: CustomeLog "|/usr/local/sbin/cronolog /app/logs/%Y%/%m/access_%Y%m%d.log" combined env=!IMAG CustomeLog "|/usr/local/sbin/cronolog /app/logs/%Y%/%m/%d/%Haccess_%Y%m%d.log" combined env=!IMAG
1八、访问日志的权限设置
假如日志目录为/app/logs,则受权方法
chown -R root.root /app/logs
chown -R 700 /app/logs
nginx、Apache主进程都是用root用户启动,因此不给权限也能够写入,即700程序能够往里面写入数据
1九、根据扩展名限制程序和文件的访问题(一样适用于nginx)
为了保证Apache的网站不遭受**上传及修改文件。
安全的权限:
一、全部站点目录的用户和组都应该为root,
二、全部目录默认权限是755;
三、全部文件默认权限为644;
注意:网站服务的用户不能用root,
以上权限的设置能够作到防止上传,以及修改站点文件,可是,合理的用户上传内容也被拒之门外了,那么如何解决可让合法的用户上传文件又不至于被利用呢?
这就是对业务进行分离,在比较好的网站业务架构中,应该把资源文件,包括用户上传的图片,附件等的服务和程序
大多数公司的不安全的受权以下:
1)chmod -R 777 /sitedir(最不安全)
2) chmod -R apache.apache /sitedir(最不安全)
若是大多数公司受权通常的受权,会给网站带来最大的安全隐患。
20、nginx站点目录及文件URL访问控制
nginx下禁止访问资源目录下的php程序文件,配置方法以下:
范例1:nginx配置限制指定目录下的php程序被解析
location ~ ^/p_w_picpaths/.*.(php|php5)$
{
|deny all;
}
location ~ ^/static/.*.(php|php5)$
{
deny all;
}
location ~ ^/data/(p_w_upload|avatar)/..(php|php5)$
{
deny all;
}
这些目录的限制必须写在如下配置的前面:
location ~ .*.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000
fastcgi_index index.php
include fcgi.conf
}
范例2:nginx下配置禁止访问*.txt文件
location ~* .(txt|doc)${
if (-f $request_filename){
root /data/www/www;
#rewrite ...能够重定向到某个URL
break
}
}
location ~*.(txt|doc){
root /data/www/www;
deny all;
}
2一、禁止访问指定目录下的全部的文件和目录
范例1:配置禁止访问指定的单个或多个目录
单个目录:
location ~ ^/(static)/{
deny all;
}
location ~ ^/static {
deny all;
}
多个目录:
location ~ ^ /(static|js){
deny all;
}
2二、限制来源IP访问
使用ngx_http_acces_module限制ip访问
范例1:禁止某目录让外界访问,但容许某IP访问该目录,且支持PHP解析
location ~ ^ /oldboy/{
allow 202.111.12.121; deny all;
}
location ~ .*.(php|php5)?${
}
范例2限制及指定IP或者ip段访问
location / {
deny 192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
deny all;
}
参考:http://nginx.org/en/docs/http/ngx_http_access_module.html
2三、禁止资源目录解析PHP程序
方法1:提示下载不解析(针对APACHE的设置)
<Directory ~ "/application/www/etiantian/bbs/p_w_uploads">
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
php_flag engine off #注意这行
</Directory>