[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="配置详解"]
[/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]
Comments NOTHING