Nginx中间件优化配置项目
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
一、访问控制
1.1 配置文件授权
- 修改nginx.conf权限
描述:访问控制。修改nginx.conf前文件读写权限为644
代码语言:javascript复制-rw-r--r--
文件权限要求,<= 640
执行修改命令
chmod 640 nginx.conf
修改后的文件权限
代码语言:javascript复制-rw-r-----
- 修改文件拥有者
格式:chown [targetUser] [fileName]
如果使用普通用户修改文件,则会提示
代码语言:javascript复制chown appuser nginx
chown: nginx: Operation not permitted
使用sudo 来执行命令
代码语言:javascript复制sudo chown appuser nginx
1.2 限制主目录权限
描述:限制主目录与主目录属主属组和权限<=740
执行修改命令
代码语言:javascript复制chmod -R 740 nginx
1.3 登录授权认证
1.3.1 创建管理用户和用户组
描述:建议nginx中间件创建专门的用户和组来管理中间件,在nginx.conf文件中配置user用户
代码语言:javascript复制# 用户 用户组
user [root] [owner];
1.3.2 请求URL授权认证
- 1)配置登录信息
在 server {}
模块中配置
#【认证提示符 [ 可任意编辑 ] 】
auth_basic "Input Password:";
#【认证密码文件】
auth_basic_user_file "NGINX_HOME/passFile";
- 2)生成密码文件工具htpasswd
# 查看是否安装htpasswd
which htpasswd
#【首先安装生成密码所需的软件】
yum -y install httpd-tools
# 查看是否安装
rpm -qf /usr/bin/htpasswd
- 3)创建用户密码文件
描述:存放位置为nginx.conf 相同级别目录,我这里默认设置账户信息为:nginx/Nginx@123
具体命令:htpasswd -c nginx_HOME/[文件名称] [账户名称]
# 命令模式格式:【创建密码文件(文件路径和配置文件中相同)和用户名】
htpasswd -c /NGINX_HOME/[文件名称] [账户名称]
# 命令实践
# or
# 生成密码文件
htpasswd -cb /NGINX_HOME/htpasswd ceshi 123789
# or
# 注:【追加用户,不使用-c选项(否则会覆盖)】
htpasswd /NGINX_HOME/pass jerry
# or
htpasswd -c /NGINX_HOME/nginx_htpass nginx
# 上面几种方式根据项目模块,自定义选择
#【设置密码】
New password:
Re-type new password:
Adding password for user tom
- 4)设置密码文件权限
描述:了安全设置文件权限
代码语言:javascript复制# 为了安全设置文件权限
chmod 400 /NGINX_HOME/nginx_htpass
- 5)检查语法 & 重启
#【重新加载配置文件】
/NGINX_HOME/sbin/nginx -s reload
#【检查配置文件是否正确】
/NGINX_HOME/sbin/nginx -t
1.4 访问文件控制
描述:禁止nginx访问 .htxxx文件,在nginx.conf文件中server {}
模块中配置
location ~ /.ht { deny all; }
二、安全审计
2.1 开启安全审计功能
描述:nginx中间件开启审计功能,在nginx.conf文件中配置,
error.log
配置在全局,
access.log
和 log_format
配置在http {}
模块,
host.access.log
配置在server {}
模块
# 制定日志路径,级别。
# 这个设置可以放入全局块,http块,server块,
# 级别以此为:debug|info|notice|warn|error|crit|alert|emerg
error_log logs/error.log notice;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
'$upstream_addr $upstream_response_time $request_time ';
access_log logs/access.log main;
access_log logs/host.access.log main;
2.2 日志保留时间6M
描述:nginx中间件日志保留时间满足6个月以上。
这个需要根据自己的业务逻辑,来编写调度删除日志文件即可。
三、资源控制
3.1 会话超时&空闲锁定超时
描述:资源控制。建议nginx中间件配置会话超时,在nginx.conf文件中http {}
模块或者 server {}
模块中 设置,一般放置在http {}
模块
# 设置请求体(request body)的读超时时间。
# 仅当在一次readstep中,没有得到请求体,就会设为超时。
# 超时后,nginx返回HTTP状态码408(“Request timed out”)
# 存放模块:http server location
client_body_timeout 10;
# 等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1)
# .仅当在一次read中,没有收到请求头,才会算成超时。
# 如果在超时时间内,client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”)
# 存放模块:http server
client_header_timeout 10;
# 第一个参数指定了与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接。
# 可选的第二个参数指定了在响应头Keep-Alive: timeout=time中的time值。
# 这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。
# 没有这个参数,nginx不会发送Keep-Alive响应头(尽管并不是由这个头来决定连接是否“keep-alive”)
# (服务器在返回数据给用户时,在头header文件中会添加keepalive字段,75s,
# 浏览器在这个时间后能够主动关闭连接)
# 存放模块:http server location
keepalive_timeout 55;
# 客户端的响应超时时间。默认为60
send_timeout 60;
四、入侵防护
4.1 隐藏软件名称和版本号
在nginx.conf文件中http {}
模块配置
keepalive_timeout 60;
tcp_nodelay on;
client_header_buffer_size 4k;
open_file_cache max=102400 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 1;
client_header_timeout 15;
client_body_timeout 15;
reset_timedout_connection on;
send_timeout 15;
# 隐藏版本号。
# 不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,
# 这样对于安全性是有好处的
server_tokens off;
client_max_body_size 10m;
4.3 登录源限制
描述:入侵防护,nginx中间件对中间件管理后台操作进行登录源限制。
在nginx.conf文件中server {}
模块中的local {}
模块中配置
# 允许的IP
allow 192.168.1.1;
deny 192.168.1.2;
deny all;
4.4 限制IP同一时间段内的访问次数
描述:入侵防护。nginx中间件限制某些ip在同一时间段内的访问次数
代码语言:javascript复制http{
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
server{
location {
limit_req zone=allips burst=5 nodelay;
}
}
}
http{
limit_conn_zone one $binary_remote_addr 10m;
server{
location {
# 连接数限制
limit_conn one 20;
}
}
}
4.5 nginx中间件自定义缓存
描述:入侵防护。在nginx.conf文件中http {}
模块配置
# 分配给请求数据的Buffer大小。
# 请求的数据小于client_body_buffer_size直接将数据先在内存中存储。
# 如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中
# 临时文件在client_body_temp 指定的路径中,默认该路径值是/tmp/.
client_body_buffer_size 1k;
# 用于读取客户端请求标头的缓冲区大小。对于大多数请求,一个1K字节的缓冲区就足够了。
# 但是,如果请求中包含长Cookie或来自WAP客户端,则该请求可能不适合1K。
# 如果请求行或请求标头字段不适合此缓冲区,
# 则将分配由large_client_header_buffers指令配置的较大缓冲区 。
client_header_bfuffer_size 1k;
# 上传文件大小限制,客户端请求服务器最大允许大小。
# 如果请求的正文数据大于client_max_body_size,
# HTTP协议会报错 413 Request Entity Too Large。
# 就是说如果请求的正文大于client_max_body_size,一定是失败的。
# 如果需要上传大文件,一定要修改该值。
client_max_body_size 1k;
# 用于读取大型客户端请求标头的最大值number和size缓冲区。
# 请求行不能超过一个缓冲区的大小,否则会向客户端返回414(请求URI太大)错误。
# 请求标头字段也不能超过一个缓冲区的大小,否则会将400(错误请求)错误返回给客户端。
# 缓冲区仅按需分配。默认情况下,缓冲区大小等于8K字节。
# 如果在请求处理结束后将连接转换为保持活动状态,则会释放这些缓冲区。
large_client_header_buffers 2 1k;
五、数据安全
5.1 敏感字段进行过滤
描述:数据安全。建议nginx.conf中间件对敏感字段进行过滤,在nginx.conf文件下local
或 local /*
模块中配置
if ( $query_string ~* "union.*select.*" ) {
rewrite ^/(.*)$ $host permanent;
}
if ( $query_string ~* "concat.*" ) {
rewrite ^/(.*)$ $host permanent;
}
六、工作进程
6.1 工作进程
描述:worker_processes与worker_connections 设置好合适大小,可以提示nginx处理性能,非常重要。
- worker_processes 工作进程数
- 1.默认:worker_processes: 1
- 2.调大:worker_processes: CPU核心数,(双核4线程,可以设置为4)
- worker_connections 单个工作进程可以允许同时建立外部连接的数量
- 1.默认:worker_connections: 1024
- 2.调大:worker_connections: 100000,(调大到10万连接)
其中,设置worker_connections与两个指标有重要关联,一是内存,二是操作系统级别的“进程最大可打开文件数”。进程最大可打开文件数:进程最大可打开文件数受限于操作系统,可通过ulimit -n
命令查询,以前是1024,现在是65535,
通过ps -elf | grep nginx
找到 nginx 的worker进程ID
通过 cat /proc/31613/limits
查看,其中2291是worker进程ID,请注意其中的Max open files