nginx 安全加固

2022-03-11
-
-

隐藏Nginx服务及版本

#方式1:
#vi nginx-1.9.11/src/http/ngx_http_header_filter_module.c
static char ngx_http_server_string[] = "Server: LTWS" ; #修改处

#修改nginx_http_header_filter_module
#vi nginx-1.9.11/src/http/ngx_http_special_response.c
static u_char ngx_http_error_full_tail[] =
"<center> NGINX_VER </center>" 
"<hr><center> http://www.weiyigeek.com</center>" 
"</body>" 
"</html>" 
;

static u_char ngx_http_error_tail[] ="<hr><center>LTWS</center>" "</body>" "</html>";
#设置响应头版本版本
#vim src/core/nginx.h
#define NGINX_VERSION      "secWaf"            #可以改成你要的版本号
#define NGINX_VER          "1.1" NGINX_VERSION #改成你的服务名称

恶意扫描拦截

当恶意攻击者采用扫描器进行扫描时候利用use-agent判断是否是常用的工具扫描以及特定的版本,是则返回错误或者重定向;

# 封杀各种user-agent
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan|nessus|wvs" ) {
    return 403;
}

if ($http_user_agent ~* "" ) {
    return 403;
}

# 封杀特定的文件扩展名比如.bak以及目录;
location ~* \.(bak|swp|save|sh|sql|mdb|svn|git|old)$ {
  rewrite ^/(.*)$  $host  permanent;
}
location /(admin|phpadmin|status)	{ deny all; }

 

禁用WebDAV

Nginx支持webdav,虽然默认情况下不会编译。如果使用webdav,则应该在Nginx策略中禁用此规则。
加固方法: dav_methods 应设置为off

 

关闭默认错误页上的Nginx版本号

如果在浏览器中出现Nginx自动生成的错误消息,默认情况下会包含Nginx的版本号,这些信息可以被攻击者用来帮助他们发现服务器的潜在漏洞
加固方法: 关闭"Server"响应头中输出的Nginx版本号将server_tokens应设置为:off

server_tokens off 

拦截垃圾信息

HTTP Referrer Spam是垃圾信息发送者用来提高他们正在尝试推广的网站的互联网搜索引擎排名一种技术,如果他们的垃圾信息链接显示在访问日志中,并且这些日志被搜索引擎扫描,则会对网站排名产生不利影响
加固方法:

if ( $http_referer ~* (babes|forsale|girl|jewelry|love|nudit|organic|poker|porn|sex|teen) ){
  return 403;
}

 

设置client_body_timeout超时

client_body_timeout设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,就会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。
加固方法:nginx.conf文件中client_body_timeout应设置为:10

 

设置client_header_timeout

client_header_timeout设置等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1)。仅当在一次read中没有收到请求头,才会设为超时。超时后Nginx返回HTTP状态码408(Request timed out)。

加固方法:nginx.conf文件中client_header_timeout应设置为:10

 

Nginx可用的方法应限制为GET, HEAD, POST

GET和POST是Internet上最常用的方法。Web服务器方法在RFC 2616中定义禁用不需要实现的可用方法。

加固方法:

#nginx.conf文件中应存在
if ($request_method !~ ^(GET|HEAD|POST)$ )

控制并发连接limit_zone slimits

limit_zone 配置项限制来自客户端的同时连接数。通过此模块可以从一个地址限制分配会话的同时连接数量或特殊情况。

加固方法:nginx.conf文件中limit_zone应设置为:slimits $binary_remote_addr 5m

# 设定保存各个键(例如$binary_remote_addr)状态的共享内存空间的参数,zone=空间名字:大小大小的计算与变量有关
limit_conn_zone $binary_remote_addr zone=ops:10m;

控制并发连接limit_conn slimits

该配置项控制一个会话同时连接的最大数量,即限制来自单个IP地址的连接数量。

加固方法:nginx.conf 文件中 limit_conn 应设置为: slimits 5

# 表示同一IP同一时间只允许10个连接
limit_conn ops 5;

主机防webshell跨目录浏览以及列目录

加固方法:

a.在nginx.conf里把每个虚拟主机站点请求端口给区别开
b.为每个站点建一个conf,并进行配置
c.修改php-fpm启动脚本
d.启动服务

#在main-http-server段中设置开启或者关闭(对于需要列目录的则开启,否则默认是关闭的)
autoindex off

