Nginx全局配置文件安全性能优化日志(暂时完结,待续~~~)

发布于 2020-03-27  96 次阅读


[infobox title="前言"]

最近想继续提升一下Nginx的安全性,在不损失访问速度的情况下限制请求数量等。属于杂文性质的记录日志。之后会系统性的进行总结。

[/infobox]

[successbox title="SSL方面"]

[highlight lanaguage="Nginx"]

http {

ssl_protocols TLSv1.2 TLSv1.3;                     # 开启TLS 1.2、TLS 1.3
ssl_prefer_server_ciphers on;                      # 强制用户使用SSL加密连接
ssl_certificate cert/www.xgxdmx.com.pem;           # SSL证书
ssl_certificate_key cert/www.xgxdmx.com.key;       # SSL证书密钥
ssl_session_cache shared:SSL:10m;                  # 重用Session提高https的性能,设置ssl/tls会话缓存的类型和大小
ssl_session_timeout 60m;                           # 重用会话缓存中ssl参数的过期时间
ssl_session_tickets on;                            # 开启浏览器的 Session Ticket 缓存
ssl_ciphers 'TLS13-AES128-GCM-SHA256:TLS13-AES256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES128-CCM-SHA256:TLS13-AES128-CCM-8-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';           # SSL加密套件
ssl_early_data on;                                 # 启用TLS 1.3 0-RTT

}

[/highlight]

[infobox title="配置详解"]

   ssl_protocols  ==>  展开 / 收起
   ssl_session_cache  ==>  展开 / 收起
   ssl_early_data  ==>  展开 / 收起

[/infobox]

[/successbox]

[successbox title="安全性能方面"]

[highlight lanaguage="nginx"]

events {
    use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    worker_connections 1024; #单个后台worker process进程的最大并发链接数
    multi_accept on; #获得新连接的通知时尽可能多的接受连接
}

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

log_format cdn '$http_x_forwarded_for - $remote_user [$time_local] '
                    '"$request" $status $body_bytes_sent '
                    '"$http_referer" "$http_user_agent"'; # 判断访问用户真实IP,并记录到日志中
access_log /var/log/nginx/access.log cdn; # 访问日志
error_log /var/log/nginx/error.log; # 错误日志

# gzip设置
gzip on;                                 # 启动gzip
gzip_min_length 1k;                      # 启用gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_disable "MSIE [1-6]\.(?!.*SV1)";    # 禁用IE 6 SSLv1 gzip
gzip_vary on;                            # 启用根据客户端的HTTP头来判断,是否需要压缩
gzip_proxied any;                        # Nginx做为反向代理的时候启用,无条件压缩所有结果数据
gzip_comp_level 5;                       # gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU时间
gzip_buffers 16 8k;                      # 设置压缩所需要的缓冲区大小
gzip_http_version 1.1;                   # 设置gzip压缩针对的HTTP协议版本
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;  # 匹配mime类型进行压缩
}

[/highlight]

[/successbox]

[successbox title="FastCGI优化"]

[highlight lanaguage="nginx"]

fastcgi_connect_timeout 600;          # 连接超时
fastcgi_send_timeout 600;             # 发送请求超时
fastcgi_read_timeout 600;             # 接收超时
fastcgi_buffer_size 64k;              # 处理 Response 时第一个缓冲区的大小
fastcgi_buffers 4 64k;                # 创建4个大小为64K的缓冲区
fastcgi_busy_buffers_size 128k;       # 默认值是fastcgi_buffers的两倍
fastcgi_temp_file_write_size 128k;    # 缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍
fastcgi_max_temp_file_size 0;         # 关闭对所有请求道磁盘的缓冲
fastcgi_temp_path /dev/shm/nginx_tmp; # 生成fastcgi_cache临时文件目录
fastcgi_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=common_cache:20m inactive=5m max_size=512m;  # fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区
fastcgi_cache_key "$request_method$host$request_uri";
fastcgi_cache_min_uses 1;                                  # 设置链接请求几次就被缓存
fastcgi_cache_bypass $cookie_nocache $arg_nocache;         # 定义从缓存中不获取响应的条件。如果字符串参数的至少一个值不为空且不等于"0",则不会从缓存中获取响应
fastcgi_no_cache $cookie_nocache $arg_nocache;             # 定义响应不会保存到缓存的条件。如果字符串参数的至少一个值不为空且不等于"0",则不会保存响应
fastcgi_cache_use_stale error timeout http_500 http_404;   # 设置使用过期缓存的情形:后端错误、超时等
fastcgi_cache_methods GET HEAD POST;                       # 用于设置缓存哪些HTTP方法,默认缓存HTTP GET/HEAD方法
fastcgi_intercept_errors on;                               # 接收fastcgi输出的http 1.0 response code,后端php可以输出header指示nginx输出什么错误页面。开启这个之后,我们才能在php里面自定义错误代码和页面

[/highlight]

[/successbox]

[successbox title="proxy buffer参数设置"]

[highlight lanaguage="nginx"]

proxy_buffering on;             # 该指令开启从后端被代理服务器的响应body缓冲
proxy_buffer_size 64k;          # Nginx使用该大小申请read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx会报upstream sent too big header错误,然后client收到的是502
proxy_buffers 4 128k;           # 设置存储被代理服务器响应的body所占用的buffer个数和每个buffer大小
proxy_busy_buffers_size 256k;   # proxy_busy_buffers_size不是独立的空间,他是proxy_buffers和proxy_buffer_size的一部分。nginx会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分busy状态的buffer来专门向客户端传送数据(建议为proxy_buffers中单个缓冲区的2倍),然后它继续从后端取数据
proxy_connect_timeout 600s;     # 后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_send_timeout 1200;        # 后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
proxy_read_timeout 1200;        # 连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

[/highlight]

 

[/successbox]

[successbox title="Nginx在CDN环境下获取用户真实IP地址"]

[highlight lanaguage="nginx"]

## 这里取得原始用户的IP地址
map $http_x_forwarded_for $clientRealIp {
"" $remote_addr;
~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
}

## 针对原始用户 IP 地址做限制
limit_conn_zone $clientRealIp zone=TotalConnLimitZone:200m ;
limit_conn TotalConnLimitZone 50;
limit_conn_log_level notice;

## 针对原始用户 IP 地址做限制
limit_req_zone $clientRealIp zone=ConnLimitZone:200m rate=30r/s;
limit_req zone=ConnLimitZone burst=50 nodelay; #如果开启此条规则,burst=10的限制将会在nginx全局生效
limit_req_log_level notice;

[/highlight]

[/successbox]