Nginx优化解决问题

Posted y_zilong

tags:

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

1、nginx反向代理屏蔽,所有连接请求中断,返回444

 location /admin/ 
   
       #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移
       proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
       
       proxy_pass http://admin;
       
       #把原http请求的Header中的Host字段也放到转发的请求里,代理的后端服务器可以通过Host头得知用户访问的真正的域名,如不设置,则得到是代理服务(nginx)的IP,这样对于动态拼接的url,后端服务器能在页面里返回正确的url
       proxy_set_header HOST $host;
       
       #透传客户端真实IP地址
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       
       #通过nginx设置HttpOnly Secure SameSite参数解决Cookie跨域丢失
       proxy_cookie_path / "/; httponly; secure; SameSite=Lax";
       
       #deny all;
       
       #过滤其他域名的请求,返回444状态码
       return 444;     
   
   

2、nginx log文件 json格式配置

 log_format main  '"DateTime":"$time_iso8601",' 
                      '"client":"$remote_addr",'               客户端的ip地址
                      '"uri":"$uri",'
                      '"status":"$status",'
                      '"domain":"$host",'
                      '"host":"$server_addr",'
                      '"size":"$body_bytes_sent",'             发送给客户端文件主体内容大小
                      '"rt":"$request_time",'
                      '"urt":"$upstream_response_time",'
                      '"uct":"$upstream_connect_time",'
                      '"uht":"$upstream_header_time",'
                      '"useragent":"$http_user_agent",'        客户端浏览器的相关信息
                      '"upstreampstatus":"$upstream_status",'
                      '"upstreamaddr":"$upstream_addr",'
                      '"AC-LogTypeID":10,'
                      '"AC-TraceId":"$upstream_http_x_b3_traceid",'
                      '"AC-LogType":"proxy-log-type"'
                      '';

                     '"request": "$request",'                请求的url与http协议
                     '"request_method": "$request_method",'
                     '"uri": "$uri", '
                     '"http_referrer": "$http_referer",'      从那个页面链接访问过来的
                     '"http_x_forwarded_for": "$http_x_forwarded_for",'  客户端真实ip地址

  access_log  /apps/usr/nginx/logs/access_cronlog.log  main;
  
  
#什么是remote_addr
remote_addr 是服务端根据请求TCP包的ip指定的。假设从client到server中间没有任何代理,那么web服务器(nginx,apache等)就会把client的ip设为IPremote_addr;如果存在代理转发http请求,web服务器会把最后一次代理服务器的IP设置为remote_addr;

#什么是x_forwarded_for
当使用代理时,web服务器无法通过TCP数据包来源获得发起请求的client的真实IP,因此代理服务器通常会在http请求头增加一个叫做x_forwarded_for的字段,用来记录请求发起者的真实IP;

3、nginx安装需要指定的模块

--user=mms --group=mms --prefix=/apps/usr/nginx --error-log-path=/apps/var/nginx/error.log --http-log-path=/apps/var/nginx/access.log --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_gzip_static_module --with-http_realip_module


--with-http_stub_status_module     #nginx的客户端状态 
--with-http_ssl_module           #ssl加密
--with-http_sub_module           #web站点内容过滤功能模块
--with-http_gzip_static_module   #预读gzip功能
--with-http_realip_module        #在nginx访问日志中去除代理IP,显示客户的真实IP

4、NGINX跨域

location /datang-h5/ 
            add_header Access-Control-Allow-Origin *;
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
            add_header 'Access-Control-Allow-Headers' 'DNT,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';

            proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
            proxy_pass http://datang-h5/;
            proxy_set_header HOST $host:18091;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            if ($request_method = 'OPTIONS') 
               add_header 'Access-Control-Max-Age' 1728000;
               add_header 'Content-Type' 'text/plain; charset=utf-8';
               add_header 'Content-Length' 0;
               return 204;
            
        

5、Nginx支持ipv6配置

#需要–with-ipv6模块
#https ipv6地址需要解析
server 
   listen [::]:80 ipv6only=on;



server 
    listen [::]:443 ssl ipv6only=on;



访问格式:
https://[fe80::fc44:6e5e:eeda:ebac]:443

6、Nginx IP鉴权

