优化服务器进程
优化进程个数
worker_processes 4; #官方建议设置为cpu的总核数 # ../sbin/nginx -s reload [root@c1 conf]# ps -ef|grep nginx|grep -Ev "grep|php-fpm" root 6544 1 0 Apr16 ? 00:00:00 nginx: master process /application/nginx/sbin/nginx nginx 8067 6544 0 07:26 ? 00:00:00 nginx: worker process nginx 8068 6544 0 07:26 ? 00:00:00 nginx: worker process nginx 8069 6544 0 07:26 ? 00:00:00 nginx: worker process nginx 8070 6544 0 07:26 ? 00:00:00 nginx: worker process 从"worker_processes 4"可知,worker进程数为4.nginx master主进程不包含在内,master为管理进程,负责调度和管理worker进程
绑定不同的nginx进程到不同的cpu上
默认情况下,nginx的多个进程可能跑到某一个cpu或cpu的某一个核上,导致nginx进程使用硬件的资源不均。此节优化是尽可能地分配 不同的nginx进程给不同的cpu处理,达到充分有效利用硬件的多cpu多核资源的目的
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
这里的0001 0010 0100 1000是掩码,分别代表第1、2、3、4核cpu,由于worker_processes进程数为4,因此,上述配置会把每个进程 一核cpu处理,默认情况下不会绑定任何cpu,参数位置为main段
配置nginx worker进程最大打开文件数
worker_rlimit_nofile 65535; 可以设置系统优化后的ulimit -HSn的结果,放置在main段
优化nginx时间处理模型
nginx的连接处理机制在不同的操作系统会采用不同的I/O模型,在Linux下,nginx使用epoll的I/O多路复用模型,在FreeBSD使用kqueue的I/O多路复用,在Solaris中使用/dev/poll方式,在Windows中使用的是icop等等
events { use epoll; ...... }
调整nginx单个进程允许的客户端最大连接数
events { ...... worker_connections 20480; }
worker_connections用于定义nginx每个进程的最大连接数,默认是1024。nginx总并发连接数=worker数量*worker_connections,进程的最大连接数受linux系统进程的最大文件数限制,在执行操作系统命令“ulimit -HSn 65535”或配置相应文件后,worker_connections设置才能生效
隐藏版本号信息
隐藏版本号 在nginx配置文件nginx.conf中的http标签段内加入"server_tokens off;"参数,然后重载配置文件
http { ...... server_tokens off; }
修改软件名称及版本号
修改版本号需要在编译安装前 下载nginx并解压后,对源码进行修改,源码文件都在二级目录nginx-1.8.0/src/下,找到文件src/core/nginx.h, 然后按照下面的代码中指出的两行(粗体)进行修改 # cat nginx.h ...... #define NGINX_VERSION "1.8.0" #define NGINX_VER "nginx/" NGINX_VERSION ....... 对于粗体部分可以随意修改
开启高效文本传输模式
sendfile 参数用于开启文件的高效传输模式。同时将tcp_nopush和tcp_nodelay两个指令设置为on,可以防止网络及磁盘I/0阻塞,提升nginx工作效率
可以放置的标签段[http ,server, location, if in location]
sendfile on; 提高静态文件读取效率 tcp_nopush on; 在sendfile开启的情况下,提高网络包的传输效率,把多个包整合一次性发送出去 tcp_nodelay on; 和tcp_nopush对应的,在keepalive连接下,提高网络包的传输实时性
站点目录文件及目录权限优化
为了保证网站不遭受木马入侵,所有站点目录的用户和组都应该为root,所有的目录权限是755;所有的文件权限是644
以上的权限设置可以防止黑客上传木马,以及修改站点文件,但是,合理的网站用户上传的内容也会被拒绝。那么如何让合法的用户可以上传文件,而又不至于被黑客利用攻击呢?
如果是单机的环境,站点目录和文件属性设置如下: 所有的目录权限设置为755 所有的文件权限设置为644 所有的目录,以及文件用户和组都是root 把用户上传资源的目录设置为755,将用户和组设置为nginx服务的用户 最后针对上传资源的目录做资源访问限制
对上传资源的目录做资源访问限制
有些网站不但允许用户发布内容到服务器,还允许用户发图片设置上传附件到服务器上,由于为用户开了上传的功能,因此给服务器带来了很大的安全风险。虽然很多程序在上传前会做一定的控制,例如:文件大小,类型等,但是,一不小心就会被黑客钻了空子,上传了木马程序。下面将利用nginx配置禁止访问上传资源目录下的PHP、SHELL、Perl、Python程序文件,这样用户即使上传了木马文件也没法执行,从而加强了网站的安全。
配置nginx,禁止解析指定目录下的指定程序
location ~ ^/images/.*.(php|php5|sh|pl|py)$ { deny all; } location ~ ^/static/.*.(php|php5|sh|pl|py)$ { deny all; } location ~ ^/data/(attachment|avatar)/.*.(php|php5)$ { deny all; }
以上目录的限制必须写在nginx处理php服务配置前面
禁止非法域名解析访问企业网站
nginx如何防止用户ip访问网站(恶意域名解析,也相当于直接IP访问企业网站)?
方法1:让使用ip访问或者恶意解析域名的用户,收到501错误,命令如下:
server { listen 80 default_server; server_name _; return 501; } #说明:直接报501错误,从用户体验上不是很好
方法2:通过301跳转到主页,命令如下:
server { listen 80 default_server; server_name _; rewrite ^(.*) http://www.heboan.com$1 permanent; }
方法3:发现某域名恶意解析到公司的服务器ip,在server标签里添加一下代码即可,若有多个server则要多处添加:
if ($host !~ ^www/.heboan/.com$){ rewrite ^(.*) http://www.heboan.com$1 permanent; }
图片及目录防盗链
根据HTTP referer实现防盗链
HTTP referer是header的一部分,当浏览器向web服务器发送请求时,一般会带上referer,告诉服务器我是从哪个页面链接过来的,服务器借此获得一些信息用于处理。Apache、Nginx、Lighttpd三者都支持HTTP referer实现防盗链,referer是目前网站图片、附件、html等最常用的防盗链手段。
location ~* .(jpg|gif|png|swf|flv|wma|asf|mp3|mmf|zip|rar)$ { valid_referers none blocked *.heboan.com; if ($invalid_referer){ rewrite ^/ http://www.heboan.com/img/nolink.jpg; #return 404; } }
网页压缩
gzip on; #用于开启gzip,默认是关闭的 gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置大于1k的字节数,小于1k可能会越压越大 gzip_buffers 4 16k; #这是系统获取几个单位的缓存用于存储gzip的压缩结果数据流,4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存 gzip_http_version 1.1; #识别http的协议版本 gzip_comp_level2; #设置压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢,比较消耗cpu资源 gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif images/png; #匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的 gzip_vary on; #和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩. gzip_disable “MSIE [1-6].”; #同时由于IE6不支持gizp解压缩,所以在IE6下要关闭gzip压缩功能