1. 隐藏版本号
1 http {
2 server_tokens off;
3 }
2. 开启HTTPS
ssl on :开启https
ssl_certificate :配置nginx ssl证书的路径
ssl_certificate_key :配置nginx ssl证书key的路径
ssl_protocols :指定客户端建立连接时使用的ssl协议版本 ssl_ciphers :指定客户端连接时所使用的加密算法
server {
listen 443;
server_name <xxx>;
ssl on;
ssl_certificate <pem路径>;
ssl_certificate_key <key路径>;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH: !aNULL: !MD%
}
3. 限制请求方法
$request_method能获取到请求时所使用的method,应该配置只使用GET/POST方法访问,其他 的method返回405
1 if ($request_method !~ ^(GET|POST)$ ){
2 return 405;
3 }
4. 拒绝某些User-Agent
禁止一些爬虫的扫描
1 if ($http_user_agent ~* LWP::Simple|BBBike|wget|curl){
2 return 444;
3 }
5. 利用referer图片防盗链
1 locations /images/ {
2 valid_referers none blocked <domain_name> <domain_name>;
3 if ($invalid_referer){
4 return 403;
5 }
6 }
valid_referers :验证referer none :允许referer为空
blocked:允许不带协议的请求
6. 控制并发连接数
http {
limit_conn_zone $binary_remote_addr zone=ops:10m; limit_conn_zone $server_name zone=coffee:10m;
server {
listen 80
server_name <server_name>;
...
location / {
limit_conn opos 10; # 限制单一IP来源的连接数为10
limit_conn coffee 2000; # 限制单一虚拟服务器的总连接数为2000 limit_rate 500k; # 限制单个连接使用的带宽
}
}
}
limit_conn_zone :设定保存各个属性状态的共享内存空间的参数,limit_conn_zone <属性> zone=<空间名称>:<大小>
limit_conn :为已经设定zone的属性设置最大连接数
7. 设置缓冲区大小防止缓冲区溢出攻击
1 client_body_buffer_size 1K;
2 client_header_buffer_size 1K;
3 client_max_body_size 1K;
4 large_client_header_buffers 2 1K;
client_body_buffer_size :默认8k或16k,标识客户端请求body占用缓冲区的大小。如果连接 请求超过指定缓冲区大小的值,尼玛这些请求实体的整体或者部分将尝试写入一个临时文件
client_header_buffer_size :表示客户端请求头部的缓冲区大小。绝大多数情况下一个请求头 不会大于1K,如果大于1K, Nginx将分配给它一个更大的缓冲区,,这个值可以在large_client_header_buffers 中设置
client_max_body_size :标识客户端请求的最大可接受的body大小。如果请求头部的Content- Length字段的值大于该值,客户端将收到一个(413)状态码的错误。【会影响上传文件的功能】
large_client_header_buffers :表示一些比较大的请求头使用的缓冲区数量和大小,默认一个 缓冲区大小为操作系统中分页文件大小,通常是4k或8k。请求字段不能大于一个缓冲区的大小, 若大于,则nginx将返回400状态码的错误
设置超时时间
1 client_body_timeout 10
2 client_header_timeout 10;
3 keepalive_timeout 5 5;
4 send_timeout 10;
client_body_timeout: 表示读取请求body的超时时间,如果连接超过这个时间而客户端没有 任何响应, Nginx将返回“Request time out” (408)错误
client_header_timeout: 表示读取客户端请求头的超时时间,如果连接超过这个时间而客户 端没有任何响应, Nginx将返回“Request time out” (408)错误
keepalive_timeout: 参数的第一个值表示客户端与服务器长连接的超时时间,超过这个时
间,服务器将关闭连接,可选的第二个参数参数表示Response头中Keep-Alive: timeout=time的 time值,这个值可以使一些浏览器知道什么时候关闭连接,以便服务器不用重复关闭,如果不指 定这个参数, nginx不会在应Response头中发送Keep-Alive信息
send_timeout: 表示发送给客户端应答后的超时时间, Timeout是指没有进入完整
established状态,只完成了两次握手,如果超过这个时间客户端没有任何响应, nginx将关闭连 接
8. 添加Header头防止XSS攻击
1 add_header X-Frame-Options "SAMEORIGIN";
2 add_header X-XSS-Protection "1; mode=block";
3 add_header X-Content-Type-Options "nosniff";
X-Frame-Options :标识是否允许浏览器加载frame等属性。
DENY:禁止任何网页被嵌入
SAMEORIGIN:只允许本网站的嵌套
ALLOW-FROM:允许指定地址的嵌套
X-XSS-Protection :启用XSS过滤。 mode=block标识若检查到XSS攻击则停止渲染页面
X-Content-Type-Options :用来指定浏览器对未指定或错误指定Content-Type资源真正类型的猜 测行为
nosniff:标识不允许任何猜测
在通常的请求相应中,浏览器会根据Content-Type来分辨响应的类型,如果响应类型未指定或错误指定时,浏览器会启用MIME-sniffing来猜测资源的响应类型
9. 添加其他Header头
1 add_header Content-Security-Policy "default-src 'self'";
2 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
Content-Security-Policy :表示页面可以加载哪些资源
default-src:定义针对所有类型的资源的默认加载策略。 self表示允许来自想用来源的内 容
Strict-Transport-Security :表示告诉浏览器要用HTTPS协议代替HTTP来访问目标站点
当用户第一次访问目标站点后,会返回一个包含了 Strict-Transport-Security Header的 响应,这个header告诉浏览器,在接下来的 31536000 秒内,对当前网站的所有请求都要使 用 https来访问。
includeSubDomains : (可选),表示对所有子域名也采用相同的规则
10.SSL加密算法套件
在Nginx 中,ssl_ciphers 指令用于配置支持的 SSL 加密套件。它定义了客户端和服务器之间在 SSL/TLS 握手期间所使用的加密算法和密钥交换算法。以下是加密算法套件的一个示例
server {
# 监听端口 443 并启用 SSL/TLS
listen 443 ssl;
# 服务器名称匹配任何主机名
server_name _;
# 设置服务器根目录
root /usr/share/nginx/html;
# SSL 证书文件路径
ssl_certificate /etc/nginx/ssl/server1.crt;
# SSL 证书密钥文件路径
ssl_certificate_key /etc/nginx/ssl/server1.key;
# 设置 SSL 会话超时时间
ssl_session_timeout 5m;
# 允许的 SSL/TLS 版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 允许的加密套件
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# 优先使用服务器提供的加密套件
ssl_prefer_server_ciphers on;
# 其他配置...
}