优化服务器进程
优化进程个数
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压缩功能