文件名解析漏洞php_info,加入fcgi.conf即可

if ($request_filename ~* (.*)\.php) {
    set $php_url $1;
}

if (!-e $php_url.php) {
    return 403;
}

访问权限控制nginx

#nginx.conf
location ~ ^/script/ {
    auth_basic "welcome to weiyigeek.github.io";
    auth_basic_user_file /var/www/test/script/.htpasswd;
}

#建立htpasswd密码进行认证
mkdir /var/www/test/script
perl -e "print crypt('baidu.eud',"n");"
nnUygd3RSf3u6

echo 'nginx:nnUygd3RSf3u6' > /var/www/test/script/.htpasswd
/usr/local/nginx/sbin/nginx -s reload

异常状态返回200隐藏URL

server{
  listen       80;
  server_name  weiyigeek.top;
  index index.html index.htm index.php;
  root  /data/web;
  error_page 404 =200 /404.jpg;
}

安全模块的选择

# 安全检测模块选择
http_sub_module
http_stub_status_module
xss-nginx-module
with-http_ssl_module

记录访问者真实IP

描述后端获取Proxy后的真实Client的IP获取需要安装--with-http_realip_module,然后后端程序采用JAVA(request.getAttribute("X-Real-IP"))进行获取;

set_real_ip_from 100.0.0.0/8;#(这里是已知的代理ip)
real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 代理转发
location / {
  proxy_pass http://weiyigeek.top
}

proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
set $Real $http_x_forwarded_for;
if ( $Real ~ (\d+)\.(\d+)\.(\d+)\.(\d+),(.*) ){
    set $Real $1.$2.$3.$4;
}
proxy_set_header X-Real-IP $remote_addr;

#区别
$proxy_add_x_forwarded_for #较下面多一个$remote_addr的(只能获取到与服务器本身直连的上层请求ip)
$http_x_forwarded_for

#日志获取
$http_x_real_ip|$remote_addr  #前提条件是cdn 那边也设置了X-forward否则获取的是cdn的ip

地区访问响应措施

描述: 如果要使用geoip地区选择,我们需要再nginx编译时加入 --with-http_geoip_module 编译参数。

# 例如,访问者IP地址不为中国或者美国的都返回403。
if ( $geoip_country_code !~  ^(CN|US)$ ) {
  return 403;
}

资源防盗链设置

描述: 为了防止外部站点引用我们的静态资源,我们需要设置那些域名可以访问我们的静态资源。

# none : "Referer" 来源头部为空的情况
# blocked : "Referer" 来源头部不为空
# server_names : "Referer"来源头部包含当前的server_names(当前域名)
location ~* \.(gif|jpg|png|swf|flv)$ { 
  valid_referers none blocked weiyigeek.top server_names ~\.google\. ~\.baidu\.; #这是可以盗链的域名或IP地址,一般情况可以把google,baidu,sogou,soso,bing,feedsky,zhuaxia,photozero等域名放进来
  if ($invalid_referer) { 
    #这样设置能够防盗链,不断地302重定向很多次,可能会加重服务器的负担,所以不建议这么做,除非有单独的图片服务器支持
    return 403; # 或者返回 403 错误代码 或者 JSON 字符串

    # 返回json
    add_header Content-Type 'application/json; charset=utf-8';
    return 200 "{'msg':'valid'}"; 
    # 本地目录重写
    rewrite ^/.*.(gif|jpg|jpeg|png)$ /static/qrcode.jpg last;
    # 重写远程URL
    rewrite ^/ https://www.weiyigeek.top/picture/images/details-image-1.jpg;

  } 
}

常规安全响应头配置

描述: 下面收集了Web服务中常规的安全响应头, 它可以保证不受到某些攻击,建议在指定的 server{} 代码块进行配置。

# HSTS (ngx_http_headers_module is required) 应该只使用 HTTPS 而不是使用 HTTP 通信
add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

# XXS-Protection
add_header X-XSS-Protection "1; mode=block";

# MIME 模拟探测
add_header X-Content-Type-Options nosniff;

# Frame 安全控制
add_header X-Frame-Options ALLOW-FROM music.163.com;

# Spider Robots 爬取策略限制
add_header X-Robots-Tag none;

# CORS 跨域设置
add_header Access-Control-Allow-Origin '*.weiyigeek.top';
add_header Access-Control-Allow-Methods 'GET';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

