技术应用:Nginx运维优化最佳实践(二)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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 (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 配置文件授权


  • 修改nginx.conf权限

描述

访问控制。修改nginx.conf前文件读写权限为644

-rw-r--r--

文件权限要求

文件权限要求,<= 640 执行修改命令

chmod640 nginx.conf

修改后的文件权限

-rw-r-----


  • 修改文件拥有者

格式

chown [targetUser] [fileName]


如果使用普通用户修改文件,则会提示没有权限,所以这里使用管理员来修改,使用sudo 来执行命令

$ chown appuser nginx
$ chown: nginx: Operation not permitted
$ sudochown appuser nginx


2 限制主目录权限

描述

限制主目录与主目录属主属组和权限<=740


执行修改命令

chmod-R740 nginx


3 登录授权认证

3.1 创建管理用户和用户组

描述

建议nginx中间件创建专门的用户和组来管理中间件,在nginx.conf文件中配置user用户


用户 用户组        

user [root] [owner];


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/[文件名称] [账户名称]


生成密码文件

$ htpasswd-cb /NGINX_HOME/htpasswd ceshi 123789

备注:注:【追加用户,不使用-c选项(否则会覆盖)】


$ htpasswd  /NGINX_HOME/pass   jerry
$ htpasswd-c /NGINX_HOME/nginx_htpass nginx


备注:上面几种方式根据项目模块,自定义选择


【设置密码】

New password:                                
Re-type new password: 
Adding password for user tom


4)设置密码文件权限

描述

了安全设置文件权限

为了安全设置文件权限

$ chmod400 /NGINX_HOME/nginx_htpass


5)检查语法 & 重启


【重新加载配置文件】

/NGINX_HOME/sbin/nginx -s reload

【检查配置文件是否正确】

/NGINX_HOME/sbin/nginx -t


4 访问文件控制

描述

禁止nginx访问 .htxxx文件,在nginx.conf文件中server {}模块中配置

location~ /.ht { deny all; }


二、安全审计

1 开启安全审计功能

描述

nginx中间件开启审计功能,在nginx.conf文件中配置。

error.log配置在全局,

access.loglog_format配置在http {}模块,

host.access.log配置在server {}模块


制定日志路径,级别

这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

error_log  logs/error.log  notice;
log_formatmain '$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 日志保留时间6M+

描述

nginx中间件日志保留时间满足6个月以上。

这个需要根据自己的业务逻辑,来编写调度删除日志文件即可。


三、资源控制

1 会话超时&空闲锁定超时

描述

资源控制。建议nginx中间件配置会话超时,在nginx.conf文件中http {}模块或者server {}模块中 设置,一般放置在http {}模块


client_body_timeout

设置请求体(request body)的读超时时间。仅当在一次readstep中,没有得到请求体,就会设为超时。超时后,nginx返回HTTP状态码408(“Request timed out”)存放模块为http、server、location

client_body_timeout 10;


client_header_timeout                        

# 等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1),仅当在一次read中,没有收到请求头,才会算成超时。如果在超时时间内,client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”),存放模块:http server        

client_header_timeout 10;

                           

keepalive_timeout】              

第一个参数指定了与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接。可选的第二个参数指定了在响应头Keep-Alive: timeout=time中的time值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。没有这个参数,nginx不会发送Keep-Alive响应头(尽管并不是由这个头来决定连接是否“keep-alive”)(服务器在返回数据给用户时,在头header文件中会添加keepalive字段,75s,浏览器在这个时间后能够主动关闭连接)。存放模块:http、server、location

keepalive_timeout 55;

   

send_timeout

客户端的响应超时时间。默认为60            

send_timeout 60;


四、入侵防护

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;
server_tokens off;              
client_max_body_size 10m;


【隐藏版本号

隐藏版本号。不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的

server_tokens off;              
client_max_body_size 10m;


2 登录源限制

描述

入侵防护,nginx中间件对中间件管理后台操作进行登录源限制。

nginx.conf文件中server {}模块中的local {}模块中配置

【允许的IP】

   
allow 192.168.1.1;  
deny  192.168.1.2;   
deny all;


3 限制IP同一时间段内的访问次数

描述

入侵防护。nginx中间件限制某些ip在同一时间段内的访问次数


【limit_conn】

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_connone 20;          
    }     
  } 
}


4 nginx中间件自定义缓存

描述

入侵防护。在nginx.conf文件中http {}模块配置


【client_body_buffer_size】

分配给请求数据的Buffer大小。请求的数据小于client_body_buffer_size直接将数据先在内存中存储。如果请求的值大于client_body_buffer_size小于client_max_body_size,就会将数据先存储到临时文件中临时文件在client_body_temp 指定的路径中,默认该路径值是/tmp/。

client_body_buffer_size 1k;

           

client_header_bfuffer_size

用于读取客户端请求标头的缓冲区大小。对于大多数请求,一个1K字节的缓冲区就足够了。但是,如果请求中包含长Cookie或来自WAP客户端,则该请求可能不适合1K。如果请求行或请求标头字段不适合此缓冲区,则将分配由large_client_header_buffers指令配置的较大缓冲区 。

client_header_bfuffer_size 1k;

client_max_body_size

上传文件大小限制,客户端请求服务器最大允许大小。如果请求的正文数据大于client_max_body_size, HTTP协议会报错 413 Request Entity Too Large。就是说如果请求的正文大于client_max_body_size,一定是失败的。如果需要上传大文件,一定要修改该值。

client_max_body_size 1k;

     

【large_client_header_buffers】    

