zoukankan      html  css  js  c++  java
  • nginx常用优化

    隐藏Nginx版本号!(重点)

    在生产环境中,需要隐藏 Nginx 的版本号,以避免安全漏洞的泄漏

    一旦有黑客知道Nginx版本号便可以利用Nginx漏洞进行攻击,严重影响到了公司的安全

    查看隐藏版本号命令:curl -I http://ip地址

    ========================================================

    安装Nginx后查看:

    [root@localhost nginx-1.16.0]# curl -I http://192.168.200.120
    HTTP/1.1 200 OK
    Server: nginx/1.16.0
    Date: Thu, 12 Sep 2019 03:55:10 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Thu, 12 Sep 2019 01:08:46 GMT
    Connection: keep-alive
    ETag: "5d799a9e-264"
    Accept-Ranges: bytes

    隐藏方法1【基于源码包】:(安装Nginx后要修改文件必须先卸载Nginx再安装)

    [root@localhost ~]# killall -9 nginx                                            //杀死nginx进程
    [root@localhost ~]# rm -rf /usr/local/nginx/     
    [root@localhost ~]# cd /usr/src/nginx-1.16.0/
    [root@localhost nginx-1.16.0]# make clean
    rm -rf Makefile objs                                                                
    [root@localhost nginx-1.16.0]# cd
    [root@localhost ~]# rm -rf /usr/src/nginx-1.16.0/                    //卸载完成

    [root@localhost ~]# tar xf nginx-1.16.0.tar.gz -C /usr/src

    [root@localhost ~]# cd /usr/src/nginx-1.16.0/

    [root@localhost nginx-1.16.0]# vim src/core/nginx.h

    修改文件前图示:

    修改文件后图示:

    [root@localhost nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module

    [root@localhost nginx-1.16.0]# make

    [root@localhost nginx-1.16.0]# make install

    [root@localhost nginx-1.16.0]# curl -I http://192.168.200.120
    curl: (7) Failed connect to 192.168.200.120:80; 拒绝连接
    [root@localhost nginx-1.16.0]# netstat -anpt | grep nginx
    [root@localhost nginx-1.16.0]# nginx
    [root@localhost nginx-1.16.0]# netstat -anpt | grep nginx
    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 21446/nginx: master 
    [root@localhost nginx-1.16.0]# curl -I http://192.168.200.120
    HTTP/1.1 200 OK
    Server: apache/2.4.31
    Date: Thu, 12 Sep 2019 04:15:38 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Thu, 12 Sep 2019 04:13:25 GMT
    Connection: keep-alive
    ETag: "5d79c5e5-264"
    Accept-Ranges: bytes

     方法2【修改配置文件】(不卸载Nginx隐藏版本号,直接修改配置文件)

    [root@localhost nginx-1.16.0]# curl -I http://192.168.200.115                           
    HTTP/1.1 200 OK  
    Server: nginx/1.16.0                                                                               //原版本号
    Date: Thu, 12 Sep 2019 05:38:07 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Thu, 12 Sep 2019 05:37:35 GMT
    Connection: keep-alive
    ETag: "5d79d99f-264"
    Accept-Ranges: bytes

    [root@localhost nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf

    在sendfile on;后添加一行命令:

    server_tokens off;

    [root@localhost nginx-1.16.0]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

    [root@localhost nginx-1.16.0]# killall -HUP nginx                                     //重新加载配置
    [root@localhost nginx-1.16.0]# curl -I http://192.168.200.115                  
    HTTP/1.1 200 OK
    Server: nginx                                                                                            //修改后的版本号
    Date: Thu, 12 Sep 2019 05:45:43 GMT
    Content-Type: text/html
    Content-Length: 612
    Last-Modified: Thu, 12 Sep 2019 05:37:35 GMT
    Connection: keep-alive
    ETag: "5d79d99f-264"
    Accept-Ranges: bytes

    修改Nginx用户和组!

    Nginx 运行时进程需要有用户与组的支持,以实现对网站文件读取时进行访问控制。
    Nginx 默认使用 nobody 用户账号与组账号,一般也要进行修改。

    ========================================================

    1:编译安装时指定

    [root@localhost conf]# useradd -M -s /sbin/nologin nginx

    [root@localhost nginx-1.16.0]# tail -l /etc/passwd;tail -l /etc/group

    [root@localhost ~]# tar xf nginx-1.16.0.tar.gz -C /usr/src
    [root@localhost ~]# cd /usr/src/nginx-1.16.0/

    [root@localhost nginx-1.16.0]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install

    2:修改配置文件

    [root@localhost nginx-1.16.0]# vim /usr/local/nginx/conf/nginx.conf

    修改:

    user  nginx nginx;               
    worker_processes  2;
    

    [root@localhost nginx-1.16.0]# nginx -t
    nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
    [root@localhost nginx-1.16.0]# killall -s HUP nginx
    nginx: no process found
    [root@localhost nginx-1.16.0]# nginx
    [root@localhost nginx-1.16.0]# killall -s HUP nginx
    [root@localhost nginx-1.16.0]# ps -aux | grep nginx
    root 22334 0.0 0.2 151560 5068 pts/1 T 13:33 0:00 vim /usr/local/nginx/conf/nginx.conf
    root 25663 0.0 0.0 20692 1392 ? Ss 14:40 0:00 nginx: master process nginx
    nginx 25667 0.0 0.0 23208 1488 ? S 14:40 0:00 nginx: worker process
    nginx 25668 0.0 0.0 23208 1488 ? S 14:40 0:00 nginx: worker process
    root 25678 0.0 0.0 112724 992 pts/1 S+ 14:41 0:00 grep --color=auto nginx

     配置nginx查看用户访问量:

    编译时启用--with-http_stub_status_module模块:

    [root@localhost ~]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install

    主配置文件加入:

    [root@localhost conf]# vim nginx.conf

    location /status {
          stub_status on;
          access_log off;
    }

    配置Nginx网页缓存时间!(重点

    当 Nginx 将网页数据返回给客户端后,可设置缓存的时间,以方便在日后进行相同内容
    的请求时直接返回,以避免重复请求,加快了访问速度,一般针对静态网页进行设置,对动
    态网页不用设置缓存时间。可在 Windows 客户端中使用 fiddler 查看网页缓存时间。
    设置方法:
    在 可修改配置文件,在 http 段、或 server 段、或者 location 段加入对特定内容的过期参
    数。

    ====================================================================

    [root@localhost html]# vim /etc/nginx.conf 

    
    

    user nginx nginx;
    worker_processes 2;

    
    

    error_log logs/error.log;
    error_log logs/error.log info;

    
    

    pid logs/nginx.pid;

    
    


    events {
           use epoll;
           worker_connections 10240;
    }

    http {
          include mime.types;
          default_type application/octet-stream;

    
    

           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 logs/access.log main;
             sendfile on;
             server_tokens off;
             keepalive_timeout 65;

    
    

    server {
            listen 80;

            server_name localhost;

             charset utf-8;


    location / {
             root html;
             index index.html index.htm;
    }

    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {            
                expires      30d;        
            }        
            location ~ .*.(js|css)?$ {              
                expires      1h;        
            } 


    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    root html;
         }

       }

    }

    [root@localhost nginx-1.16.0]# cd
    [root@localhost ~]# cd /usr/local/nginx/html/

    导入图片
    [root@localhost html]# rz
    z waiting to receive.**B0100000023be50
    [root@localhost html]# ls
    50x.html index.html linux.jpg

    [root@localhost html]# vim index.html

    在尾部添加如下代码:

    <p><em>Thank you for using nginx.</em></p>
    <img src='linux.jpg'/>
    </body>
    </html>
    ~                 

    [root@localhost html]# killall -s HUP nginx                           //重启配置

     

    Nginx为目录添加访问控制!

    用户访问控制:使用apache的htpasswd来创建密码文件!

    因为nginx没有创建密码文件的指令,所以必须利用apache下的一个叫htpasswd(httpd-tools)来创建密码文件,

    但是不能开启httpd服务,避免httpd服务与nginx服务抢占80端口

    虚拟机IP:192.168.200.115

    第一步:安装httpd-tools服务

    [root@localhost ~]# yum -y install httpd-tools

    [root@location ~]#cd /usr/local/nginx/conf

    第二步:创建一个文件用于接收用户及密码

    [root@location conf]#touch user.txt

    [root@localhost conf]# htpasswd -c /usr/local/nginx/conf/user.txt tom
    New password: 123123
    Re-type new password: 123123
    Adding password for user tom

    [root@localhost conf]# cat /usr/local/nginx/conf/ user.txt
    tom:$apr1$JmLhDuwD$GPM8zM504TP9F0eDfHT101

    第三步:修改主配置文件(摘要认证)

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    在server下再添加一个location如下命令

    location /tom { stub_status on; access_log off; auth_basic "Nginx Tom"; auth_basic_user_file /usr/local/nginx/conf/user.txt; }

    在网页中输入192.168.200.115/tom

     

    客户端访问控制!

     allow 192.168.200.0/24;          允许192.168.200.0的网段访问

     deny  192.168.200.0/24;          禁止192.168.200.0的网段访问

    实现Nginx的日志分割!(重点)

    时间越久内存占用率越高,高并发量,会给服务器带来巨大的缓存压力

    解决方法:创建一个新的目录,设置周期性计划定期的将旧目录里面的日志移动到新目录中,一般只保存30天内,30天后一律删除

    [root@localhost ~]# date "+%Y%m%d"                                  //今天的时间
    20190913
    [root@localhost ~]# date -d "-1 day" "+%Y%m%d"                //昨天的时间
    20190912

    =====================================================================================

    [root@localhost ~]# vim /opt/cut_nginx_log.sh

    #!/bin/bash
    #cut_nginx_log.sh
    
    datetime=$(date -d "-1 day" "+%Y%m%d")        //时间,date -d "-1 day"代表日期减1
    log_path="/usr/local/nginx/logs"             //日志的存放位置
    pid_path="/usr/local/nginx/logs/nginx.pid"   //进程的PID号,有PID号代表 进程还活着
    [ -d $log_path/backup ] || mkdir -p $log_path/backup   //如果$log_path/backup不是一个目录则创建$log_path/backup目录
    if [ -f $pid_path ]                                //如果$pid_path是一个文件
    then
    mv $log_path/access.log $log_path/backup/access.log-$datetime  //那么移动旧日志的文件到新目录下以此来实现分割
    kill -USR1 $(cat $pid_path)                                    //USR1代表信号,他会给进程传一个信号让进程生成一个新的日志
    find $log_path/backup -mtime +30 | xargs rm -f                //查找30天前的日志并删除
    else
    echo "Error,Nginx is not working!" | tee -a /var/log/messages  //否则提示nginx is not working且追加到日志中
    fi

    [root@localhost ~]# chmod +x /opt/cut_nginx_log.sh 
    [root@localhost ~]# bash /opt/cut_nginx_log.sh 
    [root@localhost ~]# cd /usr/local/nginx/logs/
    [root@localhost logs]# ls
    access.log   backup  error.log  nginx.pid
    [root@localhost logs]# ls backup/
    access.log-20190912

    [root@localhost ~]# crontab -e
    crontab: installing new crontab
    [root@localhost ~]# crontab -l
    0    0   *    *    *     bash /opt/cut_nginx_log.sh            //每月每周每天的0时0分执行脚本     

    当未运行时!

    [root@localhost logs]# killall -9 nginx
    [root@localhost logs]# bash /opt/cut_nginx_log.sh 
    /opt/cut_nginx_log.sh: 第 11 行:kill: (8282) - 没有那个进程
    [root@localhost logs]# rm -rf /usr/local/nginx/logs/nginx.pid 
    [root@localhost logs]# bash /opt/cut_nginx_log.sh 
    Error,Nginx is not working!

    配置Nginx实现连接超时及修改进程数!

    在企业网站中,为了避免同一个客户长时间占用连接,造成资源浪费,可以设置相应的
    连接超时参数,实现控制连接访问时间。
    keepalived_timeout :设置连接保持超时时间,一般可只设置该参数,默认为 75 秒,可根据
    网站的情况设置,或者关闭,可在 http 段、server 段、或者 location 段设置。
    client_header_timeout :指定等待客户端发送请求头的超时时间。
    client_body_timeout :设置请求体读超时时间。
    若出现超时,会返回 408 报错

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    在http中添加如下三条命令
    keepalive_timeout  65; //等待请求时间为65秒、超过65秒服务器自动断开连接
    client_header_timeout 60; //等待客户端的头部超时时间为60秒
    client_body_timeout 60; //等待客户端的主体超时时间为60秒

     [root@localhost ~]# killall -s HUP nginx

    ===================================================================

    在高并发场景,需要启动更多的 nginx 进程以保证快速影响,以处理用户的请求,避免
    造成阻塞

    修改配置文件的 worker_processes  参数,一般设置为 CPU  的个数或者核数的 2  倍

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    worker_processes  2;                             //cpu核数

    worker_cpu_affinity 0001 0010             //cpu分配

    配置Nginx实现网页压缩功能!

    Nginx的nginx_http_gzip_module压缩提供了对文件内容进行压缩的功能,允许Nginx服务器将输出内容2发送到客户端之前进行压缩,这样文件内容变小传输速度变快,以便于节约网站的带宽,提升用户体验,模块默认已经安装!

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

     gzip on;
        #gzip _min_length 1k;
        gzip_buffers 4 16k;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain text/javascript application/x-javascrip t text/css text/xml
    application/xml application/xml+rss;

    [root@localhost ~]# nginx -t

    [root@localhost ~]# killall -s HUP nginx


    配置Nginx实现防盗链功能!及Nginx Rewrite规则(重点)

    准备两台Linux,用第二台linux主机来通过拿第一台主机的图片链接来展现图片;

    因为主机2是通过主机1拿的图片链接所以当别人都通过链接访问图片时,占用的是主机一的内存空间,而不是占用主机2的内存空间

    A)设定主机一为本公司的服务器,一旦非本公司人员通过链接去访问图片时,会对服务器造成内存压力。因此要设置非本公司人员不能通过链接访问。

    此处用的是域名方式

    解决方法,主机一做防盗链功能可以有效的阻止非本公司人员访问图片。以造成内存压力-------》这样主机2将访问不到图片即使有图片链接

    第一台Ip地址为:192.168.200.115

    第二台ip地址值为:192.168.200.105

    未添加图片前只有字母:

    改动index.html添加图片:

    [root@localhost ~]# cd /usr/local/nginx/html/
    [root@localhost html]# ls
    50x.html    index.html
    [root@localhost html]# vim index.html

    在p段落下添加图片链接
    <img src="http://192.168.200.115/linux.jpg" />

    添加图片后



    在主机1中的server下添加如下命令

    [root@localhost ~]# vim /usr/local/nginx/html/error.txt

    <h1>盗链可耻</h1>

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    location ~* .(jpg|gif|png|swf)$ {
          #*.amber.com amber.com相当于公司域名
          expires 1d;
          root html;
          valid_referers none blocked *.source.com source.com;
          if ($invalid_referer) {
          rewrite ^/ http://www.source.com/error.txt;
       }
    }

    error_page 500 502 503 504 /50x.html;
         location = /50x.html {
         root html;
        }

       }
    }

    [root@localhost ~]# killall -9 nginx                             //杀死nginx进程
    [root@localhost ~]# nginx                                          //开启nginx进程
    [root@localhost ~]# killall -HUP nginx                      //重新加载

    ================================================================================

    真机改动hosts文件:hosts文件所在(C盘中windows、system32、drivers、etc中)

    文件内容改动如下:

    192.168.200.115 www.source.com
    192.168.200.105 www.steal.com

    =================================================================================

    主机一、主机二浏览器访问对比

    www.source.com页面需要强制刷新按(shift+fn+f5)

    www.sttal.com页面需要强制刷新按(shift+fn+f5)

     =====================================================================================

    自定义错误页面

    [root@localhost ~]#vim /etc/hosts

    192.168.200.115 www.source.com

    第一步:自定义错误页面需先准备好错误图片(这里定义error.jgp图片)

    第二步:修改主配置文件:

    [root@localhost html]# ls
    40x.html      50x.html      error.jpg       index.html      linux.jpg     trror.txt

    [root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf

    添加如下命令,这是一个自定义的404 401 403 408错误页面且

    error_page 403 404 401 408 /40x.html; //一旦页面报404 401 403 408错误让他去寻找40x.html
    location = /40x.html {           //location匹配40x.html找html
    root html;
    }

    结果如图所示:

     

  • 相关阅读:
    jquery 的 ajax 在 非阻塞 时返回 XMLHttpRequest
    关于TransactionScope出错:“与基础事务管理器的通信失败”的解决方法总结
    未能正确加载“radlangsvc.package,radlangsvc.vs,version=10.0.0,culture=neutra
    跨域iframe高度自适应(兼容IE/FF/OP/Chrome)
    Windows8不联网直接安装.Net 3.5 Framework的方法
    ubuntu创建、删除文件及文件夹,强制清空回收站方法
    Ubuntu java 环境变量
    mysql 和mssql2016中的json字段相关操作
    Windows任务计划
    配置mysql远程访问
  • 原文地址:https://www.cnblogs.com/CMX_Shmily/p/11531474.html
Copyright © 2011-2022 走看看