-
Nginx 模块介绍HTTP 模块: HTTP模块提供了处理HTTP请求的功能,包括反向代理、负载均衡、缓存、HTTP代理等。例如:proxy模块用于反向代理和负载均衡,fastcgi模块用于处理FastCGI请求。Stream 模块: Stream模块用于处理TCP和UDP流量,允许Nginx作为代理服务器处理非HTTP流量。例如:stream模块用于配置TCP代理和负载均衡。# 修改 nginx 主配置文件 vim /etc/nginx/nginx.conf cd /etc/nginx/conf.d/ mkdir stream && cd stream # 创建 nginx stream 配置 vim mysql_3320.conf upstream mysql3320 { server 192.168.0.164:3306; } server { listen 3320; # 如果监听3306,远程登录的时不用加-p参数 proxy_connect_timeout 500s; proxy_timeout 500s; proxy_pass mysql3320; } # 重新加载配置 nginx -s reload MySQL 配置文件# IP连接限制放开 bind_address=0.0.0.0 远程连接 MySQLmysql -h <域名> -P 3320 -u root -p
-
在Web开发中,HTTP 413 Request Entity Too Large错误常常出现在客户端发送的请求体超过服务器允许的大小限制时。本文详细解析了这种错误的成因,包括服务器配置、应用层设置及反向代理的限制,并提供了一系列调试和解决方案。本文涵盖了如何在Nginx和Apache服务器中调整配置,修改Spring Boot和Node.js等应用的请求体限制,以及适当配置反向代理和负载均衡器。通过实际示例,读者可以学会如何应对和解决HTTP 413错误,确保系统能够稳定、高效地处理大文件上传和数据请求,从而提升用户体验和系统性能。一、什么是413 Request Entity Too Large错误?1. 当前HTTP 413错误的定义HTTP 413错误表示请求体大于服务器允许的最大大小。这个限制可以由服务器配置(如Nginx、Apache等)或应用自身(如Java、Node.js等)来控制。2. 现象与影响当HTTP 413错误发生时,客户端通常会收到一条“Request Entity Too Large”的错误信息,表示请求被拒绝并且服务器不会处理该请求。这对于用户体验和系统功能性都会带来负面影响,特别是在文件上传和数据提交这种场景。二、为什么会产生413错误?1. 服务器限制413错误大多数情况下源于服务器的配置限制。服务器通常会设置一个最大请求体大小以保护其自身免受资源消耗过度的攻击。Nginx:通过 client_max_body_size 指令进行限制。Apache:通过 LimitRequestBody 指令进行控制。2. 应用层限制在某些情况下,应用程序本身也会设置请求体的大小限制。例如,Java的Servlet、Spring Boot以及许多其他框架和库都有自己的大小限制参数。3. 反向代理/负载均衡设置在使用反向代理或负载均衡时,也可能设置了请求大小的限制。三、如何调试和解决413错误?1. 修改Nginx配置1.1 修改配置文件在Nginx中,client_max_body_size指令默认限制为1MB,可以通过配置文件进行调整: http { client_max_body_size 10M; # 设置为10MB } server { client_max_body_size 10M; # 设置为10MB } location /upload { client_max_body_size 10M; # 设置为10MB } 1.2 重载Nginx配置修改配置文件后,重载Nginx配置使之生效:sudo nginx -s reload 2. 修改Apache配置2.1 修改配置文件在Apache中,可以通过 LimitRequestBody 指令进行控制,设置为10MB:2.2 重启Apache服务器修改配置文件后,重启Apache服务器使之生效:3. 修改应用配置3.1 Spring Boot示例在Spring Boot中,修改application.properties文件,增加如下配置:spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=10MB 4. 配置反向代理/负载均衡器4.1 例子:Nginx反向代理如果Nginx作为反向代理服务器,你需要确保在主要服务器配置和反向代理服务器配置中都设置了 client_max_body_size: # 主服务器配置 http { client_max_body_size 10M; # 设置为10MB } # 反向代理配置 server { location / { proxy_pass http://backend_server; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10M; # 设置为10MB } }
-
如何完美解决 Nginx出现 404 Not Found nginx/1.23.4 解决方案摘要在Nginx配置过程中,404 Not Found错误是一个常见问题。本文将详细解析Nginx 404 Not Found的原因及解决方案,确保您能够轻松解决这一问题。通过本篇文章,您将了解Nginx配置的细节,掌握快速定位和修复404错误的方法,提升服务器的稳定性和用户体验。引言作为一名全栈工程师,Nginx是我们日常工作中不可或缺的工具。然而,在配置Nginx时,难免会遇到404 Not Found的问题,这不仅影响用户访问体验,还可能导致业务中断。今天,我们将深入探讨Nginx 404 Not Found错误的原因及其解决方案,帮助大家快速定位问题并实施修复。正文 404 Not Found错误的原因分析404 Not Found错误表示服务器无法找到请求的资源。造成这一问题的原因可能有很多,常见的包括:配置文件错误:Nginx的配置文件中路径或文件名错误。权限问题:Nginx进程对请求的资源没有适当的权限。符号链接问题:请求的资源是一个符号链接,但链接指向的目标不可用或没有权限。文件不存在:请求的文件确实不存在。配置文件检查检查Nginx配置文件首先,我们需要检查Nginx的配置文件(通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/目录中)。确保文件路径和名称正确无误。server { listen 80; server_name example.com; location / { root /var/www/html; index index.html index.htm; } error_page 404 /404.html; location = /404.html { internal; } } 路径和文件名确保配置文件中的root和index指令正确指向存在的路径和文件。权限设置检查文件权限Nginx进程需要对请求的文件具有读取权限。我们可以使用以下命令检查文件权限:1ls -la /var/www/html确保文件和目录的权限设置合理,例如:12chmod 755 /var/www/htmlchmod 644 /var/www/html/index.html符号链接问题如果请求的资源是一个符号链接,确保链接指向的目标存在并且有适当的权限。1ls -l /var/www/html/symlink文件不存在如果请求的文件不存在,需要创建该文件或修改配置以指向正确的文件。1touch /var/www/html/index.htmlQA环节Q: 为什么我修改了配置文件,还是404错误?A: 确保修改后重新加载Nginx配置文件:1sudo nginx -s reloadQ: 如何检查Nginx日志来定位问题?A: Nginx的错误日志通常位于/var/log/nginx/error.log。可以使用以下命令查看日志:1tail -f /var/log/nginx/error.log小结通过以上步骤,我们可以有效地解决Nginx的404 Not Found错误。无论是配置文件错误、权限问题、符号链接问题还是文件不存在,都可以通过细致的检查和合理的调整来解决。
-
前言Nginx 的 socket 代理通常指的是 Nginx 通过 stream 模块来处理非 HTTP 的 TCP 流量,比如数据库连接、SSH 连接或其他 TCP 协议的流量。stream 模块允许 Nginx 作为一个反向代理来处理这些连接。简单的 Nginx stream 代理配置以下是一个简单的 Nginx stream 代理配置示例,用于代理 TCP 连接:1234567891011121314events { worker_connections 1024; } stream { server { listen <local_port>; # Nginx 监听的本地端口 proxy_pass <backend_server>:<backend_port>; # 后端服务器的地址和端口 # 可选配置项 # proxy_connect_timeout 1s; # 连接超时时间 # proxy_timeout 10m; # 代理超时时间 } }在这个配置中,你需要替换 <local_port> 为 Nginx 将要监听的本地端口,以及 <backend_server> 和 <backend_port> 为实际的后端服务器地址和端口。负载均衡配置stream 模块还支持负载均衡。你可以使用 upstream 块来定义一组后端服务器,然后在 server 块中引用这个 upstream 块。12345678910111213141516stream { upstream backend_servers { server backend1.example.com:12345; server backend2.example.com:12345; # 可以添加更多服务器 # 可选配置项 # hash $remote_addr; # 根据客户端 IP 进行哈希负载均衡 # least_conn; # 使用最少连接数的服务器 } server { listen <local_port>; proxy_pass backend_servers; } }注意几点:stream 模块:确保你的 Nginx 版本支持 stream 模块。较新版本的 Nginx 默认包含这个模块。非 HTTP 流量:stream 模块处理的是 TCP 流量,不是 HTTP 流量。因此,它不适合代理 web 请求。安全性:当你代理敏感数据(如数据库连接)时,请确保使用加密连接(如 SSL/TLS),并在 Nginx 配置中启用相应的加密选项。负载均衡:除了简单的代理功能外,你还可以使用 stream 模块来实现 TCP 连接的负载均衡。这可以通过在 upstream 块中定义多个后端服务器来实现。日志和监控:与 HTTP 代理一样,你也可以为 stream 代理配置日志和监控功能,以便跟踪和调试连接问题。一、编译安装支持stream 模块的Nginx1.安装必要的编译工具和依赖项在 CentOS 7 上,您可以使用以下命令安装这些工具:1sudo yum install gcc-c++ pcre-devel zlib-devel make2. 下载Nginx源代码下载 Nginx 1.24.0 的源代码压缩包,并解压缩:12wget http://nginx.org/download/nginx-1.24.0.tar.gztar -zxvf nginx-1.24.0.tar.gz改名mv nginx-1.24.0 nginxSrc3. 配置编译选项进入 Nginx 源代码目录并运行configure脚本,指定所需的stream功能模块。4. 编译和安装123456789[root@td66 nginxSrc]# make && make installmake -f objs/Makefilemake[1]: 进入目录“/usr/local/nginxSrc”cc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/nginx.o \ src/core/nginx.ccc -c -pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \ -o objs/src/core/ngx_log.o \ src/core/ngx_log.c5. 启动 Nginx12cd /usr/local/nginx/sbin/./nginx6. 验证安装打开您的 Web 浏览器并访问服务器的 IP 地址或域名,您应该能够看到 Nginx 的欢迎页面。二、Nginx命令nginx 命令用于控制 Nginx 服务器的启动、停止、重新加载配置文件等操作。以下是一些常用的 nginx 命令及其说明:1. 启动 Nginx1nginx这个命令将启动 Nginx 服务器。如果配置文件(通常是 /etc/nginx/nginx.conf 或 /usr/local/nginx/conf/nginx.conf)存在且没有语法错误,Nginx 将开始监听配置的端口,并处理请求。2. 停止 Nginx1nginx -s stop或者1sudo service nginx stop或者在某些系统上1sudo systemctl stop nginx这些命令将停止正在运行的 Nginx 服务器。-s stop 选项发送一个信号给 Nginx 主进程,让它立即停止。3. 重新加载配置1nginx -s reload或者1sudo service nginx reload或者在某些系统上1sudo systemctl reload nginx这个命令将重新加载 Nginx 的配置文件。如果配置文件有变动,这个命令将应用新的配置,而不需要停止和重新启动 Nginx。重新加载配置通常不会导致正在处理的请求中断。4. 测试配置文件的语法1nginx -t这个命令将检查 Nginx 配置文件的语法是否正确,并返回结果。如果配置文件有语法错误,nginx -t 会指出错误的位置,但不会实际加载配置。5. 显示版本信息1nginx -v这个命令将显示当前安装的 Nginx 的版本信息。6. 显示编译选项1nginx -V这个命令将显示 Nginx 在编译时使用的选项和包含的模块。这对于诊断问题或了解特定模块是否已编译非常有用。7. 其他常用命令查看帮助信息:nginx -h 或 nginx --help平滑升级 Nginx:可以使用 nginx -s quit 来优雅地关闭旧版本的 Nginx,然后启动新版本。请注意,上述命令可能需要使用 sudo 来获取管理员权限,具体取决于你的系统设置和 Nginx 的安装方式。此外,不同系统或安装方式可能会使用不同的服务管理器(如 systemctl、service 或 /etc/init.d/nginx 脚本),所以停止和启动服务的命令可能有所不同。三、Nginx stream配置3.1 编辑nginx.conf文件vim nginx.conf1234567891011121314151617181920#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;#pid logs/nginx.pid;events { worker_connections 1024;}stream { server { listen 6666; # Nginx 监听的端口 proxy_pass 10.68.8.70:6666; # 后端服务器的地址和端口 } }3.2检查配置文件是否正确1nginx -t -c nginx.conf如果报如下错误说明没有成功安装stream模块1nginx: [emerg] unknown directive "stream" in /usr/local/nginx/conf/nginx.conf:163.3 使配置文件生效1nginx -s reload
-
nginx12345678location ^~ /task/ { # 这样,当您访问 http://hostname:port/task/test 时, # 请求会被转发到 proxy_pass /test,注意 /task/ 前缀在转发时被去掉了。 proxy_pass http://127.0.0.1:8080/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }当您希望保留原始请求的 URI 时,您应该在 proxy_pass 指令中使用 ; 来结束地址部分,然后在后面添加 proxy_set_header Host $host; 来确保请求头的 Host 字段被正确设置。请注意,我在 proxy_pass 指令的末尾添加了一个斜杠 /。这是非常重要的,因为它告诉 Nginx 在转发请求时去掉匹配的前缀(在这个例子中是 /task/)。如果省略了这个斜杠,Nginx 会将完整的原始 URI(包括 /task/ 前缀)转发到后端服务器。补充Nginx 的匹配顺序是基于配置文件中的 location 块和它们的指令前缀。下面是 Nginx 匹配顺序的详细说明:精确匹配:如果请求的 URI 与 location 块中的路径完全匹配(以 = 开头),则 Nginx 会选择该 location 块进行处理。最长前缀匹配:如果没有精确匹配,Nginx 会进行最长前缀匹配。它会选择路径最长的 location 块,其中路径可以是普通字符串(不带 ^~ 或正则表达式)或带有 ^~ 前缀的路径。如果找到以 ^~ 开头的 location 块,Nginx 会立即停止搜索并使用该块,即使存在其他更长的普通字符串路径。正则表达式匹配:如果最长前缀匹配未找到匹配的 location 块,Nginx 会检查以 ~ 或 ~* 开头的 location 块,这些块使用正则表达式来匹配请求的 URI。~ 表示区分大小写的正则表达式匹配,而 ~* 表示不区分大小写的匹配。Nginx 会按照配置文件中的顺序逐个检查这些正则表达式,直到找到第一个匹配的 location 块。默认处理:如果以上三个步骤都没有找到匹配的 location 块,Nginx 会使用默认的 location 块。默认的 location 块通常是一个以 / 开头的普通字符串路径,它会匹配所有未被其他 location 块捕获的请求。以下是一个简单的示例配置,展示了 Nginx 的匹配顺序:123456789101112131415161718192021222324server { listen 80; server_name example.com; location = /exact-match { # 处理精确匹配的请求 } location ^~ /prefix-match { # 处理以 "prefix-match" 开头的最长前缀请求 } location / { # 处理所有其他请求 } location ~* \.php$ { # 处理所有以 ".php" 结尾的请求,不区分大小写 } location ~ \.jpg$ { # 处理所有以 ".jpg" 结尾的请求,区分大小写 }}在这个示例中,如果请求是 /exact-match,Nginx 会选择第一个 location 块。如果请求是 /prefix-match/something,Nginx 会选择第二个 location 块,因为 ^~ 前缀指定了最长前缀匹配。对于所有其他请求,Nginx 会按照配置文件中的顺序继续检查正则表达式匹配,或者最终使用默认的第三个 location 块。
-
要通过Nginx实现多个域名和集群,你需要配置Nginx作为反向代理服务器,将来自不同域名的请求转发到集群中的相应后端服务器。下面是一个基本的配置示例,你可以根据自己的需求进行修改和扩展。首先,确保你已经安装了Nginx,并且具有适当的访问权限来编辑Nginx的配置文件。1、打开Nginx的配置文件,通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf。2、在配置文件中,找到http块,这是Nginx处理HTTP请求的主要部分。3、在http块内,为每个域名创建一个server块。每个server块将处理来自特定域名的请求。以下是一个示例配置,其中包含两个域名(example1.com和example2.com)的server块:12345678910111213141516171819202122232425262728293031323334353637383940http { # 第一个域名的server块 server { listen 80; server_name example1.com; location / { proxy_pass http://backend_cluster1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 第二个域名的server块 server { listen 80; server_name example2.com; location / { proxy_pass http://backend_cluster2; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } # 配置集群的上游服务器 upstream backend_cluster1 { server backend1_ip_address; server backend2_ip_address; # 可以添加更多后端服务器 } upstream backend_cluster2 { server backend3_ip_address; server backend4_ip_address; # 可以添加更多后端服务器 } }在上面的示例中,server_name指令用于指定域名,proxy_pass指令用于将请求转发到相应的集群。upstream块用于定义集群中的后端服务器列表。确保将backend_ip_address替换为实际的后端服务器IP地址或主机名。4、保存并关闭配置文件。5、检查Nginx配置文件的语法是否正确1sudo nginx -t如果没有错误消息显示,表示配置文件语法正确。6、重新加载Nginx配置,使更改生效:1sudo nginx -s reload现在,Nginx将根据配置文件中定义的规则,将来自不同域名的请求转发到相应的集群中。
-
其实有很多方式,网上看到一个这个方法,给大家介绍一下。首先,开启支持-TLS SNI support什么是SNI?传统的应用场景中,一台服务器对应一个IP地址,一个域名,使用一张包含了域名信息的证书。随着云计算技术的普及,在云中的虚拟机有了一个IP,对应多个域名,使用多张证书的应用场景,SNI技术应运而生。SNI(Server Name Indication),即实现了一个服务器使用多个域名证书的TLS扩展,支持用户配置多个域名证书。SNI请求特点HTTP请求的Host字段在请求的Header中。发起HTTPS请求时,在TLS握手阶段,还无法进行HTTP数据的解析,此时TLS协议的Client Hello字段新增了一个Server Name字段,请求的客户端可以通过这个字段填充请求的Host信息,而服务端在TLS握手阶段就可以选择请求处理的证书,实现SNI的功能。支持-TLS SNI supportNginx支持单IP多域名SSL证书需要OpenSSL支持,首先需要编译安装一个高版本的openssl。Nginx支持SNI,允许在同一个TLS服务端口下,配置不同的域名,用户通过请求不同的证书域名,可返回相应的upstream响应结果。检查nginx是否支持TLS SNI support:12/usr/local/nginx/sbin/nginx -Vnginx version: nginx/1.10.2TLS SNI support disabledconfigure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_moduleTLS SNI support disabled 这样是不支持的。下面开始升级openssl:123456wget ftp://ftp.openssl.org/source/openssl-1.0.2h.tar.gztar xzvf openssl-1.0.2h.tar.gzcd openssl-1.0.2h./config --prefix=/usr/local/openssl/ enable-shared enable-tlsextmake && make install[root@localhost ~]# /usr/local/nginx/sbin/nginx -V nginx version: nginx/1.10.2 built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55) built with OpenSSL 1.0.2h 21 Dec 2016 TLS SNI support enabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-openssl=/usr/local/openssl --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module 方法1:多server配置不同证书和域名123456789101112131415161718192021server { listen 443; server_name *.www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/_.www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/_.www.aabb.com.private.key"; ......} server { listen 443; server_name www.aabb.com; index index.html index.htm index.php; root /data/wwwroot/www.aabb.com/webroot; ssl on; ssl_certificate "/usr/local/nginx/conf/ssl/www.aabb.com.public.cer"; ssl_certificate_key "/usr/local/nginx/conf/ssl/www.aabb.com.private.key"; ......}方法2:根据ssl_server_name判断配置ssl_server_name例子1:对于nginx多https站点通常的做法是这样:12345server 443 ssl;server_name nixops1.me;ssl_certificate /usr/local/nginx/keys/nixops1.me.crt;ssl_certificate_key /usr/local/nginx/keys/nixops1.me.key;......如果有多个https站点,就是每个站点复制一份这个配置。如nixops2.me、nixops3.me等等,在只有几十个https站点的时候还好,如果某个站点的域名特别多,例如有几千个域名甚至上万个域名的时候,这个配置就很恐怖了,需要精简并合并配置。下面举例说明,假设应用场景为:同一站点有大量域名需要配置https证书,其它配置一样每个之证书都是泛域名证书,如let's encrypt的wildcard证书所有证书命名均为公钥domain.com.crt、私钥为domain.com.key 这样的格式所有证书保存在相同目录中,如/usr/local/nginx/conf/keys/具体做法可以用nginx的map和正则表达式,根据ssl_server_name(即https的访问域名),获取公钥和私钥的完整路径做为变量。配置证书时使用该变量即可。先来看nginx配置文件中HTTP段的map配置:123456789map $ssl_server_name $NixopsCert { default /usr/local/nginx/conf/keys/nixops.me.crt; #指定一个默认的证书 ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.crt;}map $ssl_server_name $NixopsKey { default /usr/local/nginx/conf/keys/nixops.me.key; ~*^(.+\.)*([^\.]+\.[^\.]+)$ /usr/local/nginx/conf/keys/$2.key;}这样配置好后,如果通过https访问nixops1.me或*.nixops1.me,获取到的路径分别为:12$NixopsCert --> /usr/local/nginx/conf/keys/nixops1.me.crt;$NixopsKey --> /usr/local/nginx/conf/keys/nixops1.me.key;然后配置server段证书公钥和私钥时就不需要按传统作法复制配置,只需指定变量即可:12345678910111213141516server { listen 80; listen 443 ssl http2; server_name nixops.me nixops1.me nixops2.me #...... ; ssl_certificate $NixopsCert; ssl_certificate_key $NixopsKey; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; #其它server段配置}这样同一站点有多个证书时,就可以只在server_name里添加,不需要指定https配置了,和http站点添加域名绑定非常类似。
-
Nginx的流式响应配置使用ChatGPT的能力在聊天时来实现打字机效果,因此需要服务端接口进行流式响应,碰到了几个问题:1、服务端明明配置了响应头的Content-Type为:text/event-stream,但前端仍然不是流式接收内容。2、虽然前端能以流式接收服务端的响应内容,但内容接收完毕,长连接并未关闭,导致前端还以为服务端有数据,会一直请求服务端,最后导致超时。最后发现是nginx的问题,由于本地对接的时候并未启用nginx,所以本地对接没有任何问题。而线上使用nginx请求转发,有些配置是有默认参数的,所以会失败。因此,在这里分享一下,如果小伙们遇到同样的问题,可以试一试。nginx部分配置如下:123456789101112131415161718192021222324252627server { server_name xxxx; listen xxxx; location /xx/xx { add_header backendIP $upstream_addr; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; # 设置http版本为1.1;默认为:1.0 proxy_set_header Connection ""; # 设置Connection为长连接;默认为:no proxy_cache off; # 关闭缓存;默认是:on proxy_buffering off; # 关闭代理缓冲;默认是:on chunked_transfer_encoding on; # 开启分块传输编码 tcp_nopush on; # 开启TCP NOPUSH选项,禁止Nagle算法 tcp_nodelay on; # 开启TCP NODELAY选项,禁止延迟ACK算法 keepalive_timeout 60; # 设定keep-alive超时时间为60秒 proxy_pass http://xxxx:xxxx; proxy_redirect off; proxy_connect_timeout 15; # 与upstream server的连接超时时间(没有单位,最大不可以超过75s) proxy_send_timeout 300; # 发送请求给upstream服务器的超时时间 proxy_read_timeout 300; # nginx会等待多长时间来获得请求的响应 }}最主要的几个配置:proxy_http_version 1.1;proxy_set_header Connection “”;proxy_cache off;proxy_buffering off;chunked_transfer_encoding on;知识点:Nginx 是通过缓存响应内容来处理请求的。也就是说,当 Nginx 接收到完整的响应后,才会将其发送给客户端,因此默认是不支持流式响应,需要手动开启。
-
1. 问题描述在启动nginx服务的时候显示内容如下:1sudo systemctl status nginx题出现原因:根据日志显示,Nginx 服务启动失败,主要原因是无法绑定到端口 80。这通常是由于该端口已被其他进程占用而导致的。2. 解决方案要解决此问题,可以执行以下步骤:确认端口 80 是否被其他进程占用。可以使用以下命令检查:1sudo netstat -tuln | grep :80该命令会列出正在监听端口 80 的进程。如果有其他进程在使用该端口打开配置文件:可以将80端口【默认端口】修改为 8080 端口【当然也可以是其他的,不过要记得去防火墙添加规则(即添加端口)可以使用以下命令打开配置文件:1sudo nano /etc/nginx/sites-available/将里面的代码模块123server { listen 80 default_server; listen [::]:80 default_server;修改成123server { listen 8080 default_server; listen [::]:8080 default_server;完成修改!【如果其他地方还有 80 的修改成 8080 即可】。启动Nginx服务1sudo systemctl start nginx设置Nginx服务自启动:1sudo systemctl enable nginx验证Nginx是否运行:1sudo systemctl status nginx
-
proxy_pass参数用于配置反向代理,指定客户端请求被转发到后端服务器,后端地址可以是域名、ip端口URI代理后端报错提示本地找不到CSS文件、JavaScript文件或图片例如:nginx :10.1.74.109后端服务:http://10.1.74.109:8082参数配置:123location /harbor { proxy_pass http://10.1.74.109:8082; }访问http://10.1.74.109/zabbix 显示不全,提示文件css等静态文件不存在。原因在于proxy_pass确实指向后端服务器,但浏览器加载页面时,可能会请求一些静态资源,但是这些请求可能不包含/zabbix前缀,也可能静态资源是动态生成的,因此才会去本地去查找这些文件例如以上后端登录前访问得地址为http://10.1.74.109:8082/,登录成功后得地址为http://10.1.74.109:8082/zabbix.php?action=dashboard.view,没有包含/zabbix前缀如果当后端地址后缀不会发生改变的前提代理,一般来说是正常的处理方式:使用proxy_set_header设置正确的Host头1234567location /zabbix { proxy_pass http://10.1.74.109:8082/; #url后面必须加上"/" proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; keepalive_timeout 500; }参数含义proxy_set_header Host $host;nginx在转发请求时,将Host请求头的值设置为原始请求的主机名和端口,后端可能依赖Host头来确定应该提供那些内容proxy_set_header X-Real-IP $remote_addr;X-Real-IP用于设别发起请求客户端的真是IP地址,$remote_addr是一个变量包含客户端的IP地址proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;X-Forwarded-For 表示HTTP请求的来源地址,用于追踪请求来源,$proxy_add_x_forwarded_for 是一个特殊的变量,包含原始请求的 X-Forwarded-For 头(如果存在的话)和客户端的 IP 地址。后端服务器可以看到所有经过的代理服务器和原始客户端的 IP 地址。keepalive_timeout 500;设置长连接超时时间,当客户端和服务器之间建立一个长连接后,该连接会在设置时间内保持打开状态,以便客户端通过相同的连接发送多个请求,减少连接开销,提高性能proxy_pass不同写法的影响客户端请求地址为:www.ljx.com/a.html方式一:proxy_pass http://10.1.1.1;12345location /ceshi/{ proxy_pass http://10.1.1.1; ...} 请求地址:www.ljx.com/ceshi/a.html代理后地址:http://10.1.1.1/ceshi/a.html解释:完整的请求URI(包括/ceshi/a.html)将被发送到后端服务器10.1.1.1。由于proxy_pass没有指定URI部分,因此原始请求的URI保持不变。方式二:proxy_pass http://10.1.1.1/;12345location /ceshi/{ proxy_pass http://10.1.1.1/; ...} 请求地址:www.ljx.com/ceshi/a.html代理后地址:http://10.1.1.1/a.html解释:由于proxy_pass后面有一个斜杠/,nginx会忽略原始请求URI中的/ceshi/部分,只保留a.html部分,并将其发送到后端服务器方式三:proxy_pass http://10.1.1.1/index/;12345location /ceshi/{ proxy_pass http://10.1.1.1/index/; ...} 请求地址:www.ljx.com/ceshi/a.html代理后地址:http://10.1.1.1/index/a.html解释:原始请求的URI中的/ceshi/被替换为/index/,然后发送到后端服务器。路径的其余部分a.html保持不变方式四:proxy_pass http://10.1.1.1/somepath;12345location /ceshi/{ proxy_pass http://10.1.1.1/somepath; ...} 请求地址:ljx./ceshi/a.html代理后地址:http://10.1.1.1/somepath解释:无论原始请求的URI是什么,都会被完全替换为proxy_pass后面指定的URI(在这里是/somepath)。查询字符串(如果有的话)也会被忽略
-
一、nginx的access.log1.日志文件一般存放在 /var/log/nginx 下,若是docker启动则可以使用主机挂载位置,直接使用 tail -f命令即可查看access日志。2.access.log具体每项的含义:参数 说明 示例$remote_addr 客户端地址 172.17.0.1$remote_user 客户端用户名称 --$time_local 访问时间和时区 [29/Dec/2022:10:17:14 +0000]$request 请求的URI和HTTP协议 "GET /test/nginx/proxy HTTP/1.1"$http_host 请求地址,即浏览器中你输入的地址(IP或域名) 10.1.7.33$status HTTP请求状态 200$upstream_status upstream状态 200$body_bytes_sent 发送给客户端文件内容大小 38$http_referer url跳转来源 - $http_user_agent 用户终端浏览器等信息 "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36"$http_cookie 用户cookie信息 "grafana_session=73d13d456cb4363f8a48f5501348669e"$ssl_protocol SSL协议版本 TLSv1$ssl_cipher 交换数据中的算法 RC4-SHA$upstream_addr 后台upstream的地址,即真正提供服务的主机地址 "10.1.7.33:8102"$request_time 整个请求的总时间 0.012$upstream_response_time 请求过程中,upstream响应时间 0.0123.access.log 的格式是可以自己自定义,输出的信息格式在nginx.conf中设置可以在location中增加header,输出用户代理服务器地址1234567891011location /test/ { #limit_req zone=allips burst=1 nodelay; proxy_pass http://myServer/test/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; #代理服务器地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 8m;}二、日志流量统计Nginx: PV、UV、独立IP做网站的都知道,平常经常要查询下网站PV、UV等网站的访问数据,当然如果网站做了CDN的话,nginx本地的日志就没什么意义了,下面就对nginx网站的日志访问数据做下统计;UV(Unique Visitor):独立访客,将每个独立上网电脑(以cookie为依据)视为一位访客,一天之内(00:00-24:00),访问您网站的访客数量。一天之内相同cookie的访问只被计算1次PV(Page View):访问量,即页面浏览量或者点击量,用户每次对网站的访问均被记录1次。用户对同一页面的多次访问,访问量值累计统计独立IP:00:00-24:00内相同IP地址只被计算一次,做网站优化的朋友最关心这个日志统计分析,日志内容如下:12345root@DESKTOP-0NVFL1I:/home/volumes/nginx_vts/log# tail -f access.log172.17.0.1 - [30/Dec/2022:02:17:19 +0000] "GET /test/nginx/proxy HTTP/1.1" "10.1.7.33" 200 200 38 "-" "grafana_session=73d13d456cb4363f8a48f5501348669e" "-" "10.1.7.33:8101" 0.008 0.008172.17.0.1 - [30/Dec/2022:02:17:20 +0000] "GET /test/nginx/proxy HTTP/1.1" "10.1.7.33" 200 200 38 "-" "grafana_session=73d13d456cb4363f8a48f5501348669e" "-" "10.1.7.33:8102" 0.016 0.016172.17.0.1 - [30/Dec/2022:02:19:55 +0000] "GET /test/nginx/proxy HTTP/1.1" "10.1.7.33" 200 200 38 "-" "grafana_session=73d13d456cb4363f8a48f5501348669e" "-" "10.1.7.33:8101" 0.010 0.010172.17.0.1 - [30/Dec/2022:02:19:56 +0000] "GET /test/nginx/proxy HTTP/1.1" "10.1.7.33" 200 200 38 "-" "grafana_session=73d13d456cb4363f8a48f5501348669e" "-" "10.1.7.33:8102" 0.011 0.011统计接口地址访问量1grep /test access.log | wc -lPV统计1awk '{print $6}' access.log | wc -lUV统计1awk '{print $13}' access.log | sort -r |uniq -c |wc -l独立IP统计1awk '{print $1}' access.log | sort -r |uniq -c | wc -l三、配置access.log按天生成1.nginx.conf配置文件http代码块中修改成如下代码12345678#配置按天生成access.log日志文件map $time_iso8601 $logdate { '~^(?<ymd>\d{4}-\d{2}-\d{2})' $ymd; default 'date-not-found';}#access_log /var/log/nginx/access.log main;access_log /var/log/nginx/access-$logdate.log main;error_log /var/log/nginx/error.log;2.重启nginx,再次访问接口,并查看日志,日志按天生成1234root@DESKTOP-0NVFL1I:/home/volumes/nginx_vts/log# ll-rwxrwxrwx 1 buckletime buckletime 744 Dec 30 11:14 access-2022-12-30.log-rwxrwxrwx 1 buckletime buckletime 744 Dec 30 10:19 access.log-rw-r--r-- 1 root root 12586 Dec 30 10:14 error.log若权限不够则,修改日志文件权限1chmod -R 777 /var/log/nginx/
-
如何在Linux系统上使用Nginx配置IP访问限制,以增强服务器的安全性。我们将详细讨论如何设置Nginx的访问控制列表(ACL)来限制特定IP地址的访问。一、限制IP访问1.1 配置Nginx的ACL在Nginx的配置文件中,我们可以使用allow和deny指令来设置IP访问限制。打开Nginx的配置文件(通常是/usr/local/nginx/nginx.conf),在需要限制访问的位置块中添加以下配置:123456location / { deny 192.168.1.1; #拒绝IP allow 192.168.1.100; #允许IP allow 10.0.0.0/24; #允许IP deny all; #拒绝其他所有IP }上述配置将允许IP地址为192.168.1.100、10.0.0.0/24的客户端访问该位置,而拒绝192.168.1.1、其他所有客户端的访问。注意:IP需要根据自己的应用场景,设置合适的IP地址。1)设置了阻止访问网站或敏感目录的IP2)设置了允许访问网站或敏感目录的IP以上两个条件同时满足时合规,否则不合规。1.2 重载Nginx配置在修改完Nginx配置文件后,需要重新加载Nginx以使更改生效。可以使用以下命令重新加载Nginx配置:123cd 到nginx的sbin目录,执行./nginx -s reload1.3 验证结果1cat /usr/local/nginx/conf/nginx.conf |sed "/\s*#/d"|sed "/^\s*$/d"|egrep -i "allow|deny"为了验证IP访问限制是否生效,可以尝试从不同IP地址的客户端访问设置了限制的位置。确保只有在允许的IP地址范围内的客户端才能成功访问,而其他客户端将被拒绝访问。通过配置Nginx的ACL,可以轻松实现在Linux系统上限制特定IP地址的访问。这种访问控制可以帮助您增强服务器的安全性,防止未经授权的访问。二、隐藏nginx版本信息修改Nginx配置文件以隐藏版本信息,从而减少暴露服务器的潜在风险。2.1 打开Nginx配置文件首先,打开Nginx的配置文件(通常是/usr/local/nginx/nginx.conf)2.2 隐藏Nginx版本信息1、在Nginx配置文件中,找到或添加以下配置项:1server_tokens off;存在以上配置则合规,否则不合规。将server_tokens设置为off可以隐藏Nginx版本信息。这样,当客户端发送请求时,服务器将不会在响应头中包含Nginx的版本信息。2、修改nginx解压缩路径ngx_http_header_filter_module.c文件可使用1find / -name ngx_http_header_filter_module.c进行检索。(/home/user/nginx-1.23.1/src/http/ngx_http_header_filter_module.c)文件的第48和49行内容,自定义头信息:12static char ngx_http_server_string[] = “Server:XXXXX” CRLF; static char ngx_http_server_full_string[] = “Server:XXXXX” CRLF; ngx_http_header_filter_module.c文件是Nginx中的一个模块,主要负责过滤和修改HTTP响应头。在Nginx中,HTTP响应头包含了服务器发送给客户端的元数据信息,如Content-Type、Content-Length等。通过这个模块,可以在发送HTTP响应之前对响应头进行操作,比如添加、修改或删除特定的响应头字段。ngx_http_header_filter_module.c文件的作用是允许开发者在Nginx中对HTTP响应头进行定制化操作,以满足特定的需求或增强服务器的功能。2.3 保存并重新加载Nginx配置保存对Nginx配置文件的更改,并使用以下命令重新加载Nginx配置:123cd 到nginx的sbin目录,执行./nginx -s reload2.4 验证结果1cat /usr/local/nginx/conf/nginx.conf |sed "/\s*#/d"|sed "/^\s*$/d"|grep -i "server_tokens"2.5 验证隐藏版本信息为了验证Nginx版本信息是否已成功隐藏,您可以使用浏览器或命令行工具发送请求到您的Nginx服务器,并检查响应头中是否包含Nginx版本信息。可以看到,Nginx版本信息已经隐藏。
-
1.1 Nginx 控制超时时间配置在 Nginx 服务器中,超时时间是一个重要的配置选项,它决定了服务器在处理请求时等待客户端响应的最大时间。通过适当配置超时时间,可以提高服务器的性能和稳定性。本文将介绍如何在 Nginx 中配置不同类型的超时时间。编辑nginx.conf,是否存在如下内容:1234keepalive_timeout 5 5; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间client_body_timeout 10; #设置客户端请求主体读取超时时间client_header_timeout 10; #设置客户端请求头读取超时时间send_timeout 10; #指定响应客户端的超时时间存在以上内容则合规,否则不合规。加固步骤:1、编辑nginx.conf,配置如下内容(如果存在则修改,不存在则新增):1234keepalive_timeout 5 5; #第一个参数指定客户端连接保持活动的超时时间,第二个参数是可选的,它指定了消息头保持活动的有效时间client_body_timeout 10; #设置客户端请求主体读取超时时间client_header_timeout 10; #设置客户端请求头读取超时时间send_timeout 10; #指定响应客户端的超时时间2、重新加载或者重启nginx服务1234/usr/local/nginx/sbin/nginx -s reload ##加载配置/usr/local/nginx/sbin/nginx -s stop ##停止/usr/local/nginx/sbin/nginx ##启动3、验证配置123##使用命令cat /usr/local/nginx/conf/nginx.conf |sed "/\s*#/d"|sed "/^\s*$/d"|egrep -i "client_body_timeout|client_header_timeout|keepalive_timeout|send_timeout"说明:client_header_timeout变量可以在http,server中使用。client_body_timeout、keepalive_timeout、sendtimeout变量可以在http,server,location中使用。需要根据应用场景的需要选择合适的参数值.1.2 Nginx 限制客户端下载速度&并发连接数在高并发的网络环境下,限制客户端下载的并发连接数是一种常见的服务器优化策略。通过限制每个客户端可以同时建立的连接数量,可以有效控制服务器的负载,提高系统的稳定性和性能。本文将介绍如何在 Nginx 中配置限制客户端下载的并发连接数。1、编辑文件nginx.conf,查看是否存在如下配置:12limit_zone one $binary_remote_addr 10m;limit_conn one 10;判定依据:1).限制了每个ip能发起的并发连接数2).设置了存储session状态的容器以上两个条件同时满足则合规,否则不合规。加固步骤:配置示例:在 Nginx 中,可以通过配置 limit_conn_module 模块来限制客户端的并发连接数。该模块可以根据客户端 IP 地址或其他标识符来限制并发连接数。12345678910111213141516171819202122http{ limit_req_zone $binary_remote_addr zone=req_limit_zone:10m rate=1r/s; limit_conn_zone $binary_remote_addr zone=conn_zone:10m; …… server { listen 80 server_name down.nsfocus.com; index index.html index.htm index.php; root /usr/local/nsfocus; #Zone limit; location / { limit_req zone=req_limit_zone burst=5 nodelay; limit_conn conn_zone 10; limit_rate 20k; #限制每个连接的限制速度为20K,IP的下载速度为连接数*限制速度 }} ……… } 配置指令的含义如下:limit_req_zone $binary_remote_addr zone=req_limit_zone:10m rate=1r/s;limit_req_zone: 这是 Nginx 的指令,用于定义一个请求速率限制区域。$binary_remote_addr: 这是一个 Nginx 内置变量,表示客户端的二进制形式的远程地址。zone=req_limit_zone:10m: 这里定义了一个名为 req_limit_zone 的请求速率限制区域,大小为 10MB。rate=1r/s: 这表示在 req_limit_zone 区域内,每秒允许的请求速率为 1 个请求。limit_conn_zone $binary_remote_addr zone=conn_zone:10m;limit_conn_zone: 这是 Nginx 的指令,用于定义一个连接数限制区域。$binary_remote_addr: 这是一个 Nginx 内置变量,表示客户端的二进制形式的远程地址。zone=conn_zone:10m: 这里定义了一个名为 conn_zone 的连接数限制区域,大小为 10MB。limit_req zone=req_limit_zone burst=5 nodelay;limit_req: 这是 Nginx 的指令,用于设置请求速率限制。zone=req_limit_zone: 这指定了要应用的请求速率限制区域,即之前定义的 req_limit_zone。burst=5: 这表示在达到请求速率限制时,允许的最大突发请求数为 5。当请求速率超过限制时,允许一定数量的请求突发到达。nodelay: 这表示不延迟请求,即不等待,立即应用速率限制。limit_conn conn_zone 10;limit_conn: 这是 Nginx 的指令,用于设置连接数限制。conn_zone: 这指定了要应用的连接数限制区域,即之前定义的 conn_zone。10: 这表示允许的最大连接数为 10。超过这个连接数限制时,新的连接将被拒绝。limit_rate 20k;限制每个连接的限制速度为20K,IP的下载速度为连接数*限制速度(2).重启nginx服务123./nginx -s reload # 加载nginx配置./nginx -s stop # 停止./nginx #启动根据应用场景的需要进行并发数、速度限制 。注:limit_zone 这个变量只能在http中使用 limit_coon和limit_rate变量可以在http,server,location中使用nginx自从1.1.8版本发布后将limit_conn更换为limit_conn_zone。需要在配置文件中将 limit_zone 修改为 limit_conn_zone,然后重新加载 Nginx 配置文件。否则会出现错误:nginx: [emerg] unknown directive "limit_zone" in /usr/local/nginx/conf/nginx.conf:37
-
配置文件 默认放置位置:{nginx}/conf.d/,以conf结尾一、http简单配置 server { listen 80; server_name www.test.cn; root /mnt/website/ROOT; if ( $query_string ~* ".*[;'<>].*" ){ return 404; } if ( $query_string ~* ".*script.*" ){ return 404; } location ~* ^/WEB-INF/.*$ { deny all; } location ~* ^/(UserFiles|userfiles|images|Images|upload)/.*\.(jsp|js)$ { deny all; } location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8888; } } server{ server_name test.cn; root /mnt/website/ROOT; location ^~ / { rewrite ^(.*) http://www.test.cn$1 permanent; } } 说明:1,http默认端口是802,http://127.0.0.1:8888;为实际本地服务端口3,一般服务域名为二级域名www,一级域名一般也配置指向www域名。二、https配置首先得申请ssl证书,百度,阿里都有免费证书可用,申请成功后,下载nginx压缩包,解压后,可见两种后缀文件,一个是xxx.key,另一个是xxx.crt,或者是xxx.pem。文件名可以随意更改,一般改为域名。其次是配置文件配置 server { listen 443; server_name www.test.cn; root /mnt/website/ROOT; ssl on; ssl_certificate /etc/nginx/ssl/www.test.cn.crt; ssl_certificate_key /etc/nginx/ssl/www.test.cn.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM; ssl_prefer_server_ciphers on; if ( $query_string ~* ".*[;'<>].*" ){ return 404; } if ( $query_string ~* ".*script.*" ){ return 404; } location ~* ^/imgPath/.*$ { rewrite ^/imgPath(.*) http://img.test.cn/imgPath$1 last; } location ~* ^/WEB-INF/.*$ { deny all; } location ~* ^/(UserFiles|userfiles|images|Images|upload)/.*\.(jsp|js)$ { deny all; } location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8888; } } 说明:1,https端口为443,此端口不是服务器默认开放端口,需要单独打开。2,ssl文件放置正确即可。crt文件换成pem文件亦可。3,资源文件路径可指向其他域名,可见location ~* ^/imgPath/.*$这段三、单域名指向本地不同服务,以https配置为例 upstream shop { server 127.0.0.1:7777; } server { listen 443; server_name www.test.cn; root /mnt/website/ROOT; ssl on; ssl_certificate /etc/nginx/ssl/www.test.cn.crt; ssl_certificate_key /etc/nginx/ssl/www.test.cn.key; ssl_session_timeout 5m; ssl_protocols SSLv3 TLSv1; ssl_ciphers HIGH:!ADH:!EXPORT56:RC4+RSA:+MEDIUM; ssl_prefer_server_ciphers on; if ( $query_string ~* ".*[;'<>].*" ){ return 404; } if ( $query_string ~* ".*script.*" ){ return 404; } location ~* ^/imgPath/.*$ { rewrite ^/imgPath(.*) http://img.test.cn/imgPath$1 last; } location ~* ^/WEB-INF/.*$ { deny all; } location ~* ^/(UserFiles|userfiles|images|Images|upload)/.*\.(jsp|js)$ { deny all; } location / { rewrite ^(.*) https://www.test.com$1 permanent; } location /shop/ { proxy_pass http://shop; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; client_max_body_size 10m; client_body_buffer_size 128k; proxy_connect_timeout 300; proxy_send_timeout 300; proxy_read_timeout 300; proxy_buffer_size 128k; proxy_buffers 2 256k; proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; } } 说明:1,upstream shop,shop只能出现一次2,可以是本地服务,亦可是其他ip服务,127.0.0.1换成对应ip即可3,location /shop/ ,此块必须在server的区块内,/shop/为访问路径,即https://www.test.cn/shop/xxx,为访问路径
-
什么是慢速连接攻击缓慢的HTTP拒绝服务攻击是一种专门针对于Web的应用层拒绝服务攻击,攻击者操纵网络上的肉鸡,对目标Web服务器进行海量HTTP请求攻击,直到服务器带宽被打满,造成了拒绝服务。(瘫痪目标服务器)慢速连接攻击类型慢速连接攻击主要有如下几种:1.Slow headers攻击攻击者向服务器发起HTTP请求,而且不停地发送HTTP头部。服务器为需要接收完所有HTTP头部,才能处理请求。由于HTTP头部不停地被攻击者发送,服务器永远也无法接收完,服务器的web容器很快就会被攻击者占满了TCP连接,而不再接收新的请求,最终拒绝服务。2.Slow body攻击攻击者向目标服务器发送POST请求,服务器以为要接收大量数据,一直保持连接状态,但攻击者却以10S-100s一个字节的速度去发送数据,类似的连接被不断增加后,服务器资源被大量消耗,最终达到极限拒绝服务。3.Slow read攻击攻击者与服务器建立连接后,会发送完整的请求给服务器,一直保持连接状态,然后以极低的速度读取Response,或者让服务器觉得客户端很忙,消耗服务器的连接和内存资源。防护手段真对http慢速攻击的特点,防护时可对每秒钟http并发连接数进行检查。当每秒种http并发连接数超过设定值时,会触发http报文检查,检查出一下任意一种情况,都认定受到http慢速连接攻击。1.连续多个httppost报文的总长度都很大,但是其http载荷长度都很小。2.连续多个httpget/post报文的报文头都没有结束标识。将该源ip判定为攻击源加入黑名单,同时断开此ip地址与http服务器的连接。对web服务器的http头部传输的最大许可时间进行限制,修改成最大许可时间为20秒。统计每个TCP连接的时长并计算单位时间内通过的报文数量即可做精确识别。一个TCP连接中,HTTP报文太少和报文太多都是不正常的,过少可能是慢速连接攻击。过多可能是使用HTTP 1.1协议进行deHTTP Flood攻击,在一个TCP连接中发送多个HTTP请求。周期内统计报文数量。一个TCP连接,HTTP请求的报文中,报文过多或者报文过少都是有问题的,如果一个周期内报文数量非常少,那么它就可能是慢速攻击;如果一个周期内报文数量非常多,那么它就可能是一个CC攻击。限制HTTP请求头的最大许可时间。超过最大许可时间,如果数据还没有传输完成,那么它就有可能是一个慢速攻击。Nginx1、通过调整$request_method,配置服务器接受http包的操作限制;2、在保证业务不受影响的前提下,调整client_max_body_size, client_body_buffer_size, client_header_buffer_size,large_client_header_buffersclient_body_timeout, client_header_timeout的值,必要时可以适当的增加;3、对于会话或者相同的ip地址,可以使用HttpLimitReqModule and HttpLimitZoneModule参数去限制请求量或者并发连接数;4、根据CPU和负载的大小,来配置worker_processes 和 worker_connections的值,公式是:max_clients = worker_processes * worker_connections。
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签