# CSP
# 现在让我们允许自托管 scripts、images、CSS、fonts 和 AJAX,以及 jQuery CDN 托管脚本和 Google Analytics 的内容:
Content-Security-Policy: default-src 'none'; script-src 'self' https://code.jquery.com

防止非所属域名解析到服务器

描述: 为了防止某些未备案的域名或者恶意镜像站域名绑定到我们服务器上, 导致服务器被警告关停,将会对业务或者SEO排名以及企业形象造成影响,我们可以通过如下方式进行防范。

server {
  listen 80 default_server;
  server_name 82.156.18.253;
  # 禁止搜索引擎收录IP
  add_header X-Robots-Tag 'noindex,noarchive,nosnippet';
  location ^~ / {
    # IP地址访问强制301跳转
    if ( $host = 82.156.18.253 ){
      return 301 https://www.weiyigeek.top/index.html;
    }
    # 请求host非指定域名时返回json
    if ( $host !~* weiyigeek\.top ) {
      add_header Content-Type 'application/json; charset=utf-8';
      return 200 '{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"大佬, 请不要把你的域名解析到我的服务器上","English":"Friend, Please do not resolve your domain name to my server"}';
      # return 301 https://space.bilibili.com/385802642;
    }
  }
...
}

执行结果

$ curl -I 82.156.18.253
HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Mon, 11 Apr 2022 12:15:02 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://www.weiyigeek.top/index.html
X-Robots-Tag: noindex,noarchive,nosnippet

$ curl --insecure -I https://82.156.18.253
HTTP/2 301
server: nginx
date: Mon, 11 Apr 2022 12:15:24 GMT
content-type: text/html
content-length: 162
location: https://www.weiyigeek.top/index.html
x-robots-tag: noindex,noarchive,nosnippet