#通过allow 
        location /api/v1 
            proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
            proxy_pass http://api-zuul;
            proxy_set_header HOST $host;
            #proxy_set_header X-Real-IP $remote_addr;
            #proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #proxy_set_header X-Forwarded-For $http_x_forwarded_for;
            #proxy_set_header X-Forwarded-For $remote_addr;
            set_real_ip_from  0.0.0.0/0;
            real_ip_header  X-Cluster-Client-IP;
            allow 43.225.211.91;
            allow 112.33.12.149;
            allow 218.205.209.238;
            allow 203.130.42.149;
            allow 223.104.17.213;
            allow 112.35.69.29;
            allow 112.35.69.101;
            allow 124.64.17.188;
            allow 113.46.147.67;
            allow 120.244.174.135;
            #deny all;
nginx 获取真实ip,将 release 环境 nginx 相关配置修改为(其中100.125.0.0/16为SLB所在网段)

              set_real_ip_from 0.0.0.0/0;
              set_real_ip_from 100.125.0.0/16;
              real_ip_header X-Forwarded-For;

              allow 223.72.211.85;
              #allow 10.128.12.0/24;
              allow 218.205.209.238;
              allow 221.179.195.93;
              deny all;
              
              
4、七层SLB + http_realip_module 模块测试
4.1、将 release 环境 nginx 相关配置修改为(其中100.97.0.0/16为SLB所在网段):
set_real_ip_from 100.97.0.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

 7、nginx日志分割

[3::root@zmms-2::/apps/opt]# >>>cat nginx_log.sh 
#!/bin/bash
#设置日志文件存放目录
LOG_HOME="/apps/usr/nginx1196/logs"
#备分文件名称
LOG_PATH_BAK="$(date -d yesterday +%Y%m%d%H%M)".access.log
#重命名日志文件
mv $LOG_HOME/access.log $LOG_HOME/$LOG_PATH_BAK
#向nginx主进程发信号重新打开日志
kill -USR1 `cat /apps/usr/nginx1196/logs/nginx.pid`

#计划时钟
crontab -e
00 02 * * * (cd /apps/opt ; sh -x nginx_log.sh      > /apps/opt/TempFile/Crony_nginx_log.logzip 2>&1)
30 02 * * * (cd /apps/opt ; sh -x backup_nginx.sh   > /apps/opt/TempFile/Crony_nginx1196.logzip 2>&1)

8、nginx备份脚本

[4::root@zmms-2::/apps/opt]# >>>cat backup_nginx.sh 
#!/bin/bash

TempFilePath=$ProcessPath/TempFile
ip_str=`ifconfig |grep '10.56.0' |awk 'print $2'`
logpath=/baklog/10.56.0.2/
LogPathAll="/apps/usr/nginx1196/logs/"

mkdir -m 755 -p /baklog/10.56.0.2/nginx1196/

for LogPath in $LogPathAll
do
cd $LogPath
#find ./ -maxdepth 1 -type f -name "*.20??[-_]??[-_]?*[0-9,g]"  | xargs gzip
#find ./ -maxdepth 1 -type f -name "*-20??[-_]??[-_]?*[0-9,g]"  | xargs gzip
#find ./ -maxdepth 1 -type f -name "*_20??[-_]??[-_]?*[0-9,g]"  | xargs gzip
find /apps/usr/nginx1196/logs/ -maxdepth 1 -type f -name "*20*"  | xargs gzip
done

chown mms:mms /apps/usr/nginx1196/logs/20*
mv $LogPathAll*.gz /baklog/10.56.0.2/nginx1196/

find $logpath -type f -mtime +365 |xargs rm -rf

9、防盗链

放盗链:   
        location ~* ^.+\\.(gif|jpg|png|swf|flv|rar|zip)$ 
            valid_referers none blocked www.baidu.com;
            if ($invalid_referer) 
               rewrite ^/ [img]http://yzil.cn[/img];
               return 403;
            
          

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

Nginx页面图片错误 ERR_CONTENT_LENGTH_MISMATCH

[NGINX] - 配置文件优化 - NGINX.CONF

Nginx服务优化

[Nginx] – 配置优化 – NGINX.CONF [三]

企业级Web Nginx 服务优化

企业级Nginx服务基础到架构优化详解