基本优化

Posted 何波安的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基本优化相关的知识,希望对你有一定的参考价值。

优化服务器进程

优化进程个数

worker_processes 4; #官方建议设置为cpu的总核数

# ../sbin/nginx -s reload
[[email protected] 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压缩功能

  

 

以上是关于基本优化的主要内容,如果未能解决你的问题,请参考以下文章

如何优化C ++代码的以下片段 - 卷中的零交叉

从JVM的角度看JAVA代码--代码优化

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段

c_cpp Robolution基本代码片段

html PHP代码片段: - AJAX基本示例:此代码演示了使用PHP和JavaScript实现的基本AJAX功能。

优化片段着色器