• Nginx优化


    toc

    1、gzip资源压缩

    nginx将发送给客户端的响应报文先压缩,这样就可以节约网络带宽和更快的传输至客户端。在客户端浏览器进行解压。

    (1) 动态压缩

    打开nginx配置文件 nginx.conf 里面添加或者用include引用

    # 打开压缩模块
    gzip on;
    # 最小多少就不压缩了
    gzip_min_length 1k;
    # buffer缓冲
    gzip_buffers 4 16k;
    # 使用http那个版本。有1.0和1.1,主流是1.1
    gzip_http_version 1.1;
    # gzip压缩率。有1到9,数字越大压缩比例越大,同时耗费性能越大
    gzip_comp_level 2;
    # 进行压缩的文件类型
    gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    # no Vary
    gzip_vary off;
    # IE1到6不支持压缩,这里就把它踢出去了
    gzip_disable "MSIE [1-6].";

    保存重新加载配置文件 nginx -s reload

    最后用 curl 命令测试一下
    curl -I -H "Accept-Encoding: gzip, deflate" "网站域名/各种文件类型"

    (2) 静态压缩

    不同于动态压缩,静态压缩是对请求资源优先查找以.gz结尾的文件,有就直接发送.gz压缩文件,没有再走正常请求流程。所有静态压缩只针对静态资源并同目录下有相应以.gz的压缩包

    在nginx配置文件 server 标签里加入下面内容(这里为了小范围测试就不写在http标签了)

    # 匹配后缀是png格式的图片
    location ~ .*.png$ {
        # 打开静态压缩,需要打开gzip模块
        gzip_static  on;
        # nginx作为反向代理时候header头包含什么信息启动压缩
        gzip_proxied expired no-cache no-store private auth;
    }

    保存重新加载配置文件 nginx -s reload 并把png格式的图片压缩一下
    tar -zcvf test.png.gz test.png
    最后用 curl -I -H "Accept-Encoding: gzip, deflate" 网站域名加图片url 测试一下

    Content-Length 和压缩文件大小比对一下

    2、expires浏览器缓存

    利用客户浏览器来缓存网站上不经常变更的图片,是给服务器减压的一个很方便且实用的做法。比如,网站的logo等,只要不是经常变更的,大都可以让其存在客户端,提高访问速度,减小服务器的压力

    打开nginx配置文件在 location 标签中添加expires

    expires 40s; //表示把数据缓存40秒
    expires 20m; //表示把数据缓存20分
    expires 10h;//表示把数据缓存10小时
    expires 3d;//表示把数据缓存3天

    # 匹配后缀是jpg格式的图片 
    location ~ .*.jpg$ {
            # 被缓存文件的路径
            root /soft/code/;
            # 缓存三天
            expires 3d;
    }

    保存重新加载配置文件 nginx -s reload 打开网站图片测试一下

    3、网络IO事件模型优化

    nginx的连接处理机制在于不同的操作系统会采用不同的I/O模型,Linux下,nginx使用epoll的I/O多路复用模型,在freebsd使用kqueue的IO多路复用模型,在solaris使用/dev/pool方式的IO多路复用模型,在windows使用的icop等等。

    打开nginx配置文件 nginx.conf 里面添加

    events {
        use epoll;
        # 限制每个进程处理多少个连接请求
        worker_connections  1024;
    }

    4、隐藏版本号和源码包修改名称和版本号

    (1)隐藏版本号

    nginx每个版本都用漏洞,即使最新版也是暂时没有漏洞,不可能实时更新到最新版。为了防被被人针对版本漏洞攻击web服务器,有必要隐藏nginx版本号

    先用 curl -I 网站域名 检测一下 Server 里面的

    打开nginx配置文件 nginx.confhttp 标签添加 server_tokens off; 就可以了

    http {
        # 隐藏nginx版本号
        server_tokens off;

    再用 curl -I 网站域名 检测一下 Server 里面的

    (2)源码包修改名称和版本号

    如果是用源码包,编译安装且未安装的,可以直接在源码包上修改版本号

    下载且解压完源码包(这里就介绍怎么下载和解压了)

    vim nginx-1.14.2/src/core/nginx.h +13

    vim nginx-1.14.2/src/http/ngx_http_header_filter_module.c +49

    vim nginx-1.14.2/src/http/ngx_http_special_response.c +36

    接下来就是编译安装nginx,再用 curl -I 网站域名 检测一下

    5、防盗链优化

    盗链指的是在自己的界面展示不在自己服务器上的内容,通过技术手段获得他人服务器的资源地址,绕过别人资源展示页面,在自己页面向用户提供此内容,从而减轻自己服务器的负担,因为真实的空间和流量来自别人服务器

    防盗链 valid_referers 参数

    none : 允许没有http_refer的请求访问资源;
    blocked : 允许不是http://开头的,不带协议的请求访问资源;
    119.28.190.215 : 只允许指定ip来的请求访问资源;

    在nginx配置文件 server 标签里加入下面内容

    # 匹配后缀是jpg格式的图片(有一样的匹配科技直接在里面写)
    location ~ .*.jpg$ {
            valid_referers none blocked www.songguoyou.com;
            if ($invalid_referer) {
                    return 403;
            }
    }

    保存重新加载配置文件 nginx -s reloadcurl -e "域名网站" 测试一下

    # 用自己网站域名访问
    [root@nginx ~]# curl -I -e "http://www.songguoyou.com" http://www.songguoyou.com/wp-content/test/test.jpg
    HTTP/1.1 200 OK
    Server: nginx
    Date: Wed, 27 Feb 2019 07:17:10 GMT
    Content-Type: image/jpeg
    Content-Length: 19452
    Last-Modified: Sun, 10 Jun 2018 12:16:57 GMT
    Connection: keep-alive
    ETag: "5b1d16b9-4bfc"
    Accept-Ranges: bytes
    
    # 用别人网站域名访问
    [root@nginx ~]# curl -I -e "http://www.baidu.com" http://www.songuoyou.com/wp-content/test/test.jpg
    HTTP/1.1 403 Forbidden
    Server: nginx
    Date: Wed, 27 Feb 2019 07:17:14 GMT
    Content-Type: text/html; charset=utf-8
    Content-Length: 146
    Connection: keep-alive

    6、nginx不记录不需要的日志

    在实际工作中,对于负载均衡器健康检查节点或某些特定的文件(图片、JS、CSS)的日志,一般不需要记录下来,因为在统计PV时是按照页面计算的,而且日志写入的太频繁会消耗磁盘i/o,降低服务的性能

    在nginx配置文件 server 标签里加入下面内容

    location ~ .*.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF)$ {
        access_log off;
    }

    7、限制上传到资源目录的程序被访问,防止木马入侵系统破坏文件

    网站都是以用户为中心的,这些产品有一些共同点,就是不允许用户发布内容到服务器,还允许用户发图片甚至附件上传到服务器上,给用户开启了上传的功能。带来了很大的安全隐患。

    (1)根据扩展名限制程序和文件访问

    在nginx配置文件 server 标签中禁止访问上传资源目录下的PHP,SHELL,PERL,PYTHON程序文件,这样就算是用户上传了木马文件也没办法执行

    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服务配置的前面

    (2)禁止访问指定目录下的所有文件和目录

    配置禁止访问指定的单个或多个目录

    location ~ ^/(static)/ {
            deny all;
    }
    
    location ~ ^/static {
            deny all;
    }

    禁止访问目录并且返回代码404

    location /static/ {
            return 404;
    }

    8、FastCGI参数buffer和cache配置文件的优化

    打开nginx配置文件 nginx.conf 里面添加或者用include引用

    fastcgi_connect_timeout 240; # Nginx和FastCGI连接超时时间
    fastcgi_send_timeout 240; # Nginx允许FastCGI返回数据超时时间
    fastcgi_read_timeout 240; # Nginx从FastCGI读取响应信息超时时间
    fastcgi_buffer_size 64k; # 读取fastCGI应答第一部分需要多大缓冲区
    fastcgi_buffers 4 64k; # 设定用来读取从FastCGI端收到响应信息的缓冲区大小和数量
    fastcgi_busy_buffers_size 128k; # 用于设置系统很忙时可以使用的proxy_buffers大小
    fastcgi_temp_file_write_size 128k; # FastCGI临时文件的大小
    # fastcti_temp_path /data/ngx_fcgi_tmp; # 从其他服务器传送临时文件存放路径
    fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 缓存目录(手动创建)

    9、php.ini和php-fpm.conf配置文件的优化

    调高linux内核打开文件数量,可以使用这些命令(必须是root帐号)

    echo `ulimit -HSn 65535` >> /etc/profile
    echo `ulimit -HSn 65535` >> /etc/rc.local
    source /etc/profile

    如果ulimit -n数量依旧不多的话, 可以在 /etc/security/limits.conf 文件最后加上

    * soft nofile 51200
    * hard nofile 51200

    (1)php-fpm参数调优

    www 池里的优化

    user = nginx # 进程的发起用户(和web容器同一个用户)
    group = nginx #进程的发起用户组(和web容器同一个用户组)
    # listen = 127.0.0.1:9000 # 监听ip端口(我这里用的socket方式访问,所以注释了)
    listen = /dev/shm/php-fastcgi.sock
    listen.owner = nginx
    listen.group = nginx
    listen.mode = 0666
    # unix socket设置选项,如果使用tcp方式访问,上面四行注释即可
    listen.allowed_clients = 127.0.0.1
    pm = dynamic; # 表示使用(dynamic|static)两种进程数量管理方式
    pm.max_children = 300 # 静态下开启的php-fpm进程数量(pm=static生效)
    pm.start_servers = 20  # 动态下的起始php-fpm进程数量(pm=dynamic生效)
    pm.min_spare_servers = 5 # 动态下的最小php-fpm进程数量(pm=dynamic生效)
    pm.max_spare_servers = 35 # 动态下的最大php-fpm进程数量(pm=dynamic生效)
    pm.max_requests = 10240 # 表示使用最大请求数
    request_terminate_timeout = 30 # 最大执行时间, 在php.ini中也可以进行配置(max_execution_time)
    request_slowlog_timeout = 2 # 开启慢日志
    slowlog = log/$pool.log.slow # 慢日志路径
    rlimit_files = 1024 # 增加php-fpm打开文件描述符的限制

    nginx和php连接配置

    location ~ .php$ {
    #       fastcgi_pass   127.0.0.1:9000; # 监听ip端口(我这里用的socket方式访问,所以注释了)
            fastcgi_pass   unix:/dev/shm/php-fastcgi.sock;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /soft/code/wordpress$fastcgi_script_name;
            include        fastcgi_params;

    (2)php-ini配置优化

    safe_mode = On # 启用安全模式
    safe_mode_exec_dir = Off # 关闭用户组安全(启动安全模式自动关闭,但最好设为关闭)
    disable_functions = passthru,exec,system,popen,chroot,escapeshellcmd,escapeshellarg # 禁用危险函数
    expose_php = Off # # 隐藏php版本号
    register_globals = Off # 关闭注册全局变量
    magic_quotes_pgc = On # 转换SQL命令,防止SQL注入
    display_errors = Off # 关闭错误信息提示,防止信息泄露
    log_errors = On # 打开错误日志
    max_execution_time = 30 # 最大执行时间, 在php-fpm中也可以进行配置(request_terminate_timeout)
    memory_limit = 128M # 脚本使用的最大内存
    max_input_time = 60 # 每个脚本等待输入数据最长时间(秒),-1表示不限制
    upload_max_filesize = 2M # 上传文件的最大许可大小
    allow_url_fopen = Off # 禁止打开远程地址
    cgi.fix_pathinfo=0 # 防止Nginx文件类型错误解析漏洞
    session.save_handler = files # 会话默认为文件("files")
    # 自定义的处理器(如基于数据库的处理器),可用"user"
    # 设为"memcache"则可以使用memcache作为会话处理器(需要指定"--enable-memcache-session"编译选项)
    session.save_path = "/tmp" # 会话保存路径
    # 配置memcache
    # session.save_handler = memcache
    # session.save_path = "tcp://127.0.0.1:11211"

    php-ini优化模板

    10、开启高效文件传输模式(零拷贝)

    sendfile系统调用在两个文件描述符之间直接传递数据(完全在内核中操作),从而避免了数据在内核缓冲区和用户缓冲区之间的拷贝,操作效率很高,被称之为零拷贝。

    http {
        # 零拷贝
        sendfile      on;
        # 启用TCP_CORK,建议打开,需要打开sendfile。默认关闭
        tcp_nopush    on;
        # 禁用Nagle算法,建议打开,需要打开keepalived。默认关闭
        tcp_nodelay   on;
    }

    11、阿里云nginx加密传输优化(SSL)

    HTTP容易传输数据被中间人盗用, 信息泄露露和数据内容劫持, 篡改等,所以使用HTTPS

    配置苹果要求的证书

    1.服务器器所有连接使用TLS1.2以上版本(openssl 1.0.2)
    2.HTTPS证书必须使用SHA256以上哈希算法签名
    3.HTTPS证书必须使用RSA 2048位或ECC256位以上公钥算法
    4.使用前向加密技术

    12、CPU亲和

    是把进程绑定到相应的CPU内核上,减少进程之间不断频繁迁移,也减少CPU性能损耗

    可以用 lscpu|grep "CPU(s)" 命令查看物理状态,多少核心

    nginx.conf 的最外面添加下面两行

    worker_processes auto;
    worker_cpu_affinity auto;

    保存重新加载配置文件后,用 ps -eo pid,args,psr|grep [n]ginx 查看 nginx worker 绑定情况

    最后来个 Nginx 通用优化配置文件

    user  nginx;
    # CPU亲和
    worker_processes  auto;
    worker_cpu_affinity auto;
    
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    
    events {
        use epoll;
        # 限制每个进程处理多少个连接请求
        worker_connections  1024;
    }
    
    
    http {
        # 隐藏nginx版本号
        server_tokens off;
    
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        # 统一使用utf-8字符集
        charset utf-8;
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
        # 零拷贝
        sendfile      on;
        # 启用TCP_CORK,建议打开,需要打开sendfile。默认关闭
        tcp_nopush    on;
        # 禁用Nagle算法,建议打开,需要打开keepalived。默认关闭
        tcp_nodelay   on;
        keepalive_timeout  65;
        # 打开压缩模块
        gzip on;
        # 最小多少就不压缩了
        gzip_min_length 1k;
        # buffer缓冲
        gzip_buffers 4 16k;
        # 使用http那个版本。有1.0和1.1,主流是1.1
        gzip_http_version 1.1;
        # gzip压缩率。有1到9,数字越大压缩比例越大,同时耗费性能越大
        gzip_comp_level 2;
        # 进行压缩的文件类型
        gzip_types text/plain application/json application/x-javascript application/css application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        # no Vary
        gzip_vary off;
        # IE1到6不支持压缩,这里就把它踢出去了
        gzip_disable "MSIE [1-6].";
        fastcgi_connect_timeout 240; # Nginx和FastCGI连接超时时间
        fastcgi_send_timeout 240; # Nginx允许FastCGI返回数据超时时间
        fastcgi_read_timeout 240; # Nginx从FastCGI读取响应信息超时时间
        fastcgi_buffer_size 64k; # 读取fastCGI应答第一部分需要多大缓冲区
        fastcgi_buffers 4 64k; # 设定用来读取从FastCGI端收到响应信息的缓冲区大小和数量
        fastcgi_busy_buffers_size 128k; # 用于设置系统很忙时可以使用的proxy_buffers大小
        fastcgi_temp_file_write_size 128k; # FastCGI临时文件的大小
        # fastcti_temp_path /data/ngx_fcgi_tmp; # 从其他服务器传送临时文件存放路径
        fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g; # 缓存目录(手动创建)
        include /etc/nginx/conf.d/*.conf;
    }
  • 相关阅读:
    python-字典
    C#公历转农历算法
    GridView控件显示图片
    SQLite DBHelp
    面向服务体系结构:适用于敏捷的系统
    针对 .NET 框架的安全编码指南
    Microsoft .NET Pet Shop 4
    C#.NET数据库访问类DBHelper
    Emgu CV 高斯建模
    .NET代码编写规范 整理
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11883183.html
Copyright © 2020-2023  润新知