$ curl weiyigeek.cn
{"status":"error","Author":"WeiyiGeek","Site":"https://www.weiyigeek.top","Chinese":"大佬, 

限制指定客户端地址访问

描述: 有时你的网站可能只需要被某一IP或者IP段的地址请求访问,那么非白名单中的地址访问将被阻止访问, 我们可以如下配置;

location / {
  allow  12.97.167.194; 
  allow  12.33.1.2; 
  allow  12.152.49.4;
  deny  all;
}

低权限用户运行服务

应配置非root低权限用户来运行nginx服务,设置如下建立Nginx用户组和用户,采用user指令指运行用户

加固方法

groupadd nginxweb;
useradd -M -g nginxweb -s /sbin/nologin nginxweb 

#nginx.conf 中配置 或者编译 的时候指定
#nginx 安装编译参数--user=nginx --group=nginx
user nginxweb

常用配置Nginx文件解释

#[Main] Nginx启动的用户(建议非root用户)
user nginx;

#[Main] NGINX工作进程数设置值和CPU核心数一致(优化选项)
#采用 grep ^processor /proc/cpuinfo | wc -l 进行查看或者auto
worker_processes  auto;

#[Main] 工作模式与连接数上限即每个工作进程可以处理并发的最大连接数(优化选项)
events {
    #[Main-events] nginx作为反向代理服务器单个进程最大连接数(最大连接数=连接数*进程数)
    #建议与worker_rlimit_nofile一致
    worker_connections  65535;
    #[Main-events] use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    #epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。
    use epoll;
    #[Main-events] 提高性能和吞吐量
    accept_mutex off;
}

#[Main] 高并发参数(通过设置cpu粘性来降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗)(优化选项)
worker_cpu_affinity 0001 0010 0100 1000; #四核的时候
#假如是8 cpu 分配如下: worker_cpu_affinity 00000001 00000010 00000100 00001000 0001000000100000 01000000 10000000

#[Main] 默认是没有设置,可以限制为操作系统最大的限制65535。(优化选项)
worker_rlimit_nofile 65535

#[Main]日志位置和日志级别[ debug | info | notice | warn | error | crit ]
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
error_log logs/error.log  error;

#服务进程启动文件
pid /var/run/nginx.pid;

#当前主配置文件包含其他的nginx模块配置文件
include /etc/nginx/conf.d/*.conf; 

#[Main部分] http服务器提供http服务相关的一些配置参数。例如:是否使用keepalive啊,是否使用gzip进行压缩等。
http {
    #文件扩展名与文件类型映射表
    include       mime.types;
    #默认文件类型
    default_type  text/html;
    #响应的编码格式
    charset UTF-8;
    #服务器名字的hash表大小
    server_names_hash_bucket_size   128;
    #缓冲区代理缓冲用户端请求的最大字节数, 
    client_body_buffer_size 128k
    #上传文件大小限制
    client_header_buffer_size 4k;
    #允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
    client_max_body_size 10m

    #文件访问缓存设置与系统文件描述符设置一致
    open_file_cache max=65536  inactive=60s;
    open_file_cache_valid      80s;
    open_file_cache_min_uses   1;

    large_client_header_buffers 4 64k; #设定请求缓

    #nginx日志记录格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';

    #使用缓冲而不是每条日志记录都单独执行写操作,NGINX会缓冲一连串的日志记录使用单个操作把它们一起写到文件中。
    access_log  logs/access.log  main buffer=1024 flush=60s;

    #关闭server信息头响应
    server_tokens off;


    #[MAIN-http]开启高效文件传输模式,指定nginx是否调用sendfile函数来输出文件,减少用户空间到内核空间的上下文切换(与accept_mutex关联配置)
    #对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
    #系统调用可以实现从一个文件描述符到另一个文件描述符的数据拷贝,通常实现零拷贝,这能加速TCP数据传输
    #当配置环境下有sendfile指令和激活内容更改过滤器的指令时NGINX会自动禁用sendfile。#(优化选项)
    sendfile        on; 
    #防止网络阻塞,不过要包涵在keepalived参数才有效
    tcp_nopush on; 
    tcp_nodelay on; 

    #空闲长连接保持打开状态的时间(优化选项)
    #长连接请求大量小文件的时候,可以减少重建连接的开销,但假如有大文件上传120s内没上传完成会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量资源。
    keepalive_timeout  120;
    
    #用于指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间客户端没有任何活动,Nginx将会关闭连接
    #send_timeout  180s
    
    ###模块http_gzip#####
    #开启gzip压缩输出,减少网络传输。
    gzip  on;
    #最小压缩文件大小(注意不能小于1k)
    gzip_min_length 1k;
    #压缩缓冲区
    gzip_buffers 4 64k;
    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    gzip_http_version 1.1;
    #压缩等级
    gzip_comp_level 2;
    ##压缩类型,默认就已经包含text/html,
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    
    ###模块fastcgi#####
    #FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。
    # fastcgi_temp_path  /tmp/fastcgi_temp;
    # fastcgi_cache_path /tmp/fastcgi_cache levels=1:2 keys_zone=cache_fastcgi:128m inactive=30m max_size=1g;
    # fastcgi_cache_key  $host$request_uri;
    #指定的Http状态码指定缓存时间
    # fastcgi_cache_valid 200 302 1h; 
    # fastcgi_cache_valid 301 1d;
    # fastcgi_cache_valid any 1m;
    # fastcgi_cache_min_uses 1;
    # fastcgi_cache_use_stale error timeout http_500 http_503 invalid_header;
    #指定链接到后端FastCGI的超时时间。
    # fastcgi_connect_timeout 300;
    #向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。
    # fastcgi_send_timeout 300;
    #指定接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。
    # fastcgi_read_timeout 300;
    #指定读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为gastcgi_buffers选项指定的缓冲区大小。
    # fastcgi_buffer_size 64k;
    #一个php脚本所产生的页面大小为256KB,那么会分配4个64KB的缓冲区来缓存
    # fastcgi_buffers 4 64k; 
    #建议设置为fastcgi_buffer的两倍,繁忙时候的buffer
    # fastcgi_busy_buffers_size 128k;
    # fastcgi_temp_file_write_size 128k;

    
    #[Main-http]配置虚拟主机设置
    #http服务上支持若干虚拟主机。每个虚拟主机一个对应的server配置项,配置项里面包含该虚拟主机相关的配置
    server {
        #[Main-http-server] ngnix监听端口
        listen       80;
        
        #服务器名:虚拟主机的域名可以写多个域名,可以通过正则匹配。
        server_name  localhost;

        #实现访问http时自动跳转到https
        return 301 https://$host$request_uri;
        #access_log  logs/host.access.log  main;

        #请求正则匹配的来判断访问路径,默认访问localhost:80 访问的是下面这个路径的网页
        location / {
            #站点根目录你网站文件存放的地方
            root   html;
            #定义路径下默认访问的文件名,一般跟着root放
            index  index.html index.htm;
            
            #开启限制IP连接数的时候需要使用
            #limit_zone crawler $binary_remote_addr 10m; 

            #访问控制模块默认就会安装,而且写法也非常简单,可以分别有多个allow,deny,允许或禁止某个ip或ip段访问,
            #依次满足任何一个规则就停止往下匹配 (安全选项)
            allow 192.168.10.100;
            allow 172.29.73.0/24;
            deny all;
            
            #认证访问 通过httpd-devel 工具的 htpasswd 来为访问的路径设置登录密码 (安全选项)
            #比如:htpasswd -c nginx.htpasswd admin 生成了默认使用CRYPT加密的密码文件#
            auth_basic "Nginx Status"
            auth_basic_user_file /usr/local/nginx/nginx.passwd
            
            #列出目录 autoindex Nginx默认是不允许列出整个目录的合适下载服务器。(非常不推荐)
            #如需此功能,打开nginx.conf文件,在location,server 或 http段中加入autoindex on;
            #autoindex on
            #显示出文件的确切大小单位是bytes。改为off后显示出文件的大概大小,单位是kB或者MB或者GB
            #autoindex_exact_size off
            #默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间
            #autoindex_localtime on;
        }
        
        #error_page  404              /404.html;
        #将服务器错误页面直接指向静态页面/50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        #代理PHP脚本到Apache上监听127.0.0.1:80 末尾以php或者php5结尾的
        #location ~ \.(php|php5)?$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        #将PHP脚本传递到正在监听127.0.0.1:9000的FastCGI服务器
        #location ~ .+\.(php|php5)$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_pass   unix:/tmp/php.sock;  #为了安全推荐方式
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #    fastcgi_cache  cache_fastcgi;
        #}


        # 如果Apache的文档根目录与nginx的根目录一致,则拒绝访问.htaccess文件
        #location ~ /\.ht {
        #    deny  all;
        #}
        
        #静态资源正则请求路径匹配
        location ~ .+\.(gif|jpg|jpeg|png|bmp|swf|txt|csv|doc|docx|xls|xlsx|ppt|pptx|flv)$ {  
          root  e:wwwroot; 
          expires 30d;  #缓存有效期30天
          access_log off; #访问记录
        } 
        #JS和CSS缓存时间设置
        location ~ .+\.(js|css|html|xml)$ { expires 30d;}

        #访问控制也可以加入认证
        location /nginx-status{
            #nginx中的stub_status模块主要用于查看Nginx的一些状态信息. 本模块默认没有安装需要编译安装。
            stub_status on;
            allow 192.168.1.0/24;
            allow 127.0.0.1;
            deny all;
        }
    }
    
    #### Nginx反向代理 ######
    #[Main-http] upstream模块设置反向代理和负载均衡的连接的内部web应用服务IP端口
    upstream monitor_server {
        #seesion记录访问的主机,比如第一次访问该服务器后就记录,之后再访问都是该服务器了-进行了绑定
        ip_hash;
        #内网的应用服务,weigth参数表示权值越高被分配到的几率越大。
        #max_fails当有max_fails个请求失败,就表示后端的服务器不可用,默认为1将其设置为0可以关闭检查 
        #fail_timeout 在以后的fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器 
        server 192.168.0.131:80 weight=9 max_fails=5 fail_timeout=600s;  
        server 192.168.0.132:80 weight=1 max_fails=5 fail_timeout=600s;
    } 
    
    
    #server指令配置项
    server { 
        listen 80; 
        #请求响应的域名
        server_name blog.weiyigeek.top; 
        
        location / {
          ##### 模块http_proxy:##### 反向代理主要配置
          #即反向代理,对应upstream负载均衡器
          proxy_pass http://monitor_server;
          
          #代理服务器相关信息头设置
          proxy_redirect off;
          #如果是有涉及redirect的服务,一定要加上端口8081,否 则默认tomcat在redirect时候默认找80端口 
          proxy_set_header Host $host;
          #转发请求的原IP地址,程序中通过request.getHeader("Proxy-Client-IP")获得ip 
          proxy_set_header X-Real-IP $remote_addr;
          #端的Web服务器可以通过X-Forwarded-For获取用户真实IP
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
          
          ##nginx跟后端服务器连接超时时间(代理连接超时)
          #模块http_proxy代理超时设置
          proxy_connect_timeout 60s;  
          
          ##nginx跟后端服务器连接超时时间(代理连接超时) 
          proxy_read_timeout 60s;     
          
          #后端服务器数据回传时间(代理发送超时) 间
          proxy_send_timeout 30s;
          
          #设置代理服务器(nginx)从后端realserver读取并保存用户头信息的缓冲区大小,默认与proxy_buffers大小相同,其实可以将这个指令值设的小一点
          proxy_buffer_size 4k
          #proxy_buffers缓冲区,nginx针对单个连接缓存来自后端realserver的响应,网页平均在32k以下的
          proxy_buffers 4 32k
          
          #高负荷下缓冲大小(proxy_buffers*2)
          proxy_busy_buffers_size 64k
          
          #当proxy_buffers放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M
          #它与proxy_cache没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。
          proxy_max_temp_file_size 0
          
          #当缓存被代理的服务器响应到临时文件时,限制每次写临时文件的大小。proxy_temp_path(可以在编译的时候)指定写到哪那个目录。
          proxy_temp_file_write_size 64k

          #把cookie的作用域替换成我们的域名。
          #proxy_cookie_domain google.com.hk www.example.com;  
          #proxy_set_header Host "www.google.com.hk";          #设置反向代理得header请求头
          #proxy_redirect http://www.google.com.hk/ ;          #重定向
          #proxy_redirect http:// https://;
          #sub_filter www.google.com.hk www.example.com;       #把谷歌的域名替换成自己的,注意需要安装nginx的sub_filter模块
          #反向代理的配置. END
        }

        #本地动静分离反向代理配置
        #所有jsp的页面均交由tomcat或resin处理
        location ~ .(jsp|jspx|do)?$ {
            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_pass http://127.0.0.1:8080;
        }

        #所有静态文件由nginx直接读取不经过tomcat或resin
        location ~ \.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$ { expires 15d; }

        location ~ \.(js|css)$ { expires 1h; }

    } 
    
    # 另一个虚拟主机,混合使用IP、名称和基于端口的配置
    server {
      listen 80;
      listen [::]:80;
      server_name weiyigeek.top;
      return 301 https://$host$request_uri;
   }

    server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name weiyigeek.top;

    # HSTS (ngx_http_headers_module is required) 应该只使用 HTTPS 而不是使用 HTTP 通信
    add_header Strict-Transport-Security "max-age=31536000;includeSubDomains;preload" always;

    # XXS-Protection
    add_header X-XSS-Protection "1; mode=block";

    # MIME 模拟探测
    add_header X-Content-Type-Options nosniff;

    # Frame 安全控制
    add_header X-Frame-Options ALLOW-FROM music.163.com;

    # Spider Robots 爬取策略限制
    # add_header X-Robots-Tag none; # 不限制
    # add_header X-Robots-Tag noindex, noarchive, nosnippet; # 限制

    # 开启 SSL ,如果想http 与 https 公用一个配置则可以将其注释( the "ssl" directive is deprecated )
    # ssl on;

    # 配置证书链与证书密钥
    ssl_certificate      /etc/nginx/ssl/fullchain.cer;
    ssl_certificate_key  /etc/nginx/ssl/weiyigeek.top.key;

    # ssl会话复用超时时间以及会话复用缓存大小
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions

    # 配置双证书时开启否则应该关闭
    ssl_session_tickets off;  

    ## OCSP stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    # 使用根 CA 和中间证书验证 OCSP 响应的信任链
    ssl_trusted_certificate /etc/nginx/ssl/ca.cer;

    # 仅使用ECDH是不用配置ssl_dhparam的否则你应该为它配置上 
    # curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
    ssl_dhparam /path/to/dhparam;

    # 兼容性较为通用的SSL协议与加密算法套件
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE:ECDH:AES:HIGH:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DH:!DES:!MD5:!RC4;
    # 安全配置: ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    # 证书常规握手加密算法方式共十八个,ECDHE、DHE、AES开头分别6个
    ; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:HIGH:!NULL:!aNULL:!eNULL:!EXPORT:!PSK:!ADH:!DES:!MD5:!RC4;
    
    # 为了兼容性推荐服务器自动选择要使用的算法套件
    ssl_prefer_server_ciphers  on;

    # replace with the IP address of your resolver
    resolver 223.6.6.6 8.8.8.8 192.168.12.254;
  }
}

 

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

目录关闭