首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
14
篇与
的结果
2023-12-29
如何使用Nginx实现限制各种恶意访问
如何使用Nginx实现限制各种恶意访问恶意访问是指某些攻击者针对某个网站或网络服务进行的一系列攻击,以获得非法的访问或攻击目标服务器,从而影响其正常运行。为了保护我们的服务器网络安全,我们需要限制这些恶意访问。Nginx 是一款优秀的开源 Web 服务器,它能够通过灵活的配置来防止各种恶意访问,下面将详细介绍如何使用 Nginx 实现限制各种恶意访问。使用 Nginx 限制 IP1. 配置 IP 黑名单可以在 Nginx 的配置文件中添加 IP 黑名单,以限制恶意访问。打开 Nginx 配置文件(/etc/nginx/nginx.conf),在 http 部分添加以下代码:http { ... # black list geo $not_allowed_ip { default 0; include /etc/nginx/not_allowed_ip.txt; } ... }以上代码中,我们定义了一个名为“$not_allowed_ip”的变量,并通过“geo”指令配置它的默认值和变量所需的文件路径。其中,“include”指令在“not_allowed_ip.txt”中包含要禁止的 IP 列表。2. 编辑 IP 黑名单文件在 Nginx 的配置文件中已经包含了 IP 黑名单,现在需要编辑“not_allowed_ip.txt”文件,以添加要限制的 IP 地址。可以使用以下命令打开该文件:sudo nano /etc/nginx/not_allowed_ip.txt然后,将要限制的 IP 地址添加到文件中,并以分号(;)分隔多个 IP 地址。例如:192.168.0.1; 192.168.0.2;编辑完成后,保存文件并关闭编辑器。3. 添加 IP 限制规则在 Nginx 的配置文件中,可以通过“if”指令添加 IP 限制规则。打开配置文件,添加以下代码:http { ... server { ... # access control list if ($not_allowed_ip) { return 403; } ... } ... }以上代码中,我们在“http”块内添加了一个名为“server”的块,并在其中使用“if”指令限制了 IP。如果来自于“$not_allowed_ip”的 IP 访问了该服务器,就会返回 403 错误。4. 重新加载 Nginx在保存 Nginx 配置文件之后,需要重新加载 Nginx,以使其对新配置文件生效。可以使用以下命令重新加载 Nginx:sudo systemctl reload nginx这就是如何使用 Nginx 来限制 IP 的方法。使用 Nginx 防御 DDoS 攻击1. 配置限制并发连接数您可以通过以下配置来限制来自单个 IP 的并发连接数:http { ... limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; ... server { ... limit_conn conn_limit_per_ip 10; ... } ... }以上代码中,我们定义了一个名为“$binary_remote_addr”的变量,以保存远程 IP的二进制表示。使用“limit_conn_zone”指令,定义了一个名为“conn_limit_per_ip”的限制连接数的共享内存区域,其大小为10M。最后,使用“limit_conn”指令在“server”块内定义了连接限制规则。2. 配置请求速率限制您可以通过以下配置来限制每个 IP 的请求速率:http { ... limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=1r/s; ... server { ... limit_req zone=req_limit_per_ip burst=10 nodelay; ... } ... }以上代码中,我们定义了一个名为“req_limit_per_ip”的请求数速率限制共享内存区域,其大小为10M,速率为每秒1个请求。“limit_req”指令已在“server”块内定义,将请求速率限制为10次每秒,而没有延迟。3. 配置 Body Size 限制如果您想要限制上传的文件大小,则可以使用“client_max_body_size”指令:http { ... # limit body size client_max_body_size 10m; ... }以上代码中,我们使用“client_max_body_size”指令限制了上传的文件最大大小,为10M。使用 Nginx 防御 SQL 注入和 XSS 攻击1. 配置防止 SQL 注入使用 Nginx 防止 SQL 注入攻击的方法之一是禁止某些字符或字符串。可以在 Nginx 的配置文件中添加以下代码:http { ... server { ... if ($query_string ~ "union.*select.*\(") { return 403; } if ($query_string ~ "cookies|document|base64") { return 403; } ... } ... }以上代码中,我们使用两个“if”指令,用于检测 query_string 是否包含一些关键字,如“union”、“select”和“cookies”等。如果其中任何一个条件得到满足,就会返回 403 错误,并禁止访问该请求。2. 配置防止 XSS 攻击您可以使用以下 Nginx 配置代码来防止 XSS 攻击:http { ... server { ... add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Frame-Options "SAMEORIGIN"; ... } ... }以上代码中,我们使用“add_header”指令配置了三个 header。这三个 header 分别为:X-Content-Type-Options:将值设置为“nosniff”,禁止浏览器读取匹配响应各种可能的 MIME 类型的响应数据。X-XSS-Protection:将值设置为“1; mode=block”,启用 XSS 保护,并向浏览器发送阻止呈现页面的指令。X-Frame-Options:将值设置为“SAMEORIGIN”,限制页面嵌入到同源或空源网页中。以上就是使用 Nginx 防御 SQL 注入和 XSS 攻击的方法。总结本文讲解了如何使用 Nginx 实现限制各种恶意访问攻击,包括限制 IP、防御 DDoS 攻击、防御 SQL 注入和 XSS 攻击等。通过实现这些安全性措施,可以帮助您的 Web 服务更加安全,避免被网络攻击者攻击。希望本文能够对您有所帮助。拓展Nginx如何通过使用应用程序防火墙模块( WAF)防范Web攻击
2023年12月29日
10 阅读
0 评论
0 点赞
2023-12-29
nginx几个安全配置及说明
nginx几个安全配置及说明随着互联网的发展,web服务器已经成为多数网站架构中不可或缺的组件。而nginx作为一款高性能的Web服务器,在不同规模的网站中得到广泛的应用。然而,在使用nginx时,安全配置也是一项重要的任务,以保护网站不受攻击和恶意请求的影响。在本文中,我们将探讨nginx安全配置及其代码和详细注释。一、限制请求速率攻击者可以通过发送大量请求来占用服务器资源,导致服务器变慢或甚至崩溃。为了限制请求速率,需要使用nginx模块中的“limit_req”和“limit_conn”。“limit_req”模块可以控制请求的速率,可以指定单位时间内服务器所能接收的请求数。例如,每秒钟只允许接收30个请求,“burst”参数指定的是瞬时请求数的最大数量:http{ limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server{ location /{ limit_req zone=one burst=5 nodelay; //其他配置 } } }说明:limit_req_zone:定义限制请求的区域,指定IP地址种类为binary_remote_addr,分配10M存储空间,速率为30个请求/分钟。limit_req:将请求限制到特定的“zone”中,当瞬间请求数超过“burst”参数所指定的数量时,该请求将被拒绝。nodelay选项表示拒绝请求,并向客户端返回503状态码。“limit_conn”则可以限制连接的数量,在高并发请求时,防止服务器在处理过多请求时出现响应缓慢或崩溃的情况。http{ limit_conn_zone $binary_remote_addr zone=addr:10m; server{ location /{ limit_conn addr 10; //其他配置 } } }说明:limit_conn_zone:定义限制请求连接数的区域,同样是指定IP地址种类为binary_remote_addr,分配10M存储空间。limit_conn:将连接限制到特定的“zone”中,连接数超过10个时,后续连接将被拒绝。二、禁止访问某些目录和文件网站中有一些目录或文件是不应该被公开访问的,如网站根目录下的配置文件、数据文件等。为了保护这些文件,需要在nginx配置文件中进行设置。http{ server { location ~ /\.{ deny all; } location ~* ^/(dir1|dir2|dir3)/ { deny all; return 404; } } }说明:location ~ /.{}:使用正则表达式匹配所有以“.”开头的文件或目录,并拒绝所有对它们的请求。location ~* ^/(dir1|dir2|dir3)/{}:匹配所有以“/dir1”、“/dir2”和“/dir3”开头的URL,并拒绝它们的请求。三、防止DDoS攻击DDoS攻击 是一种特别恶劣的攻击形式,它的目的是 利用大量的请求将服务器压垮 。为了保护服务器不受此类攻击,需要 使用一些nginx模块 ,例如 “http_limit_conn_module”和“http_limit_req_module”。http{ limit_conn_zone $binary_remote_addr zone=conn_limit:10m; limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; server { location / { limit_conn conn_limit 10; limit_req zone=req_limit burst=20; //其他配置 } } }说明:limit_conn_zone:同样是定义限制请求连接数的区域,分配10M存储空间。limit_req_zone:同样是定义限制请求的区域,指定IP地址种类为binary_remote_addr,分配10M存储空间,速率为10个请求/秒。limit_conn和limit_req:限制连接和请求速率,连接和请求速率超过定义值时,请求被拒绝。四、启用HTTPS并加强SSL/TLS安全为了保护数据在传输过程中的安全,很多网站都启用HTTPS协议,并加强SSL/TLS安全。nginx可以使用“SSL/TLS Offloading”技术来实现HTTPS和SSL/TLS加密。http{ server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name example.com www.example.com; ssl_certificate /etc/ssl/example.com/fullchain.pem; ssl_certificate_key /etc/ssl/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:EECDH+AESGCM:EECDH+CHACHA20:EECDH+AES128:EDH+AESGCM:EDH+CHACHA20:EDH+AES128:RSA+AESGCM:!aNULL:!eNULL:!LOW:!RC4:!MD5:!EXP:!PSK:!DSS:!SRP:!kECDH:!CAMELLIA:!SEED:!IDEA:!3DES'; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Frame-Options "SAMEORIGIN" always; //其他配置 } }说明:listen 443 ssl http2:在443端口上开启HTTPS,并启用HTTP/2协议。ssl_certificate和ssl_certificate_key:分别指定SSL/TLS数字证书的公钥和私钥文件路径。ssl_session_timeout:指定SSL/TLS会话超时时间。ssl_session_cache shared:SSL:50m:缓存一定数量的SSL/TLS会话,提高SSL/TLS重复访问的性能。ssl_session_tickets off:禁用会话票据,防止攻击者使用重用的会话ID来危害安全。ssl_dhparam:指定Diffie-Hellman参数,增强密钥交换的安全性,减少暴力破解的风险。ssl_protocols:指定使用的SSL/TLS协议版本。ssl_ciphers:指定启用的TLS加密算法。add_header:添加响应头,增强安全性,如HSTS、X-XSS-Protection、X-Content-Type-Options和X-Frame-Options。总结对于nginx安全配置,限制请求速率、禁止访问某些目录和文件、防止DDoS攻击和加强SSL/TLS安全等措施都是必要的。加强nginx的安全性可以有效防止各种攻击、保护网站的机密信息和用户信息,同时也增强了服务器系统的稳定性和系统运行效率。因此,建议在实践中将nginx安全性的措施落实在实际应用过程中。
2023年12月29日
14 阅读
0 评论
0 点赞
2023-12-28
linux小白也能实现nginx日志按天优化!
linux小白也能实现nginx日志按天优化!前言:接着上一篇文章《记一次nginx拦截爬虫》,发现服务器nginx日志非常不好看,时间长了一大堆都在一个文件里边(甚至几年的),对于我这种linux小白就不友好了,所以想把日志分文件,这样至少我们去查看日志的时候会方便很多:按天分文件直接上nginx.conf配置user nginx;worker_processes 2;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {worker_connections 1024;}http {include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time'; #引入time_iso8601模块 设置时间 日期变量 map $time_iso8601 $logdate { #'~^(?<ymdh>\d{4}-\d{2}-\d{2}T\d{2})' $ymdh; '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found'; } #日志存放目录 access_log /var/log/nginx/access-$logdate.log main; #日志缓存,将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效 open_log_file_cache max=10; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; #隐藏http版本号 server_tokens off;}这样就会按照天生成日志文件;这里边最重要的就是引入$time_iso8601(这个是nginx里边自带的一个时间格式)进行自定义变量,不需要额按编译。日期格式优化nginx自带两种时间格式:$time_iso8601 形如 2023-03-29T16:58:49+08:00$time_local 形如 14/Nov/2022:08:28:14 +0000可以看出$time_local的格式看起来不是很美妙,对于我自己来说肯定按照 ‘年月日时分秒’ 这样看更顺眼一些,所以我们在自定义日志格式的时候,时间格式也是选择的是$time_iso8601。时间怎么和我们本地时间一致时间格式顺眼了,但是发现时间还是UTC时区的时间,怎么处理呢:我这边使用的是docker-compose,可以直接配置环境变量。version: '3'services: d_nginx:container_name: c_nginx environment: TZ: 'Asia/Shanghai'第二种就是Dockerfile中编译,一劳永逸。FROM nginx:1.20.1-alpine定义时区参数ENV TZ=Asia/Shanghai有一些低版本的nginx做了以上两步还是不得行,有可能是因为缺少了tzdata时区数据包。FROM nginx:1.12.1-alpine将alpine的源更换成阿里云的源RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories定义时区参数ENV TZ=Asia/Shanghai安装时区数据包RUN apk add --update tzdata设置时区RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone经过上边的步骤nginx日志里边的格式和时间应该就是我自己想要的了。给大家分享一个nginx日志分析工具goaccess:地址:https://github.com/allinurl/goaccessgoaccess nginx.log -a > nginx.html这个工具能方便快速的分析nginx日志,能可视化的展示很多信息,帮助我们快速定位问题;比如接口的调用量(具体到某一个接口),访问者数量等等。前言:接着上一篇文章《记一次nginx拦截爬虫》,发现服务器nginx日志非常不好看,时间长了一大堆都在一个文件里边(甚至几年的),对于我这种linux小白就不友好了,所以想把日志分文件,这样至少我们去查看日志的时候会方便很多:按天分文件直接上nginx.conf配置user nginx;worker_processes 2;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {worker_connections 1024;}http {include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $request_time $upstream_response_time'; #引入time_iso8601模块 设置时间 日期变量 map $time_iso8601 $logdate { #'~^(?<ymdh>\d{4}-\d{2}-\d{2}T\d{2})' $ymdh; '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found'; } #日志存放目录 access_log /var/log/nginx/access-$logdate.log main; #日志缓存,将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效 open_log_file_cache max=10; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; #隐藏http版本号 server_tokens off;}这样就会按照天生成日志文件;这里边最重要的就是引入$time_iso8601(这个是nginx里边自带的一个时间格式)进行自定义变量,不需要额按编译。日期格式优化nginx自带两种时间格式:$time_iso8601 形如 2023-03-29T16:58:49+08:00$time_local 形如 14/Nov/2022:08:28:14 +0000可以看出$time_local的格式看起来不是很美妙,对于我自己来说肯定按照 ‘年月日时分秒’ 这样看更顺眼一些,所以我们在自定义日志格式的时候,时间格式也是选择的是$time_iso8601。时间怎么和我们本地时间一致时间格式顺眼了,但是发现时间还是UTC时区的时间,怎么处理呢:我这边使用的是docker-compose,可以直接配置环境变量。version: '3'services: d_nginx:container_name: c_nginx environment: TZ: 'Asia/Shanghai'第二种就是Dockerfile中编译,一劳永逸。FROM nginx:1.20.1-alpine定义时区参数ENV TZ=Asia/Shanghai有一些低版本的nginx做了以上两步还是不得行,有可能是因为缺少了tzdata时区数据包。FROM nginx:1.12.1-alpine将alpine的源更换成阿里云的源RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories定义时区参数ENV TZ=Asia/Shanghai安装时区数据包RUN apk add --update tzdata设置时区RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo '$TZ' > /etc/timezone经过上边的步骤nginx日志里边的格式和时间应该就是我自己想要的了。给大家分享一个nginx日志分析工具goaccess:地址:https://github.com/allinurl/goaccessgoaccess nginx.log -a > nginx.html这个工具能方便快速的分析nginx日志,能可视化的展示很多信息,帮助我们快速定位问题;比如接口的调用量(具体到某一个接口),访问者数量等等。
2023年12月28日
13 阅读
0 评论
0 点赞
2023-12-28
内存飙升!记一次Nginx拦截爬虫
内存飙升!记一次Nginx拦截爬虫前言:最近发现服务器在某个时间段,内存疯狂飙升,开始还以为是正常的业务造成的,升级服务器内存,发现还是没有解决问题;(这里自己偷懒了,一开始没有找到问题,默认为就是业务量上来了)马上查看 nginx 日志,发现了一些不同寻常的请求:这是什么玩意,怀揣着好奇心马上去搜索了一下,结果:好家伙,差点没把我服务器送回家;赶紧解决:nginx 层面解决发现虽然是爬虫,但是并没有伪装,每个请求里边都带了 user-agent,而且都是一样的,那就好解决了,直接上代码:(我这里适用的是 docker)1、docker-composeversion: '3'services: d_nginx:container_name: c_nginx env_file: - ./env_files/nginx-web.env image: nginx:1.20.1-alpine ports: - '80:80' - '81:81' - '443:443' links: - d_php volumes: - ./nginx/conf:/etc/nginx/conf.d - ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/deny-agent.conf:/etc/nginx/agent-deny.conf - ./nginx/certs:/etc/nginx/certs - ./nginx/logs:/var/log/nginx/ - ./www:/var/www/html2、目录结构nginx-----nginx.conf-----agent-deny.conf-----conf----------xxxx01_server.conf----------xxxx02_server.conf3、agent-deny.confif ($http_user_agent ~* (Scrapy|AhrefsBot)) {return 404;}if ($http_user_agent ~ "Mozilla/5.0 (compatible; AhrefsBot/7.0; +http://ahrefs.com/robot/)|^$" ) {return 403;}4、然后在每个 service 里边 include 这个 agent-deny.confserver {include /etc/nginx/agent-deny.conf; listen 80; server_name localhost; client_max_body_size 100M; root /var/www/html/xxxxx/public; index index.php; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #客户端允许上传文件大小 client_max_body_size 300M; #客户端缓冲区大小,设置过小,nginx就不会在内存里边处理,将生成临时文件,增加IO #默认情况下,该指令,32位系统设置一个8k缓冲区,64位系统设置一个16k缓冲区 #client_body_buffer_size 5M; #发现设置改参数后,服务器内存跳动的幅度比较大,因为你不能控制客户端上传,决定不设置改参数 #此指令禁用NGINX缓冲区并将请求体存储在临时文件中。文件包含纯文本数据。该指令在NGINX配置的http,server和location区块使用 #可选值有: #off:该值将禁用文件写入 #clean:请求body将被写入文件。该文件将在处理请求后删除 #on: 请求正文将被写入文件。处理请求后,将不会删除该文件 client_body_in_file_only clean; #客户端请求超时时间 client_body_timeout 600s; location /locales { break; } location / { #禁止get请求下载.htaccess文件 if ($request_uri = '/.htaccess') { return 404; } #禁止get请求下载.gitignore文件 if ($request_uri = '/storage/.gitignore') { return 404; } #禁止get下载web.config文件 if ($request_uri = '/web.config') { return 404; } try_files $uri $uri/ /index.php?$query_string; } location /oauth/token { #禁止get请求访问 /oauth/token if ($request_method = 'GET') { return 404; } try_files $uri $uri/ /index.php?$query_string; } location /other/de { proxy_pass http://127.0.0.1/oauth/; rewrite ^/other/de(.*)$ https://www.baidu.com permanent; } location ~ \.php$ { try_files $uri /index.php =404; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass d_php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_connect_timeout 300s; fastcgi_send_timeout 300s; fastcgi_read_timeout 300s; include fastcgi_params; #add_header 'Access-Control-Allow-Origin' '*'; #add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; #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,token'; }}这样每个请求里边都会拦截这个 AhrefsBot 了。阿里云安全组拦截分析日志还发现,其实请求的 IP 就那么几个段,那么为了多重保证(阿里云这个是见效最快,效果最好的,付费的就是不一样)ip 段:54.36.0.051.222.0.0195.154.0.0直接外网入方向
2023年12月28日
7 阅读
0 评论
0 点赞
2023-11-21
Nginx配置性能优化的方法
Nginx配置性能优化的方法在大多数情况下,一个常规安装的Nginx对你的网站来说已经能很好地工作了。然而,如果你真的想挤压出Nginx的性能,你必须更深入一些。在本指南中,我将解释Nginx的那些设置可以微调,以优化处理大量客户端时的性能。需要注意一点,这不是一个全面的微调指南。这是一个简单的预览——那些可以通过微调来提高性能设置的概述。你的情况可能不同。基本的 (优化过的)配置我们将修改的唯一文件是Nginx.conf,其中包含Nginx不同模块的所有设置。你应该能够在服务器的/etc/nginx目录中找到nginx.conf。首先,我们将谈论一些全局设置,然后按文件中的模块挨个来,谈一下哪些设置能够让你在大量客户端访问时拥有良好的性能,为什么它们会提高性能。本文的结尾有一个完整的配置文件。高层的配置Nginx.conf文件中,Nginx中有少数的几个高级配置在模块部分之上。user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; user和pid应该按默认设置 - 我们不会更改这些内容,因为更改与否没有什么不同。worker_processes 定义了nginx对外提供web服务时的worker进程数。这个值取决于许多因素,包括(但不限于)CPU核的数量、存储数据的硬盘数量及负载模式。不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。worker_rlimit_nofile 更改worker进程的打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。Events模块events模块中包含Nginx中所有处理连接的设置。events { worker_connections 2048; multi_accept on; use epoll; } worker_connections 设置可由一个worker进程同时打开的*连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。记住,*客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。multi_accept 告诉nginx收到一个新连接通知后接受尽可能多的连接。use 设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。(值得注意的是如果你不知道Nginx该使用哪种轮询方法的话,它会选择一个最适合你操作系统的)HTTP 模块HTTP模块控制着Nginx http处理的所有核心特性。因为这里只有很少的配置,所以我们只节选配置的一小部分。所有这些设置都应该在http模块中,甚至你不会特别的注意到这段设置。http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; ... } server_tokens 并不会让nginx执行的速度更快,但它可以关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。sendfile 可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。tcp_nopush 告诉nginx在一个数据包里发送所有头文件,而不一个接一个的发送。tcp_nodelay 告诉nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。access_log off; error_log /var/log/nginx/error.log crit; access_log 设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快(aka,YOLO)error_log 告诉nginx只能记录严重的错误:keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; keepalive_timeout 给客户端分配keep-alive链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。client_header_timeout 和 client_body_timeout 设置请求头和请求体(各自)的超时时间。我们也可以把这个设置低些。reset_timeout_connection 告诉nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。send_timeout 指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操作之间。如果在这段时间内,客户端没有读取任何数据,nginx就会关闭连接。limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; limit_conn_zone 设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。limit_conn 为给定的key设置*连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接。include /etc/nginx/mime.types; default_type text/html; charset UTF-8; include 只是一个在当前文件中包含另一个文件内容的指令。这里我们使用它来加载稍后会用到的一系列的MIME类型。default_type 设置文件使用的默认的MIME-type。charset 设置我们的头文件中的默认的字符集gzip on; gzip_disable "msie6"; # gzip_static on; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 4; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; gzip 是告诉nginx采用gzip压缩的形式发送数据。这将会减少我们发送的数据量。gzip_disable 为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。gzip_static 告诉nginx在压缩资源之前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件(在这个例子中被注释掉了),从而允许你使用*压缩比,这样nginx就不用再压缩这些文件了(想要更详尽的gzip_static的信息,请点击这里)。gzip_proxied 允许或者禁止压缩基于请求和响应的响应流。我们设置为any,意味着将会压缩所有的请求。gzip_min_length 设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们*不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。gzip_comp_level 设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比*的。我们设置为4,这是一个比较折中的设置。gzip_type 设置需要压缩的数据格式。上面例子中已经有一些了,你也可以再添加更多的格式。# cache informations about file descriptors, frequently accessed files # can boost performance, but you need to test those values open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; ## # Virtual Host Configs # aka our settings for specific servers ## include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; open_file_cache 打开缓存的同时也指定了缓存 数目,以及缓存的时间。我们可以设置一个相对高的时间,这样我们可以在它们不活动超过20秒后清除掉。open_file_cache_valid 在open_file_cache中指定检测正确信息的间隔时间。open_file_cache_min_uses 定义了open_file_cache中指令参数不活动时间期间里最小的文件数。open_file_cache_errors 指定了当搜索一个文件时是否缓存错误信息,也包括再次给配置中添加文件。我们也包括了服务器模块,这些是在不同文件中定义的。如果你的服务器模块不在这些位置,你就得修改这一行来指定正确的位置。一个完整的配置user www-data; pid /var/run/nginx.pid; worker_processes auto; worker_rlimit_nofile 100000; events { worker_connections 2048; multi_accept on; use epoll; } http { server_tokens off; sendfile on; tcp_nopush on; tcp_nodelay on; access_log off; error_log /var/log/nginx/error.log crit; keepalive_timeout 10; client_header_timeout 10; client_body_timeout 10; reset_timedout_connection on; send_timeout 10; limit_conn_zone $binary_remote_addr zone=addr:5m; limit_conn addr 100; include /etc/nginx/mime.types; default_type text/html; charset UTF-8; gzip on; gzip_disable "msie6"; gzip_proxied any; gzip_min_length 1000; gzip_comp_level 6; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; open_file_cache max=100000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; } 编辑完配置后,确认重启nginx使设置生效。
2023年11月21日
43 阅读
0 评论
0 点赞
1
2
3