在日常工作中使用nginx遇到的问题总结:
- 保持Nginx的及时升级
因为通过查看官方的release note会发现修复了很多bug,不及时更新在生产环境会有更大的风险
- 去掉不用的Nginx模块
#在编译安装时,执行./configure方法时加上以下配置指令,可以显式的删除不用的模块 #配置指令是由模块提供的。确保禁用的模块不包含需要使用的指令!在决定禁用模块之前,需要检查Nginx文档中每个模块可用的指令列表 ./configure --without-http_dav_module --withouthttp_spdy_module
- 在Nginx配置中禁用server_tokens
server_tokens在打开的情况下会使404页面显示Nginx的当前版本号
不法者会利用此信息尝试相应Nginx版本的漏洞,需要在nginx.conf中http模块设置server_tokens off,然后重启nginxserver { listen 192.168.10.10; Server_tokens off; .....省略 }
- 禁止非法的HTTP User Agents
if ($http_user_agent ~* (curl) ) { return 404; }
user agent:用户代理是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好,通知服务器当前使用的是什么浏览器、工具等等,例如火狐、谷歌chrome、wget、curll;因为是HTTP协议中对浏览器的一种标识,所以禁止非法的User Agent可以阻止爬虫和扫描器的一些请求,防止这些请求大量消耗Nginx服务器资源
#编辑nginx配置文件,以下内容放在http配置段,那么整个nginx都生效,如果放到server里,只对一个有效 #禁止一个 if ($http_user_agent ~* (curl) ) { return 404; } #禁止多个URL if ($http_user_agent ~* (curl) ) return 404; } #禁止非法的User Agent,将如下语句放入配置文件的server模块内: map $http_user_agent $blockedagent { default 0; ~*malicious 1; ~*bot 1; ~*backdoor 1; ~*crawler 1; ~*bandit 1; } include /etc/nginx/blockuseragents.rules; #并加入if语句设置阻止后进入的页面: server { if($blockuseragents){ return 403; } .....省略 }
- 禁掉不需要的 HTTP 方法
在web站点和应用中,有的方法只支持GET、POST和HEAD,在配置文件中的server模块中就可以加入如下方法可以阻止一些欺骗攻击
if ($request_method !~ ^(GET|HEAD|POST)$) { return 444; }
- 设置缓冲区容量上限(可以阻止缓冲区溢出攻击(同样是Server模块))
#设置后,不管多少HTTP请求都不会使服务器系统的缓冲区溢出了 client_body_buffer_size 1k; client_header_buffer_size 1k; client_max_body_size 1k; large_client_header_buffers 2 1k;
- 限制最大连接数
#在http模块内,server模块外设置limit_conn_zone,可以设置连接的IP #在http,server或location模块设置limit_conn,可以设置IP的最大连接数 limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 1;
- 设置日志监控(access_log、error_log)
- 阻止图片外链自你的服务器
有一个img目录用来存储图片,IP是192.168.10.10,加入如下配置可以防止外链.来减轻服务器的带宽压力
location /img/ { valid_referers none blocked 192.168.10.10; if ($invalid_referer) { return 403; } }
- 禁止 SSL 并且只打开 TLS(在Server模块 添加:ssl_protocols TLSv1 TLSv1.1 TLSv1.2;)
- 做证书加密(HTTPS)(生成密钥和整数)
# openssl genrsa -aes256 -out tecmintlovesnginx.key 1024 # openssl req -new -key tecmintlovesnginx.key -out tecmintlovesnginx.csr # cp tecmintlovesnginx.key tecmintlovesnginx.key.org # openssl rsa -in tecmintlovesnginx.key.org -out tecmintlovesnginx.key # openssl x509 -req -days 365 -in tecmintlovesnginx.csr -signkey tecmintlovesnginx.key -out tecmintlovesnginx.crt #配置Server模块 server { ....省略 ssl_certificate /etc/nginx/sites-enabled/certs/tecmintlovesnginx.crt; ssl_certificate_key /etc/nginx/sites-enabled/certs/tecmintlovesnginx.key; ....省略 }
- 重定向HTTP请求到HTTPS
#在server中添加 return 301 https://$server_name$request_uri;