网关代理
nginx config
安全类
- nginx 屏蔽 恶意域名解析
- 防止Host头攻击
server {
listen 80 default;
server_name _;
location / {
return 403;
}
}
- 禁用 autoindex
确保nginx.conf配置文件上禁用autoindex,即autoindex off或者没有配置autoindex。
- 关闭服务器标记
server_tokens off;建议加载全局配置中。如:
http{
include naxsi_core.rules;
include mime.types;
default_type application/octet-stream;
sendfile on;
server_tokens off;#关闭服务器标记
... ...
}
- 防堆栈溢出
## Start: Size Limits & Buffer Overflows ##
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
## END: Size Limits & Buffer Overflows ##
- 限制请求方法
## Only allow these request methods ##
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
## Do not accept DELETE, SEARCH and other methods ##
- 超时时间
## Start: Timeouts ##
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 5 5;
send_timeout 10;
## End: Timeouts ##
- 禁用某些浏览器上的内容类型嗅探
add_header X-Content-Type-Options nosniff;
- 启用跨站点脚本 (XSS) 筛选器
add_header X-XSS-Protection "1; mode=block";
- 设置自定义缓存以限制缓冲区溢出攻击。
参数不是最优参数,仅供参考。
http{
... ...
server{
... ...
client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 1m;
large_client_header_buffers 4 8k;
- 设置timeout设置timeout设低来防御DOS攻击
http {
... ...
client_body_timeout 10;
client_header_timeout 30;
keepalive_timeout 30 30;
send_timeout 10;
- 限制访问的方法
在目前的应用系统中值使用到POST和GET方法,所以除了它们之外,其他方式的请求均可拒绝。
server{
... ...
if($request_method !~ ^(GET|HEAD|POST)$) {
return404;
}
... ...
- 封杀各种user-agent
ser-agent 也即浏览器标识,每个正常的web请求都包含用户的浏览器信息,除非经过伪装,恶意扫描工具一般都会在user-agent里留下某些特征字眼,比如scan,nmap等。我们可以用正则匹配这些字眼,从而达到过滤的目的,请根据需要调整。这里分析得不够细致,具体的非法user-agent还得慢慢从日志中逐个提取。
if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {
return 403;
}
- 封杀特定的url
特定的文件扩展名,比如.bak
location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {
rewrite ^/(.*)$ $host permanent;
}
eg:
知名程序,比如 phpmyadmin
location /(admin|phpadmin|status) {
deny all;
}
- 强制网站使用域名访问
可以逃过IP扫描,比如
if ( $host !~* 'abc.com' ) {
return 403;
}
- url 参数过滤敏感字
if ($query_string ~* "union.*select.*\(") {
rewrite ^/(.*)$ $host permanent;
}
if ($query_string ~* "concat.*\(") {
rewrite ^/(.*)$ $host permanent;
}
- 在头信息中定义安全参数
# Security headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header Content-Security-Policy "default-src 'self'; style-src 'unsafe-inline' 'self'; script-src 'unsafe-inline' 'self' *.bestyii.com analysis.bestyii.com *.baidu.com *.google-analytics.com; img-src 'self' data: oss.bestyii.com *.baidu.com *.google-analytics.com; connect-src 'self' *.baidu.com ;
性能优化
- nginx进程数
建议按照cpu数目来指定,一般跟cpu核数相同或为它的倍数。
worker_processes 8;
- 为每个进程分配cpu
上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;
- nginx进程打开的最多文件描述符数目
理论值应该是系统的最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。
worker_rlimit_nofile 65535;
- 使用epoll的I/O模型
用这个模型来高效处理异步事件
use epoll;
- 每个进程允许的最多连接数
理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。
worker_connections 65535;
- http连接超时时间,默认是60s,
功能是使客户端到服务器端的连接在设定的时间内持续有效,当出现对服务器的后继请求时,该功能避免了建立或者重新建立连接。切记这个参数也不能设置过大!否则会导致许多无效的http连接占据着nginx的连接数,终nginx崩溃!
keepalive_timeout 60;
- 客户端请求头部的缓冲区大小
这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令
getconf PAGESIZE
取得。
client_header_buffer_size 4k;
- 为打开文件指定缓存
,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,
inactive
是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=102400 inactive=20s;
- 多长时间检查一次缓存的有效信息。
open_file_cache_valid 30s;
- 参数时间内文件的最少使用次数
如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在
inactive
时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;
- 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息
server_tokens off;
- 可以让sendfile()发挥作用。
sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。
sendfile on;
- 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。
就是说数据包不会马上传送出去,等到数据包最大时,一次性的传输出去,这样有助于解决网络堵塞。
tcp_nopush on;
- 告诉nginx不要缓存数据,而是一段一段的发送--
一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。
tcp_nodelay on;
示例
http {
server_tokens off;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
......
}
- 客户端请求头部的缓冲区大小
个可以根据系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
客户端请求头部的缓冲区大小,这个可以根据系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
分页大小可以用命令getconf PAGESIZE取得。
getconf PAGESIZE
但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。
client_header_buffer_size 4k;
- 为打开文件指定缓存,默认是没有启用的
max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache max=65535 inactive=60s;
- open_file_cache
指令中的inactive 参数时间内文件的最少使用次数
如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive
时间内一次没被使用,它将被移除。
open_file_cache_min_uses 1;
- 指定多长时间检查一次缓存的有效信息
open_file_cache_valid 80s;
Nginx调优方式
1、隐藏 Nginx 版本号(server_tokens off)
2、隐藏 Nginx 版本号和软件名(进入nginx的源码包里修改)
3、更改 Nginx 服务的默认用户
4、优化 Nginx worker 进程数
5、绑定 Nginx 进程到不同的 CPU 上
6、优化 Nginx 处理事件模型
7、优化 Nginx 单个进程允许的最大连接数
8、优化 Nginx worker 进程最大打开文件数
9、优化服务器域名的散列表大小
10、开启高效文件传输模式
11、优化 Nginx 连接超时时间
12、限制上传文件的大小
13、FastCGI 相关参数调优
14、配置 Nginx gzip 压缩
15、配置 Nginx expires 缓存
16、优化 Nginx日志(日志切割)
17、优化 Nginx 站点目录
18、配置 Nginx 防盗链
19、配置 Nginx 错误页面优雅显示
20、优化 Nginx 文件权限
21、Nginx 防爬虫优化
22、控制 Nginx 并发连接数
23、集群代理优化
Nginx安全配置小提示
1)禁用 autoindex
模块。这个可能在你使用的Nginx版本中已经更改了,如果没有的话只需在配置文件的location块中增加autoindex off;声明即可。
2)禁用服务器上的 ssi
(服务器端引用)。这个可以通过在location块中添加ssi off; 。
3)关闭服务器标记。如果开启的话(默认情况下)所有的错误页面都会显示服务器的版本和信息。将server_tokens off
;声明添加到 Nginx
配置文件来解决这个问题。
4)在配置文件中设置自定义缓存以限制缓冲区溢出攻击的可能性。
client_body_buffer_size 1K;
client_header_buffer_size 1k;
client_max_body_size 1k;
large_client_header_buffers 2 1k;
5)将timeout设低来防止DOS攻击。所有这些声明都可以放到主配置文件中。
client_body_timeout 10;
client_header_timeout 10;
keepalive_timeout 65;
send_timeout 10;
6)限制用户连接数来预防DOS攻击。
limit_zone 指令在 1.1.8 版本中已过时,并在 1.7.6 版本中被删除
limit_zone slimits $binary_remote_addr 5m;
limit_conn slimits 5;
代替 limit_zone:参考这里 ngx_http_limit_conn_module - Nginx中文文档
limit_conn_zone $binary_remote_addr zone=addr:10m;
7)试着避免使用 HTTP
认证。HTTP
认证默认使用crypt
,它的哈希并不安全。如果你要用的话就用 MD5
(这也不是个好选择但负载方面比 crypt
好) 。
高并发
什么是高并发?
高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求。
高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等。
响应时间:系统对请求做出响应的时间
吞吐量:单位时间内处理的请求数量。
QPS:每秒响应请求数
如何提高系统的并发能力
互联网分布式架构设计,提高系统并发能力的方式主要有两种:垂直扩展(Scale Up)与水平扩展(Scale Out)。
垂直扩展:提升单机处理能力。垂直扩展的方式又有两种。
- 增强单机硬件性能
- 提升单机架构性能
- 水平扩展:增加服务器,集群。
高并发下nginx配置限流
三种实现方式
- limit_conn_zone
- limit_req_zone
- ngx_http_upstream_module
前两种只能对客户端(即单一IP限流)
- limit_conn_zone
http{
limit_conn_zone $binary_remote_addr zone=one:10m;
server{
...
limit_conn one 10;#这将指定一个地址只能同时存在十个连接
...
}
}
其中“limit_conn one 10"既可以放在server层对整个server有效,也可以放在location中只对单独的location中只对单独的location有效
该配置表明:客户端的并发连接数只能是10个
- limit_req_zone
http{
limit_req_zone $binary_remote_addr zone=req_one:10m rate=1r/s;
server{
...
limit_req zone=req_one burst=120;
...
}
}
其中”limit_req zone=req_one burst=120"既可以放在server层对整个server有效,也可以放在location中只对单独的location有效
rate=1r/s的意思是每个地址每秒只能请求一次,也就是说令牌桶burst=120一共有120块令牌,并且每秒钟只新增1块令牌,120块令牌发完后,多出来的请求就会返回503
- ngx_http_upstream_module
多台服务器抗压
upstream xxx{
server 127.0.0.1:8080 max_conns=10;
server 127.0.0.1:8081 max_conns=10;
}
跨域
- 允许跨域
location / {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
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';
if ($request_method = 'OPTIONS') {
return 204;
}
}
参考
- Nginx配置跨域请求 Access-Control-Allow-Origin * - SegmentFault 思否
- Top 25 Nginx Web Server Best Security Practices - nixCraft
- CentOS 7 下 Nginx 安全加固配置规范 - Best Yii | PHP Yii 开发框架最佳实践
性能优化
- Nginx服务器性能优化的三大方面 - Linux大神博客
- Nginx核心要领五:worker_processes、worker_connections设置_zhuyu19911016520-CSDN博客
- Nginx高并发性能优化 - 运维笔记 - 散尽浮华 - 博客园
评论暂时关闭了,可以过段时间再试