• 基本优化


    优化服务器进程

    优化进程个数

    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压缩功能
    

      

     

  • 相关阅读:
    怎样把Maven项目共享为传统Web项目
    伸冤人
    Maven依赖
    Maven常用插件参数
    Maven默认周期与插件
    MySQL Connector_J_5.1.34_2014.10
    MyEclipse2015对Javascript自动提示的终极支持
    Struts Convention Plugin 流程 (2.1.6+)
    Maven,预加载资源文件
    Myeclipse2014 自带的报表功能 与 Eclipse BIRT
  • 原文地址:https://www.cnblogs.com/sellsa/p/7791735.html
Copyright © 2020-2023  润新知