用于读取大型客户端请求标头的最大值number和size缓冲区。请求行不能超过一个缓冲区的大小,否则会向客户端返回414(请求URI太大)错误。请求标头字段也不能超过一个缓冲区的大小,否则会将400(错误请求)错误返回给客户端。缓冲区仅按需分配。默认情况下,缓冲区大小等于8K字节。如果在请求处理结束后将连接转换为保持活动状态,则会释放这些缓冲区。          

large_client_header_buffers2 1k;


五、数据安全

1 敏感字段进行过滤

描述

数据安全。建议nginx.conf中间件对敏感字段进行过滤,在nginx.conf文件下locallocal /*模块中配置

if($query_string ~* "union.*select.*") {  
rewrite^/(.*)$ $host  permanent; 
} 
if($query_string ~* "concat.*") {  
rewrite^/(.*)$ $host  permanent; 
}



六、工作进程


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 找到nginxworker进程ID

通过cat /proc/31613/limits查看,其中2291是worker进程ID,请注意其中的Max open files



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
13天前
|
运维 应用服务中间件 Linux
自动化运维的利器:Ansible在配置管理中的应用
【10月更文挑战第39天】本文旨在通过深入浅出的方式,向读者展示如何利用Ansible这一强大的自动化工具来优化日常的运维工作。我们将从基础概念讲起,逐步深入到实战操作,不仅涵盖Ansible的核心功能,还会分享一些高级技巧和最佳实践。无论你是初学者还是有经验的运维人员,这篇文章都会为你提供有价值的信息,帮助你提升工作效率。
|
8天前
|
运维 监控 安全
自动化运维的利剑:Ansible在现代IT架构中的应用
在数字化浪潮中,企业对IT系统的敏捷性和可靠性要求日益提高。Ansible,一种简单但强大的自动化运维工具,正成为现代IT架构中不可或缺的一部分。它通过声明式编程语言YAM,简化了系统配置、应用部署和任务自动化的过程,显著提升了运维效率和准确性。本文将深入探讨Ansible的核心特性、应用场景以及如何有效整合进现有IT环境,为读者揭示其在自动化运维中的实用价值和未来发展潜力。
|
10天前
|
运维 Devops 应用服务中间件
自动化运维的利剑:Ansible在现代IT架构中的应用
【10月更文挑战第42天】本文旨在揭示自动化运维工具Ansible如何革新现代IT架构,通过简化配置管理和部署流程,提升效率和可靠性。我们将探索Ansible的核心功能、语言特性以及其在DevOps文化中的角色。文章还将展示如何借助Ansible构建模块化和可重用的配置代码,实现快速迭代与部署,并确保系统一致性。通过阅读本文,运维人员将了解如何利用Ansible优化日常任务,加速产品上线速度,同时提高系统的稳健性。
21 5
|
15天前
|
机器学习/深度学习 人工智能 运维
智能运维在现代IT系统中的应用与挑战####
本文深入探讨了智能运维(AIOps)在现代IT系统中的关键作用,通过具体案例分析,揭示了其在提升系统稳定性、优化资源配置及自动化故障处理方面的显著优势。同时,文章也指出了实施智能运维过程中面临的数据安全、技术整合及人员技能转型等挑战,并提出了相应的解决策略,为读者提供了全面而深刻的见解。 ####
42 6
|
15天前
|
人工智能 运维 监控
智能运维在现代数据中心的应用与挑战
随着云计算和大数据技术的迅猛发展,现代数据中心的运维管理面临着前所未有的挑战。本文探讨了智能运维技术在数据中心中的应用,包括自动化监控、故障预测与诊断、资源优化等方面,并分析了当前面临的主要挑战,如数据安全、系统集成复杂性等。通过实际案例分析,展示了智能运维如何帮助数据中心提高效率、降低成本,并提出了未来发展趋势和建议。
|
16天前
|
运维 Ubuntu 应用服务中间件
自动化运维工具Ansible的实战应用
【10月更文挑战第36天】在现代IT基础设施管理中,自动化运维已成为提升效率、减少人为错误的关键手段。本文通过介绍Ansible这一流行的自动化工具,旨在揭示其在简化日常运维任务中的实际应用价值。文章将围绕Ansible的核心概念、安装配置以及具体使用案例展开,帮助读者构建起自动化运维的初步认识,并激发对更深入内容的学习兴趣。
38 4
|
15天前
|
运维 安全 应用服务中间件
自动化运维的利剑:Ansible在配置管理中的应用
【10月更文挑战第37天】本文将深入探讨如何利用Ansible简化和自动化复杂的IT基础设施管理任务。我们将通过实际案例,展示如何用Ansible编写可重用的配置代码,以及这些代码如何帮助运维团队提高效率和减少人为错误。文章还将讨论如何构建Ansible playbook来自动部署应用、管理系统更新和执行常规维护任务。准备好深入了解这个强大的工具,让你的运维工作更加轻松吧!
30 2
|
2月前
|
应用服务中间件 BI nginx
Nginx的location配置详解
【10月更文挑战第16天】Nginx的location配置详解
|
2月前
|
缓存 负载均衡 安全
Nginx常用基本配置总结:从入门到实战的全方位指南
Nginx常用基本配置总结:从入门到实战的全方位指南
266 0
|
2月前
|
应用服务中间件 Linux nginx
Jetson 环境安装(四):jetson nano配置ffmpeg和nginx(亲测)之编译错误汇总
这篇文章是关于在Jetson Nano上配置FFmpeg和Nginx时遇到的编译错误及其解决方案的汇总。
94 4
下一篇
无影云桌面