-
Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能、稳定性、丰富的功能以及低资源消耗而受到青睐。今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟们有帮助,废话不多说,马上开整。1. 系统层面:调整内核参数:例如,增加系统文件描述符的限制、TCP连接队列的大小等。网络优化:可以使用TCP Fast Open、选择更高效的网络协议等。2. Nginx配置:Worker进程数:通常设置为等于服务器的CPU核心数。连接数:通过调整worker_connections参数,可以增加每个Worker进程可以打开的连接数。使用HTTP/2:HTTP/2提供了更好的性能,包括头部压缩和服务器推送等功能。3. 缓存利用:启用文件缓存:Nginx可以将静态文件缓存在服务器本地,减少磁盘I/O操作。使用代理缓存:例如,使用Nginx作为反向代理服务器时,可以缓存后端服务器的响应内容。4. 压缩:启用Gzip压缩可以减少数据传输量,提高响应速度。5. 负载均衡策略:根据服务器的性能和负载情况,选择合适的负载均衡策略,如轮询、最少连接数、IP哈希等。下面 V 哥针对每个点结合业务场景来详细介绍,老铁们坐稳了,要发车了。1. 系统层面Nginx性能调优可以从多个层面进行,这里我们重点讨论系统层面的调优步骤。系统层面的调优主要是对操作系统进行优化,以更好地支持Nginx的高并发处理能力。1. 内核参数调整内核参数的调整可以通过修改/etc/sysctl.conf文件来实现,这些参数会影响网络栈的行为。net.core.somaxconn:这个参数设置了一个系统范围内所有监听Socket的未完成连接队列的最大长度。调高这个值可以避免在高峰期出现"connection refused"的错误。sysctl -w net.core.somaxconn=65535net.ipv4.tcp_max_syn_backlog:这个参数设置了TCP连接建立时,SYN队列的最大长度。在高负载情况下,增加这个值可以防止SYN洪水攻击。sysctl -w net.ipv4.tcp_max_syn_backlog=65535net.ipv4.ip_local_port_range:这个参数定义了本地端口范围,增加这个范围可以允许更多的并发连接。sysctl -w net.ipv4.ip_local_port_range="1024 65535" net.ipv4.tcp_fin_timeout:这个参数决定了系统回收TCP连接的时间。减小这个值可以加快回收速度,释放资源。sysctl -w net.ipv4.tcp_fin_timeout=30net.ipv4.tcp_tw_reuse 和 net.ipv4.tcp_tw_recycle:这两个参数控制了TCP连接的TIME_WAIT状态。开启它们可以更快地重用和回收处于TIME_WAIT状态的连接。sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_tw_recycle=12. 文件描述符限制增加系统允许的文件描述符数量,以便Nginx可以打开更多的连接。用户级限制:修改/etc/security/limits.conf文件,增加Nginx用户(通常是www-data或nginx)的nofile限制。nginx soft nofile 65535 nginx hard nofile 65535系统级限制:修改/proc/sys/fs/file-max文件,增加整个系统的最大文件描述符数。echo 65535 > /proc/sys/fs/file-max3. 网络栈优化禁用Syn Cookies:在高峰期,可以临时禁用Syn Cookies,以提高TCP连接的建立速度。sysctl -w net.ipv4.tcp_syncookies=0调整TCP Keepalive:通过调整net.ipv4.tcp_keepalive_time等参数,可以优化长连接的管理。sysctl -w net.ipv4.tcp_keepalive_time=6004. 硬件和架构优化使用SSD存储:使用固态硬盘可以显著提高I/O性能,尤其是对于需要频繁读写文件的Nginx服务器。网络硬件:使用高带宽和低延迟的网络硬件,如万兆以太网,可以提高数据传输速度。负载均衡:如果服务器面临极高的负载,可以考虑使用硬件负载均衡器来分担Nginx的压力。5. 操作系统选择和优化选择合适的操作系统:不同的操作系统对网络性能的支持不同,选择一个适合高并发网络服务的操作系统是很有帮助的。关闭不必要的系统服务:减少系统运行的进程和服务,可以释放更多的系统资源给Nginx使用。在进行系统层面的调优时,需要注意平衡性能提升和系统稳定性之间的关系。过度的优化可能会导致系统不稳定,甚至出现资源耗尽的情况。因此,建议在调优过程中进行充分的测试,并根据服务器的具体情况进行调整。2. Nginx配置Nginx的性能调优可以通过修改其配置文件nginx.conf来实现。以下是一些具体的调优步骤和建议:1. Worker进程数Nginx使用多进程模型,通常情况下,Worker进程的数量应该设置为等于服务器的CPU核心数。这样可以最大化利用多核CPU的性能。worker_processes auto; # 或者指定具体的进程数,如 worker_processes 4; 2. Worker连接数每个Worker进程可以同时处理的最大连接数由worker_connections指令设置。这个值应该根据服务器的内存大小和系统负载来合理设置。events { worker_connections 4096; # 根据服务器能力适当调整 }3. 使用HTTP/2如果客户端支持,可以启用HTTP/2,它提供了更好的性能,包括头部压缩和服务器推送等功能。listen 443 ssl http2;4. 文件描述符限制增加Nginx可以打开的文件描述符数量,以处理更多的并发连接。worker_rlimit_nofile 65535;5. 启用Gzip压缩压缩可以减少数据传输量,提高响应速度。gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_buffers 16 8k; gzip_http_version 1.1; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;6. 缓存配置配置浏览器缓存,减少重复请求。location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; add_header Cache-Control "public"; }7. 静态资源处理对于静态资源,可以使用sendfile快速传输文件。location /static/ { sendfile on; tcp_nopush on; tcp_nodelay off; }8. 负载均衡如果有多台后端服务器,可以使用Nginx的负载均衡功能。upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; keepalive 64; # 保持活动的连接数 } server { location / { proxy_pass http://backend; } }9. 优化SSL/TLS如果使用SSL/TLS,可以优化相关配置以提高性能。ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384'; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;10. 日志配置减少不必要的日志记录,可以减少磁盘I/O和CPU使用。access_log off; # 或者将日志写入内存文件系统 在进行Nginx配置调优时,应该逐步进行,每次更改后都要进行测试,以确保更改确实提高了性能,并且没有引入新的问题。此外,不同的应用场景可能需要不同的优化策略,因此最好根据实际情况进行调整。3. 缓存利用Nginx缓存利用是提高性能的重要手段,它可以通过减少服务器负载、降低响应时间和减少网络带宽使用来显著提升用户体验。以下是缓存利用的具体调优步骤:1. 启用Nginx内置缓存Nginx内置了多种缓存机制,如文件系统缓存、内存缓存等。可以通过配置nginx.conf来启用这些缓存。文件系统缓存(HTTP缓存)在HTTP模块中,可以使用proxy_cache指令启用代理缓存。http { # 定义缓存区域 proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { location / { proxy_cache my_cache; # 使用定义的缓存区域 proxy_cache_valid 200 302 10m; # 对200和302响应缓存10分钟 proxy_cache_valid 404 1m; # 对404响应缓存1分钟 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; # 在指定情况下使用过期缓存 } } }内存缓存(FastCGI缓存)如果使用FastCGI(如与PHP-FPM配合),可以使用fastcgi_cache指令启用缓存。http { # 定义FastCGI缓存区域 fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m; server { location ~ \.php$ { fastcgi_cache my_cache; # 使用定义的缓存区域 fastcgi_cache_key $request_uri; # 定义缓存键 fastcgi_cache_valid 200 30m; # 对200响应缓存30分钟 } } }2. 配置浏览器缓存通过设置HTTP头,可以指示浏览器缓存静态资源。location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 设置资源的过期时间 add_header Cache-Control "public"; # 指示资源可以被浏览器和代理缓存 }3. 使用CDN内容分发网络(CDN)可以缓存静态资源,并将其分发到全球各地的节点,用户可以从最近的节点获取内容,从而减少延迟。4. 配置反向代理缓存如果Nginx作为反向代理服务器,可以配置它来缓存后端服务器的响应。location / { proxy_pass http://backend; proxy_cache my_cache; # 使用定义的缓存区域 proxy_cache_valid 200 30m; # 对200响应缓存30分钟 }5. 监控和调整缓存性能使用Nginx的统计模块(如ngx_http_stub_status_module)来监控缓存命中率和缓存大小。根据监控数据调整缓存大小和过期时间,以优化性能。6. 清理缓存定期清理缓存,以释放空间和提高缓存效率。可以使用Nginx的缓存清理功能或编写脚本来实现。在进行缓存调优时,需要注意以下几点:缓存大小和过期时间需要根据实际情况进行调整,以找到最佳平衡点。监控缓存命中率,以确保缓存配置有效地提高了性能。确保缓存内容的一致性,特别是在动态内容缓存时。通过合理利用缓存,可以显著提高Nginx的性能,减少服务器负载,并提高用户体验。4. 压缩Nginx中的压缩功能可以通过Gzip模块来实现,它可以在服务器端对响应数据进行压缩,以减少传输数据的大小,从而提高加载速度,尤其是在带宽有限的情况下。以下是压缩的具体调优步骤:1. 启用Gzip压缩首先,确保在Nginx中启用了Gzip模块。这通常是通过在nginx.conf文件的http块中添加以下指令来完成的:http { gzip on; # 启用Gzip压缩 }2. 设置压缩级别gzip_comp_level指令用于设置压缩级别,级别越高,压缩率越大,但CPU消耗也越高。通常设置为1到9之间的值,其中1是最快的压缩,9是最高压缩率。推荐设置为6,这是一个性能和压缩率的平衡点。http { gzip_comp_level 6; # 设置压缩级别 }3. 选择要压缩的内容类型使用gzip_types指令指定要压缩的MIME类型。通常,文本文件(如HTML、CSS、JavaScript)和XML文件可以从压缩中受益。http { gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; }4. 设置最小压缩大小使用gzip_min_length指令设置触发压缩的最小文件大小。对于小文件,压缩可能不会带来太多好处,而且会增加CPU负担。http { gzip_min_length 256; # 只有大于256字节的响应才会被压缩 }5. 禁用IE6的压缩老版本的IE浏览器(IE6及以下)可能不支持Gzip压缩,可以通过gzip_disable指令禁用对这些浏览器的压缩。http { gzip_disable "MSIE [1-6]\."; # 禁用IE6及以下版本的Gzip压缩 }6. 配置浏览器缓存虽然压缩可以减少服务器带宽使用,但它会增加CPU负载。为了减轻服务器压力,可以配置浏览器缓存,让浏览器存储压缩后的内容,减少重复请求。location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 30d; # 设置资源的过期时间 add_header Cache-Control "public"; # 指示资源可以被浏览器和代理缓存 }7. 测试和监控在应用这些配置后,使用工具如curl或在线Gzip检测服务来测试压缩是否生效。监控服务器的CPU使用情况和响应时间,以确保压缩带来的性能提升大于CPU负载的增加。通过合理配置Gzip压缩,可以在不显著增加服务器负载的情况下,显著减少网络传输数据的大小,提高用户体验。在进行压缩调优时,需要根据服务器的CPU能力和网络条件来平衡压缩级别和最小压缩大小,以达到最佳的性能。5. 负载均衡策略Nginx作为高性能的HTTP和反向代理服务器,提供了多种负载均衡策略,可以帮助分散流量,提高网站的可用性和性能。以下是负载均衡策略的具体调优步骤:1. 选择合适的负载均衡策略Nginx支持多种负载均衡策略,包括:轮询(Round Robin):这是默认的策略,请求按时间顺序逐一分配到不同的服务器,如果服务器宕机,自动剔除。最少连接(Least Connections):分配到当前连接数最少的服务器。IP哈希(IP Hash):根据请求的来源IP地址,将请求分配到固定的服务器,可以在一定程度上保持用户的会话状态。权重(Weight):指定不同服务器的权重,权重越高,分配的请求越多。在nginx.conf的upstream块中定义负载均衡策略:upstream backend { server backend1.example.com weight=3; server backend2.example.com; server backend3.example.com backup; # 备用服务器 ip_hash; # 使用IP哈希策略 }2. 配置健康检查使用health_check模块可以对后端服务器进行健康检查,以确保流量只被定向到健康的服务器。server { location / { proxy_pass http://backend; health_check interval=10 fails=3 passes=2; } }3. 使用持久连接对于HTTP/1.1客户端,可以使用持久连接(Keepalive)来减少建立和关闭连接的次数。upstream backend { server backend1.example.com; keepalive 32; # 保持活动的连接数 }4. 调整超时时间适当调整超时时间,以确保Nginx能够快速响应后端服务器的变化。proxy_connect_timeout 5s; # 设置与后端服务器建立连接的超时时间 proxy_read_timeout 60s; # 设置从后端服务器读取响应的超时时间 proxy_send_timeout 5s; # 设置向后端服务器发送请求的超时时间 5. 限制连接数为了避免单个客户端占用过多资源,可以限制每个客户端的连接数。limit_conn_zone $binary_remote_addr zone=mylimit:10m; limit_conn mylimit 5; # 每个IP地址最多允许5个同时连接 6. 监控和调整使用Nginx的统计模块(如ngx_http_stub_status_module)来监控负载均衡的性能。根据监控数据调整负载均衡策略和服务器权重,以优化性能。7. 考虑使用第三方负载均衡解决方案对于大型应用或需要更多高级功能的场景,可以考虑使用商业负载均衡器或云服务提供的负载均衡解决方案。通过合理配置负载均衡策略,可以有效分散流量,提高网站的可用性和性能。在进行负载均衡调优时,需要根据服务器的具体情况和实际需求来选择合适的策略,并进行持续的监控和调整转载自https://www.cnblogs.com/wgjava/p/18289926
-
Nginx 是一个高效的 Web 服务器和反向代理服务器,广泛应用于处理 HTTPS 请求。SSL/TLS(Secure Sockets Layer/Transport Layer Security)是用来加密客户端与服务器之间通信的协议,确保数据的保密性、完整性和身份认证。在现代的 Web 服务架构中,启用 SSL/TLS 加密已经成为标准实践,不仅能够保护用户的数据安全,还能提升网站的 SEO 排名和可信度。一、SSL/TLS 基础概念1.1 什么是 SSL/TLS?SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)都是加密协议,主要用于保护网络通信的安全。SSL 是最早的版本,而 TLS 是其后续版本。尽管 TLS 更为安全和高效,但由于历史原因,人们通常习惯性地称其为 SSL。SSL/TLS 协议通过对称加密和非对称加密相结合的方式,在客户端和服务器之间建立一个安全的加密通道,防止数据在传输过程中被窃取或篡改。1.2 SSL/TLS 工作原理SSL/TLS 协议的工作原理可以概括为以下几个步骤:客户端发起连接请求:客户端(如浏览器)请求与服务器建立 HTTPS 连接。服务器发送证书:服务器响应请求,并将其 SSL/TLS 证书发送给客户端。证书验证:客户端验证服务器证书是否由受信任的证书颁发机构(CA)签发。密钥交换:客户端和服务器通过公钥加密和私钥解密的方式交换加密密钥。加密通信:双方使用对称加密(对称密钥)进行后续的通信,确保数据的机密性和完整性。二、Nginx SSL/TLS 配置2.1 基本的 SSL 配置为了在 Nginx 中启用 SSL/TLS 加密,首先需要准备一个有效的 SSL 证书。你可以购买一个 SSL 证书,或使用免费的 Let’s Encrypt 证书。以下是基本的 Nginx SSL 配置步骤。2.1.1 获取 SSL 证书在开始配置之前,需要准备以下两项文件:SSL 证书文件(.crt 或 .pem)SSL 私钥文件(.key)你可以从证书颁发机构(CA)购买证书,或者使用免费的 Let’s Encrypt 证书。2.1.2 配置 Nginx 启用 SSL在 Nginx 的 server 块中配置 SSL。你需要指定证书文件和私钥文件的位置:123456789101112server { listen 443 ssl; # 启用 HTTPS(443 端口) server_name www.example.com; # 服务器域名 ssl_certificate /etc/nginx/ssl/example.crt; # 证书文件路径 ssl_certificate_key /etc/nginx/ssl/example.key; # 私钥文件路径 # 配置其他相关 SSL 设置 ssl_protocols TLSv1.2 TLSv1.3; # 启用的协议版本 ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; # 加密套件 ssl_prefer_server_ciphers on; # 优先使用服务器配置的加密套件}listen 443 ssl:启用 443 端口上的 HTTPS 服务。ssl_certificate:指定 SSL 证书文件的路径。ssl_certificate_key:指定 SSL 私钥文件的路径。2.1.3 配置 HTTP 到 HTTPS 的重定向为了确保所有的流量都通过 HTTPS 传输,可以设置 HTTP 到 HTTPS 的重定向。以下是配置方法:1234567server { listen 80; server_name www.example.com; # 强制所有 HTTP 请求跳转到 HTTPS return 301 https://$server_name$request_uri;} 三、优化 SSL/TLS 配置3.1 启用现代 TLS 协议SSL 2.0 和 SSL 3.0 已被认为不安全,因此在配置 Nginx 时,应确保只启用安全的 TLS 协议版本,如 TLS 1.2 和 TLS 1.3。1ssl_protocols TLSv1.2 TLSv1.3; # 禁用 SSL 2.0 和 SSL 3.0 3.2 配置加密套件SSL/TLS 加密套件定义了加密算法和密钥交换算法的组合。Nginx 允许我们配置要使用的加密套件,以确保加密通信的安全性。选择合适的加密套件非常重要,它能抵御诸如中间人攻击、降级攻击等安全风险。12ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件选择这些加密套件时,要优先选择支持前向保密(Forward Secrecy)的加密算法。3.3 启用 HSTS(HTTP 严格传输安全)HSTS(HTTP Strict Transport Security)是一个 Web 安全策略,它可以告诉浏览器,只能通过 HTTPS 协议访问网站,从而防止中间人攻击。可以通过 Strict-Transport-Security HTTP 头来启用 HSTS。1234567server { listen 443 ssl; server_name www.example.com; # 启用 HSTS(最大有效期为 1 年) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";} 3.4 启用 OCSP StaplingOCSP(Online Certificate Status Protocol)用于检查证书是否被吊销。启用 OCSP Stapling 可以减少客户端每次都向证书颁发机构(CA)请求证书状态的需要,从而提高性能。12ssl_stapling on;ssl_stapling_verify on; 3.5 配置 SSL 会话缓存通过启用 SSL 会话缓存,可以提高 TLS 握手的效率。Nginx 支持将 SSL 会话缓存到内存或磁盘,以便多次握手时复用,从而加速加密过程。12ssl_session_cache shared:SSL:10m; # 会话缓存设置为 10MBssl_session_timeout 1d; # 会话超时时间设置为 1 天 3.6 优化 SSL 性能Nginx 提供了一些性能优化选项来减少 SSL 握手的延迟。以下是常用的优化方法:启用 ssl_session_cache 和 ssl_session_timeout:如前所述,这可以提高性能,避免每次建立新连接时都进行完整的握手。启用 ssl_prefer_server_ciphers:指定 Nginx 优先选择服务器端支持的加密套件,以便客户端不强制使用较弱的加密算法。123ssl_session_cache shared:SSL:10m;ssl_session_timeout 1d;ssl_prefer_server_ciphers on; 四、常见 SSL/TLS 配置问题及解决方案4.1 SSL 握手失败SSL 握手失败可能由多种原因导致,例如:证书链不完整:确保中间证书(Intermediate Certificate)已正确配置,并且整个证书链完整。TLS 协议版本不匹配:确保客户端和服务器都支持相同的 TLS 协议版本。解决方法:确保 Nginx 配置了合适的证书链和协议。使用 SSL Labs 等工具检查 SSL 配置,确保没有问题。4.2 “Mixed Content” 问题当页面通过 HTTPS 加载时,页面内的某些资源(如图片、CSS、JavaScript)仍通过 HTTP 加载时,浏览器会显示“Mixed Content”警告。为了解决这个问题,需要确保所有的资源都通过 HTTPS 加载。4.3 SSL 证书不被信任如果客户端无法验证 SSL 证书,可能是由于证书未被信任的根证书机构签发。确保使用受信任的 CA 颁发证书,或使用 Let’s Encrypt 这类免费的证书。五、总结通过在 Nginx 中配置 SSL/TLS,我们能够有效地保护用户数据的安全,防止中间人攻击、数据泄露等安全风险。除了基础的 SSL 配置外,还应关注协议版本、加密套件、HSTS、OCSP 和会话缓存等高级设置,从而提升 SSL/TLS 的安全性和性能。
-
在 Nginx 中,分发策略指的是如何将客户端请求根据一定的规则或算法,分配到不同的后端服务器上。Nginx 的分发策略非常灵活,可以根据负载均衡、请求内容、会话保持等多种方式进行分发。以下是 Nginx 常见的几种分发策略:1. 轮询(Round Robin)定义轮询是最常用的负载均衡算法,它将请求按顺序轮流分发到后端的各个服务器上。工作原理请求按照顺序依次被分配到每一台服务器上,不考虑每台服务器的负载情况。默认的负载均衡方式就是轮询。优缺点优点:简单、易于实现,负载均衡效果较好。缺点:没有考虑到后端服务器的实际负载情况,可能会导致某些服务器过载,而其他服务器空闲。配置示例12345678910111213http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { location / { proxy_pass http://backend; } }} 2. 加权轮询(Weighted Round Robin)定义加权轮询是轮询算法的变种,它允许为每台服务器设置权重,权重大的服务器分配到的请求更多。工作原理每台服务器根据设置的权重,分配相应的请求数。权重越高,分配到的请求越多。这种方式适用于服务器硬件配置差异较大的情况,比如 CPU、内存、带宽不同的服务器。优缺点优点:根据服务器的处理能力进行负载均衡,能够提高资源的利用率。缺点:需要根据实际情况设置合适的权重。配置示例12345678910111213http { upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=2; server backend3.example.com weight=1; } server { location / { proxy_pass http://backend; } }} 3. 最少连接(Least Connections)定义最少连接算法将请求分发给当前连接数最少的后端服务器。它根据服务器的负载情况来决定请求的分配,优先选择当前连接数最少的服务器。工作原理Nginx 会实时监控每台服务器的连接数,将请求发送到连接数最少的服务器上,从而实现负载均衡。优缺点优点:较好地平衡了服务器的负载,尤其适用于长时间连接的场景(如数据库连接、WebSocket)。缺点:不适用于短连接的情况,因为每个请求可能会导致新的连接数波动。配置示例1234567891011121314http { upstream backend { least_conn; server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { location / { proxy_pass http://backend; } }} 4. IP 哈希(IP Hash)定义IP 哈希是基于客户端请求的 IP 地址计算一个哈希值,并根据这个值将请求分发到不同的后端服务器上。这样,相同 IP 的请求会始终分配到同一台后端服务器。工作原理通过客户端的 IP 地址计算哈希值,哈希值决定请求应该发送到哪台后端服务器。适用于需要会话保持(Session Persistence)的场景。优缺点优点:可以保证同一 IP 的请求始终被路由到同一台后端服务器,适用于需要会话保持的应用。缺点:如果后端服务器发生变化,可能会影响到会话的一致性。配置示例1234567891011121314http { upstream backend { ip_hash; server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { location / { proxy_pass http://backend; } }} 5. 加权最少连接(Weighted Least Connections)定义加权最少连接算法是最少连接算法的一个改进版本,它结合了服务器的权重和连接数。权重较大的服务器会接收更多的请求,但在分配时考虑到连接数。工作原理每个服务器既有权重,又考虑最少连接数。最终的负载均衡决定是由权重和连接数共同作用的结果。优缺点优点:结合了权重和连接数,更加灵活,适用于不同硬件配置的服务器。缺点:配置相对复杂,需要精确设置权重。配置示例1234567891011121314http { upstream backend { server backend1.example.com weight=3; server backend2.example.com weight=2; server backend3.example.com weight=1; least_conn; } server { location / { proxy_pass http://backend; } }} 6. URL 哈希(Hashing on URL)定义URL 哈希算法是通过请求的 URL 或者其他请求参数来决定将请求分配给哪台服务器。每个 URL 请求的哈希值将决定目标服务器。工作原理通过请求的 URL 计算哈希值,基于这个哈希值来选择后端服务器。这样,相同的 URL 请求会始终路由到同一个后端服务器。优缺点优点:适用于需要根据请求 URL 来决定分发策略的场景。缺点:如果 URL 内容变化较多,可能会导致请求不均匀分布。配置示例1234567891011121314http { upstream backend { hash $request_uri; server backend1.example.com; server backend2.example.com; server backend3.example.com; } server { location / { proxy_pass http://backend; } }} 总结Nginx 提供了多种负载均衡策略,每种策略都有其适用的场景和优缺点:轮询:适用于负载均衡不依赖服务器负载的简单场景。加权轮询:适用于硬件性能不同的场景。最少连接:适用于长连接场景。IP 哈希:适用于会话保持的需求。加权最少连接:结合权重和连接数的负载均衡算法。URL 哈希:根据请求 URL 分配请求,适用于 URL 固定且需要分配到指定服务器的场景。选择合适的分发策略,可以确保 Nginx 负载均衡的高效性和系统的稳定性。
-
Bug Description将vue打包部署时,修改了nginx.conf,在nginx.conf中配置了请求转发,但是请求转发不生效,请求返回状态码404。nginx配置如下:1234567location ~ ^/api(/|$) { proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081; #代理的ip expires 24;} Reproduction Steps1.编写vue项目,使用npm run build打包,将打包后的文件夹dist放到nginx的html目录下。2.修改nginx.conf,配置请求转发。3.启动nginx服务。Reason在本地开发环境,为了解决跨域问题,修改了vue.config.js:1234567891011devServer: { proxy: { '/api': { target: 'http://localhost:8081', changeOrigin: true, pathRewrite: { '^/api': '' }, ws: true, secure: false } }}此处做了路由改写,实际后端访问地址为http://localhost:8081/,而nginx配置的代理地址为http://localhost:8081/api,导致请求定向错误。Solution将nginx.conf进行路由改写:123456789location ~ ^/api(/|$) { proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8081; #代理的ip # 将 /api 替换为 / rewrite ^/api(.*)$ $1 break; expires 24;}正常转发,请求返回状态码200。
-
安装包下载,注意下载nginx版本需要和生产环境保持一致123wget https://github.com/vozlt/nginx-module-vts/archive/refs/tags/v0.2.2.tar.gzwget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.3/nginx-vts-exporter-0.10.3.linux-amd64.tar.gzwget http://nginx.org/download/nginx-1.26.2.tar.gz解压nginx-module-vts1tar -xf /opt/v0.2.2.tar.gz -C /usr/local/src/查看运行nginx编译参数1nginx -V 1./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/generic-hardened-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/generic-hardened-ld -Wl,-E'安装编译环境1yum install pcre-devel openssl-devel libxml2-devel libxslt-devel gd-devel gperftools gperftools-devel解压nginx源码1tar xf nginx-1.26.2.tar.gz再原来编译参数基础上添加vts模块,进行编译12./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/generic-hardened-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -specs=/usr/lib/rpm/generic-hardened-ld -Wl,-E' --add-module=/usr/local/src/nginx-module-vts-0.2.2/make备份nginx配置文件12cd /usr/local/nginx/confcp nginx.conf nginx.conf.baknginx配置文件添加配置12345678910#在nginx.conf http块添加如下配置vhost_traffic_status_filter_by_host on;vhost_traffic_status_zone;server { listen 8089; location /status { vhost_traffic_status_display; vhost_traffic_status_display_format html;}}将so文件替换1234cd /usr/lib64/nginx/modules/mkdir backupmv ./* backup/cp /root/nginx-1.26.2/objs/*.so .替换nginx二进制文件,并启动nginx1234567891011#先备份二进制文件cd /usr/local/nginx/sbincp nginx nginx.20241206#停止nginx,不然新的二进制文件覆盖不了systemctl stop nginx#替换二进制文件cp /root/nginx-1.20.2/nginx-1.20.2/objs/nginx .#检查配置文件语法./nginx -t#启动Nginxsystemctl start nginx部署exporter123456789101112131415tar -xf nginx-vts-exporter-0.10.3.linux-amd64.tar.gzcp /opt/nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/cat > /etc/systemd/system/nginx_vts_exporter.service << EOF[Unit]Description=nginx_exporterAfter=network.target[Service]Type=simpleExecStart=/usr/local/bin/nginx-vts-exporter -telemetry.address :9145 -nginx.scrape_uri=http://192.168.20.3:8089/status/format/jsonRestart=on-failure[Install]WantedBy=multi-user.targetEOFsystemctl start nginx_vts_exportersystemctl enable nginx_vts_exporter测试插件1curl http://x.x.x.x:9145/metrics
-
nginx安装12sudo apt updatesudo apt install nginxnginx配置文件/etc/nginx/nginx.conf或/etc/nginx/sites-available/default设置缓存在Nginx配置中启用缓存,这样可以缓存CDN服务器上的静态内容,以提高性能和速度。1234567891011121314151617181920212223http { # 在http段下设置缓存路径 proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; # 设置缓存的过期时间 proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; # 设置代理缓存使用的密钥和缓存的最大大小 proxy_cache_key "$scheme$request_method$host$request_uri"; server { # 其他服务器设置 location / { # 使用代理缓存 proxy_cache my_cache;//启用缓存 proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; proxy_cache_bypass $http_cache_control;//http头 proxy_ignore_headers Cache-Control; proxy_pass http://backend_server;//后端数据源服务器 } }}正向代理(Forward Proxy)和反向代理(Reverse Proxy)是网络通信中两种常见的代理服务器类型:方向:正向代理面向客户端,反向代理面向服务器。位置:正向代理位于客户端旁边,反向代理位于服务器旁边。作用:正向代理用于客户端访问控制和匿名访问,反向代理用于负载均衡和安全性。目的:正向代理帮助客户端“前进”访问互联网,反向代理帮助服务器“反向”处理外部请求。设置域名为你的CDN服务器配置域名并确保域名正确解析到你的服务器,你需要按照以下步骤操作:步骤1:域名注册和购买选择一个域名注册商,如GoDaddy、Namecheap、阿里云等。搜索你想要注册的域名,确保它是可用的。完成购买流程并支付相应的费用。步骤2:DNS管理登录你的域名注册商的控制面板。找到DNS管理或域名管理的部分。步骤3:设置DNS记录A记录:创建一个A记录将域名指向你的CDN服务器的公网IP地址。例如,如果你的CDN服务器IP是1.2.3.4,创建一个A记录,将yourdomain.com指向1.2.3.4。CNAME记录:如果需要将子域名重定向到CDN服务器,可以创建CNAME记录。例如,cdn.yourdomain.com可以CNAME到yourdomain.com。步骤4:在CDN服务器上配置Web服务器确保你的CDN服务器上安装了Web服务器软件,如Nginx或Apache。配置Web服务器,使其能通过你的域名来提供服务。例如,在Nginx中,你需要配置一个server块来监听80端口(HTTP)或443端口(HTTPS):123456789server { listen 80; server_name www.yourdomain.com; root /path/to/your/web/root; index index.html index.htm; location / { try_files $uri $uri/ =404; } }如果你使用了SSL/TLS证书,确保配置了HTTPS并监听443端口。步骤5:部署SSL/TLS证书(推荐)如果你想启用HTTPS,可以通过Let’s Encrypt获取免费的SSL/TLS证书。安装并配置证书,使Web服务器使用SSL/TLS加密。步骤6:测试域名解析等待DNS更改全球生效,这可能需要一些时间(通常是几分钟到48小时)。使用命令行工具如ping或nslookup来检查域名是否已经指向了正确的IP地址。步骤7:验证配置在Web浏览器中输入你的域名,看是否能够成功访问你的CDN服务器上的内容。检查Web服务器的访问日志,确认有来自不同地区的访问记录。步骤8:监控和维护定期检查域名的DNS记录和CDN服务器的状态,确保一切正常运行。完成以上步骤后,你的域名就应该正确地指向你的CDN服务器,并且用户可以通过该域名访问你的网站内容了。记得在进行任何更改时,都要仔细检查配置文件的语法,并在保存更改后重新启动Web服务器。启用Gzip压缩:启用Nginx的Gzip压缩功能,以减小传输内容的大小,提高网站的加载速度。你可以在Nginx配置文件中添加以下内容:1234http { gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;}设置内容源:配置Nginx以从你的源服务器(通常是你的网站服务器)获取内容。你可以使用proxy_pass指令将请求转发到源服务器。12345678910proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;server { ... location / { proxy_pass http://backend; proxy_cache my_cache; proxy_cache_bypass $http_cache_control; ... }}测试和调优:完成上述配置后,测试你的CDN服务器,确保它按预期工作。你可能需要根据实际情况对配置进行调整以优化性能。常见如何调优CDN:调优CDN(内容分发网络)通常需要综合考虑多种因素,包括缓存策略、节点选择、网络优化等。以下是一些具体的调优步骤和例子:1. 缓存策略调优:例子:如果你的网站有大量的静态资源,如图片、CSS和JavaScript文件,可以通过设置更长的`Cache-Control`头部值来提高缓存命中率。例如,可以在Nginx中设置:123location ~* \.(jpg|jpeg|png|gif|js|css)$ { expires 30d; }2. 节点选择优化:例子:使用CDN提供商的地理DNS或任意cast DNS功能,将用户定向到最近的服务器节点,减少延迟。例如,在阿里云CDN中,可以配置DNS解析策略,确保用户就近访问。3. 内容预热:例子:在新产品发布前,使用CDN的内容预热功能,提前将资源分发到各个边缘节点,避免在高流量时段对源站造成压力。4. 动态内容优化:例子:对于频繁变动的内容,可以配置CDN缓存为较短的过期时间或使用“no-cache”指令,以确保用户获取最新数据。5. HTTPS优化:例子:启用SSL/TLS加速功能,如使用SPDY或HTTP/2协议,减少HTTPS握手时间。同时,确保CDN支持OCSP Stapling,减少SSL证书验证时间。6. 网络连接优化:例子:如果`traceroute`显示用户到CDN节点的路由路径不理想,可以联系CDN提供商优化路由策略。7. 资源压缩:例子:启用Gzip压缩,减少传输数据的大小。在Nginx中可以设置:123location ~* \.(html|css|js|json|xml|ld\+json|ejs|svg|png|jpg|jpeg|gif|ico)$ { gzip on; }8. HTTP/2 启用:例子:在支持HTTP/2的CDN节点上启用该协议,利用其多路复用、服务器推送等特性提高性能。9. 图片优化:例子:使用CDN的图片处理功能,自动进行图片压缩和格式转换,如将JPG转换为WebP格式。10. 性能监控与日志分析:例子:定期检查CDN日志,分析错误码、访问模式和性能指标,使用工具如GoAccess或AWStats进行日志分析。11. 定制化配置:例子:根据网站特性,定制CDN的配置。例如,对于视频网站,可以配置CDN以支持视频流的平稳传输。12. 使用性能测试工具:例子:使用WebPageTest或阿里云的云拨测产品,定期测试CDN性能,分析不同条件下的性能表现。13. 故障排查:例子:如果发现某些资源加载缓慢,检查资源URL是否被CDN正确缓存,确认没有因为意外的查询字符串导致缓存失效。14. 用户行为分析:例子:分析用户访问模式,识别热门内容和高流量时段,据此调整CDN策略,如增加热门内容的缓存或在高峰时段增加带宽。通过上述调优步骤,可以显著提升CDN的性能,改善网站加载速度和用户体验。调优是一个持续的过程,需要定期进行性能测试和配置调整。对于视频网站,可以配置CDN以支持视频流的平稳传输。对于视频网站,确保视频内容的平稳传输是提升用户体验的关键。以下是一些具体的配置步骤和例子:1. 视频内容的缓存策略:例子:在Nginx中配置视频文件的缓存时间,使用`proxy_cache_valid`指令为不同类型的视频内容设置不同的缓存时间。12345location ~* \.(mp4|avi|mov)$ { proxy_cache my_cache; proxy_cache_valid 200 1h; proxy_cache_valid 404 1m; }2. 视频切片和分块传输:例子:使用Apple HLS(HTTP Live Streaming)或DASH(Dynamic Adaptive Streaming over HTTP)技术,将视频切分为多个小片段,允许客户端按需加载视频的不同部分。配置CDN以支持这些协议,确保客户端可以有效地从最近的节点请求视频切片。3. 自适应比特率流:例子:在视频服务器上启用自适应比特率流,允许客户端根据当前网络条件选择最合适的视频质量。这通常通过HLS或DASH实现。4. 内容预热:例子:对于即将发布的热门视频内容,使用CDN的内容预热功能,提前将视频内容分发到各个边缘节点,减少发布时的源站压力。5. 视频编码和压缩:例子:使用FFmpeg工具对视频进行压缩和转码,生成不同分辨率和比特率的视频流,以适应不同用户的带宽条件。1ffmpeg -i input.mp4 -c:v libx264 -crf 24 -preset veryfast -c:a aac -b:a 128k -movflags +faststart output.mp46. 启用HTTP/2:例子:在服务器上启用HTTP/2,利用其多路复用特性减少连接数,提高视频传输效率。1234567server { listen 80; listen 443 ssl http2; server_name example.com; ... http2_push_preload on;}7. 负载均衡和故障转移:例子:在CDN配置中设置负载均衡策略,如轮询、最少连接或IP哈希,确保视频请求均匀分配到各个节点。同时,配置故障转移机制,以便在节点故障时自动切换。8. 视频播放器配置:例子:使用支持自适应比特率流的播放器,如Video.js或JW Player,并配置播放器以从CDN节点获取视频流。9. 监控和日志分析:例子:利用CDN提供商的监控工具,如AWS CloudFront的日志分析,监控视频流的性能,如请求量、错误率和传输速度。10. 带宽预留和QoS:例子:在CDN上为视频流预留足够的带宽,并设置优先级,确保在高流量时段也能保持视频传输的质量。11. 使用QUIC协议:例子:如果CDN支持QUIC协议,可以启用它以减少连接建立时间,并提高视频传输的稳定性。12. 客户端适配:例子:在视频播放器中实现网络条件自动检测,根据用户的带宽和设备性能自动选择最合适的视频质量。通过上述配置,可以显著提高视频网站的性能,减少缓冲和中断,提供更加流畅的视频观看体验。这些措施需要根据具体的CDN提供商和视频网站需求进行调整和优化。测试123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354测试CDN(内容分发网络)性能通常涉及以下几个步骤: 1. **选择测试工具**: - 使用在线工具如WebPageTest、GTmetrix或Google PageSpeed Insights进行初步测试。 - 例子:访问WebPageTest网站,输入你的网站URL,并选择不同的测试位置和网络条件进行测试。 2. **性能基准测试**: - 在实施任何CDN配置更改之前,进行性能基准测试,以便于后续比较优化效果。 - 例子:记录下初始的加载时间、TTFB(首字节时间)、缓存命中率等关键指标。 3. **全球性能测试**: - 使用全球分布式的测试工具,如Akamai's CloudTest或Gomez,测试不同地理位置下的性能。 - 例子:使用CloudTest从北美、亚太和欧洲等多个地区测试网站的加载时间和响应时间。 4. **资源加载测试**: - 使用工具如Apache JMeter或Siege模拟高并发请求,测试CDN对资源加载的处理能力。 - 例子:在JMeter中配置多个线程组模拟用户并发访问,测试CDN的负载均衡和响应能力。 5. **视频和流媒体测试**: - 如果网站包含视频内容,使用视频特定的测试工具,如Wireshark或Nagios,监控视频流的稳定性和质量。 - 例子:使用Wireshark捕获视频流传输过程中的数据包,分析延迟和丢包情况。 6. **SSL/TLS测试**: - 对于使用HTTPS的网站,使用SSL Labs的SSL Test工具测试CDN服务器的SSL/TLS配置。 - 例子:输入网站URL进行测试,获取SSL/TLS配置的评级和改进建议。 7. **缓存策略测试**: - 检查CDN是否正确地实现了缓存策略,如验证`Cache-Control`和`Expires`头部。 - 例子:使用curl命令测试资源的HTTP头部信息: ```bash curl -I https://www.example.com/image.jpg ``` 8. **DNS解析测试**: - 使用`dig`或`nslookup`命令测试CDN的DNS解析速度和准确性。 - 例子:执行`dig example.com`查看DNS解析结果和时间。 9. **监控和日志分析**: - 利用CDN提供商的监控系统,分析实时性能数据和日志文件。 - 例子:在AWS CloudFront中查看实时日志,分析请求量、错误率和流量模式。 10. **用户体验测试**: - 使用Real User Monitoring (RUM) 工具收集真实用户的性能反馈。 - 例子:集成New Relic或Google Analytics的RUM功能,追踪实际用户的性能体验。 11. **故障转移测试**: - 模拟网络故障,测试CDN的故障转移机制是否有效。 - 例子:使用网络模拟器如Clumsy中断连接,看CDN是否能够自动切换到健康节点。 12. **性能调优测试**: - 根据测试结果调整CDN配置,如修改缓存时间、负载均衡策略等,然后重新测试以验证改进效果。 - 例子:在Nginx中调整缓存策略后,再次使用WebPageTest进行测试,比较前后性能差异。 通过上述步骤,你可以全面地测试CDN的性能,识别瓶颈,并根据测试结果进行调优。记住,CDN测试和调优是一个持续的过程,需要定期进行以适应网站流量和内容的变化。多路复用多路复用(Multiplexing)是一种通信方式,允许多个数据流共享单一的物理链路,通过不同的标识符区分不同的数据流。在网络协议中,多路复用计数通常指的是在多路复用上下文中,可以同时传输的独立数据流的数量。在HTTP/2协议中,多路复用是一个核心特性,它允许客户端和服务器在单一的TCP连接上同时发送多个请求和响应,从而减少了连接的建立和关闭的开销,提高了传输效率。多路复用计数的一些关键点:并行传输:在HTTP/2中,多路复用允许在同一个TCP连接上并行传输多个请求和响应,而不是像HTTP/1.x那样需要为每个请求/响应建立和关闭一个连接。流ID:每个HTTP/2的请求或响应流都被分配一个唯一的流ID,用于区分不同的数据流。性能提升:多路复用减少了连接的建立和关闭时间,减少了HTTP头部信息的冗余传输,从而提高了网页的加载速度。流优先级:HTTP/2支持流的优先级和权重,允许客户端和服务器控制不同流的传输顺序。头部压缩:HPACK算法用于压缩HTTP头部,进一步减少了数据传输量。流量控制:HTTP/2使用流控制窗口来控制数据的发送速率,避免网络拥塞。例子:假设一个网页需要加载多个资源,如HTML、CSS、JavaScript文件和图片。在HTTP/1.x中,这些资源可能需要通过多个TCP连接顺序加载。而在HTTP/2中,所有这些资源可以同时在单一的TCP连接上加载,每个资源分配一个流ID,客户端和服务器通过流ID来区分和管理这些并行的传输流。例如,客户端可能发送如下的HTTP/2请求:123456HEADERS (stream_id=1): :method: GET :scheme: https :path: /css/style.css :authority: www.example.com :priority: 1BLOCK (stream_id=1): [data for stream 1]123456HEADERS (stream_id=3): :method: GET :scheme: https :path: /js/script.js :authority: www.example.com :priority: 3BLOCK (stream_id=3): [data for stream 3]在这个例子中,流1和流3是两个独立的请求,它们通过不同的流ID进行区分,并且可以同时在单一的TCP连接上传输。总的来说,多路复用计数指的是在多路复用连接中可以打开的流的数量,它是衡量多路复用能力的一个指标。在HTTP/2中,多路复用允许更高效的数据传输,减少了网页加载时间,改善了用户体验。
-
这里需要注意的是一定要用$http_x_forwarded_for 这个变量123456789101112131415161718upstream myapp1 { # 定义一个名为myapp1的服务器组 server backend1.example.com weight=5; # 添加一个服务器,并设置权重为5 server backend2.example.com; # 添加另一个服务器,权重默认为1 server backend3.example.com down; # 将此服务器标记为down,不参与负载均衡 server backup1.example.com backup; # 将此服务器作为备份服务器 } location ^~ /api/ { #10\.182\.(?!25\.|26\.)[0-9.]+ if ($http_x_forwarded_for ~ "^10\.182\.(25\.|26\.)[0-9.]+") { # 如果是,返回403禁止访问 return 403; } 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 myapp1; }禁止指定网站来访:123if ($http_referer ~* "要拦截的域名") { return 301 要跳转的域名;}限制指定目录扩展名后缀123456789location ~ ^/images/.*\.(php|php5|sh|pl|py)${deny all;} location ~ ^/static/.*\.(php|php5|sh|pl|py)${deny all;}禁止直接访问txt和doc文件12345678910location ~* \.(txt|doc)$ {if (-f $request_filename) {root /data/www/www;rewrite ^(.*) https://www.itbulu.com/ break; #可以重定向到某个URL;}}location ~* \.(txt|doc)$ {root /data/www/www;deny all;}禁止访问文件和目录1234#禁止访问的文件或目录 location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; }排除某个目录不受限制123location ~ \.well-known{ allow all; }禁止访问单个目录的命令1234567location ~ ^/(static)/ {deny all;} location ~ ^/static {deny all;}禁止访问多个目录的配置123location ~ ^/(static|js) {deny all;}禁止目录让外界访问12345678910111213location ~ ^/mysql_loging/ {allow 192.168.1.4;deny all;} location ~ .*\.(php|php5)?$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;} 说明:该配置只允许192.168.1.4IP访问mysql_loging目录限制IP和IP段12345678location / {deny 192.168.0.4;allow 192.168.1.0/16;allow 10.0.0.0/24;deny all;} 说明:此限制是对某些IP做整个网站的限制访问。非指定域名访问跳转123if ($host !~ ^www/.itbulu/.com$) {rewrite ^(.*) http://www.baidu.com$1 permanent;} 到此这篇关于nginx 拦截指定ip访问指定url的实现示例的文章就介绍到这了,
-
背景:访问时不时会被暴力刷量,爬虫和恶意攻击导致数据库,服务等瘫痪需求:在Nginx上实现一个动态拦截IP的方法,具体是当某个IP在1分钟内访问超过60次时,将其加入Redis并拦截,拦截时间默认1天。技术选型:使用Nginx+Lua+Redis的方法。这种方案通过Lua脚本在Nginx处理请求时检查Redis中的黑名单,同时统计访问频率,超过阈值就封禁。这应该符合用户的需求。需要结合Lua脚本和Redis的计数功能。安装OpenResty,配置Nginx的Lua模块,编写Lua脚本统计访问次数,使用Redis存储和过期键,以及设置拦截逻辑。连接池的使用,避免频繁连接Redis影响性能。一、环境准备安装OpenRestyOpenResty集成了Nginx和Lua模块,支持直接运行Lua脚本:1234# Ubuntu/Debiansudo apt-get install openresty# CentOSyum install openresty安装Redis服务12sudo apt-get install redis-server # Debian系sudo yum install redis # RedHat系二、Nginx配置主配置文件(nginx.conf)在http块中添加共享内存和Lua脚本路径:1234567891011121314http { lua_package_path "/usr/local/openresty/lualib/?.lua;;"; lua_shared_dict ip_limit 10m; # 共享内存区 server { listen 80; server_name _; location / { access_by_lua_file /usr/local/lua/ip_block.lua; # 核心拦截脚本 root /var/www/html; } }}三、Lua脚本实现动态拦截脚本路径创建Lua脚本:/usr/local/lua/ip_block.lua脚本内容1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162local redis = require "resty.redis"local red = redis:new() -- Redis连接参数local redis_host = "127.0.0.1"local redis_port = 6379local redis_timeout = 1000 -- 毫秒local redis_auth = nil -- 无密码留空 -- 拦截参数local block_time = 86400 -- 封禁时间(1天)local time_window = 60 -- 统计窗口(1分钟)local max_requests = 60 -- 最大请求数 -- 获取客户端IPlocal function get_client_ip() local headers = ngx.req.get_headers() return headers["X-Real-IP"] or headers["x_forwarded_for"] or ngx.var.remote_addrend -- 连接Redislocal function connect_redis() red:set_timeout(redis_timeout) local ok, err = red:connect(redis_host, redis_port) if not ok then ngx.log(ngx.ERR, "Redis连接失败: ", err) return nil end if redis_auth then local ok, err = red:auth(redis_auth) if not ok then ngx.log(ngx.ERR, "Redis认证失败: ", err) end end return okend -- 主逻辑local client_ip = get_client_ip()local counter_key = "limit:count:" .. client_iplocal block_key = "limit:block:" .. client_ip -- 检查是否已封禁local is_blocked, err = red:get(block_key)if tonumber(is_blocked) == 1 then ngx.exit(ngx.HTTP_FORBIDDEN) -- 直接返回403end -- 统计请求次数connect_redis()local current_count = red:incr(counter_key)if current_count == 1 then red:expire(counter_key, time_window) -- 首次设置过期时间end -- 触发封禁条件if current_count > max_requests then red:setex(block_key, block_time, 1) -- 封禁并设置1天过期 red:del(counter_key) -- 删除计数器 ngx.exit(ngx.HTTP_FORBIDDEN)end -- 释放Redis连接red:set_keepalive(10000, 100)四、性能优化Redis连接池通过set_keepalive复用连接,避免频繁建立TCP连接共享内存缓存使用lua_shared_dict缓存高频访问IP,减少Redis查询压力异步日志记录封禁操作异步写入日志文件,避免阻塞请求处理:1234567ngx.timer.at(0, function() local log_msg = string.format("%s - IP %s blocked at %s", ngx.var.host, client_ip, ngx.localtime()) local log_file = io.open("/var/log/nginx/blocked_ips.log", "a") log_file:write(log_msg, "\n") log_file:close()end)五、验证与测试手动触发封禁1234# 模拟高频请求ab -n 100 -c 10 http://your-domain.com/# 检查Redisredis-cli keys "limit:block:*"自动解封验证等待24小时后检查封禁IP是否自动删除:1redis-cli ttl "limit:block:1.2.3.4" # 返回剩余秒数六、扩展方案分布式封禁在多台Nginx服务器间共享Redis黑名单,实现集群级拦截可视化监控通过Grafana+Prometheus展示实时拦截数据:12# 采集Redis指标prometheus-redis-exporter --redis.address=localhost:6379动态调整阈值通过Redis Hash存储不同路径的拦截规则:12local rule_key = "limit:rule:" .. ngx.var.urilocal custom_rule = red:hget(rule_key, "max_requests")引用说明核心拦截逻辑参考了Nginx+Lua+Redis的经典架构设计Redis键过期机制确保自动解封性能优化方案借鉴了OpenResty最佳实践
-
在生产环境中,确保Nginx在服务器重启后自动启动是非常重要的。本文将详细介绍如何在Linux系统中设置Nginx服务开机自动重启的方法,确保Nginx能够在系统启动后自动恢复运行。一、检查Nginx状态首先,检查Nginx服务的当前状态,确保Nginx已安装并正在运行。1sudo systemctl status nginx如果Nginx服务没有启动,可以使用以下命令启动:1sudo systemctl start nginx二、设置Nginx开机自动启动使用systemctl命令将Nginx服务设置为开机自动启动。1sudo systemctl enable nginx执行该命令后,Nginx服务将在系统启动时自动启动。可以通过以下命令验证:1sudo systemctl is-enabled nginx如果返回enabled,则说明Nginx服务已设置为开机自动启动。三、配置Nginx自动重启策略在某些情况下,我们可能需要确保Nginx在意外停止后自动重启。这可以通过配置systemd服务来实现。1. 创建自定义systemd服务配置文件首先,创建一个自定义的systemd服务配置文件以覆盖默认配置。1sudo systemctl edit nginx在编辑器中添加以下内容:123[Service]Restart=alwaysRestartSec=5s其中,Restart=always表示无论退出状态如何,总是重启服务。RestartSec=5s表示在5秒后重启服务。保存并退出编辑器后,重新加载systemd配置:1sudo systemctl daemon-reload2. 验证配置重新启动Nginx服务以应用新的配置:1sudo systemctl restart nginx通过以下命令验证Nginx服务的重启策略:1sudo systemctl show nginx | grep Restart如果输出包含Restart=always,说明重启策略已正确设置。四、示例:Nginx服务自动重启配置以下是一个完整的示例,演示如何配置Nginx服务在意外停止后自动重启,并在系统启动时自动启动:1. 确保Nginx服务已启动并设置为开机自动启动:12sudo systemctl start nginxsudo systemctl enable nginx2. 创建自定义的systemd服务配置文件以设置自动重启策略:1sudo systemctl edit nginx在编辑器中添加以下内容并保存:123[Service]Restart=alwaysRestartSec=5s3.重新加载systemd配置并重启Nginx服务:12sudo systemctl daemon-reloadsudo systemctl restart nginx4.验证Nginx服务的重启策略:1sudo systemctl show nginx | grep Restart五、总结通过上述步骤,我们可以在Linux系统中设置Nginx服务开机自动启动和意外停止后自动重启,确保系统重启或服务故障后Nginx能够自动恢复运行。总结一下主要步骤:使用systemctl enable nginx设置Nginx服务开机自动启动。创建自定义的systemd服务配置文件设置自动重启策略。重新加载systemd配置并重启Nginx服务
-
1、概述之前我们使用Keepalived实现了Nginx服务的双机主备高可用,但是有几个问题没有解决,今天一起探讨一下。1)在双机主备机制中,Keepalived服务如果宕了,会自动启用备机进行服务,但Nginx服务如果负载过大宕了,虚拟ip是不会指向备机的。2)双机主备的特点是,只有1台机器在提供服务,备机在主机的Keepalived服务宕掉后才会提供服务,大大的造成了资源的浪费。3)目前比较流行租用云服务器去运营公司的产品,那云服务器支不支持虚拟IP呢?今天我们就上述的三个问题来讲解一下。2、使用Keepalived实现Nginx的自动重启2.1 借助Shell脚本,完成Nginx的重启Keepalived不能直接启动Nginx,但可以执行shell脚本,因此这里我们需要借助Shell脚本启动Nginx。在 /etc/keepalived 目录下,新建一个脚本 check_nginx.sh,以下是脚本的具体内容:1234567891011121314#!/bin/bash # 执行查看Nginx进程的命令,并放在变量A中A=`ps -C nginx --no-header | wc -l` # 判断是否宕机,如果宕机尝试重启,如果重启不成功,则停止Keepalivedif [ $A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 3 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then killall keepalived fifi脚本来源于网络2.2 为脚本赋予运行权限1# chmod +x /etc/keepalived/check_nginx.sh2.3 在Keepalived配置文件中增加配置打开Keepalived配置文件,# vi /etc/keepalived/keepalived.conf修改配置文件,增加vrrp_script 和track_script的配置,配置如下:12345678910111213141516171819202122232425262728293031323334353637383940global_defs { # 全局唯一的主机标识 router_id server_a } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" interval 3 # 每隔3秒运行一次Shell脚本 weight 10 # 脚本运行成功,权重加10} vrrp_instance VI_1 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state MASTER # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 51 # 权重 priority 100 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } track_script { check_nginx } # 虚拟IP virtual_ipaddress { 192.168.1.88 }}2.4 重启Keepalived服务重启后,发现,Nginx停掉后,很快会自动启动。3、双主热备的搭建3.1 双主热备概述由于双机主备机制,每次只会由一台服务器对外提供服务,且主备机的配置是相同的,因此极大地造成了资源的浪费。双主热备则解决了这个问题,双主热备的原理是两台服务器利用Keepalived互为主备,因此需要两个虚拟IP,再利用DNS轮询的配置,让一个域名按轮询的方式分别路由到两个虚拟IP上,最终达到高可用的目的。3.2 场景说明虚拟IP1:192.168.1.88虚拟IP2:192.168.1.66A服务器IP(主):192.168.1.144B服务器IP(备):192.168.1.223.3 修改A服务器配置配置如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354! Configuration File for keepalived global_defs { # 全局唯一的主机标识 router_id server_a } vrrp_instance VI_1 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state MASTER # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 51 # 权重 priority 100 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.1.88 }} vrrp_instance VI_2 { # 标识是主节点还是备用节点,值为 MASTER 或 BACKUP state BACKUP # 绑定的网卡 interface ens33 # 虚拟路由id,保证主备节点是一致的 virtual_router_id 52 # 权重 priority 80 # 同步检查时间,间隔默认1秒 advert_int 1 # 认证授权的密码,所有主备需要一样 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP virtual_ipaddress { 192.168.1.66 }}3.4 修改B服务器配置配置如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445! Configuration File for keepalived global_defs { router_id server_b } vrrp_instance VI_1 { # 设置为备机 state BACKUP interface ens33 virtual_router_id 51 # 权重设置的要比主机低 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP需要主备设置成一样 virtual_ipaddress { 192.168.1.88 }} vrrp_instance VI_2 { # 设置为主机 state MASTER interface ens33 virtual_router_id 52 # 权重设置的要比主机低 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 虚拟IP需要主备设置成一样 virtual_ipaddress { 192.168.1.66 }}3.5 重启两台服务器的Keepalived重启Keepalived即可。3.6 设置DNS轮询联系网络运营商解决。4、云服务器的负载均衡现在,很多公司都会选择租用云服务器运行自己的产品,因为更划算、更稳定,有专业人员负责运维。但使用了云服务器,就要受云服务运营商的限制。就拿虚拟IP这个事儿来说,一些云服务运营商就是不支持的。如果不支持虚拟IP,则Keepalived这个方案就只能放弃了。但即使Keepalived用不了,Nginx的高可用还是有解决方案的,很多云服务商都已经推出了自己的负载均衡服务(例如:阿里云的负载均衡 SLB 和 腾讯云的负载均衡 CLB)。我们直接租用就好了,不需要我们自己去配置。5、综述今天大概聊了一下KeepAlived自动重启Nginx,Keepalived的双主热备高可用的搭建,以及云服务器负载均衡的解决方案,希望能对大家有所帮助。
-
Nginx 与 Node.js 的集成在现代 Web 开发中,Nginx 和 Node.js 是两种非常流行且高效的技术。Nginx 作为一个高性能的 Web 服务器和反向代理服务器,广泛应用于静态资源的处理、负载均衡、反向代理等场景。而 Node.js 则是一个基于事件驱动的 JavaScript 运行环境,适合构建高并发、实时的网络应用。将 Nginx 与 Node.js 集成,利用 Nginx 的反向代理功能将请求转发到 Node.js 应用中,可以有效地提升 Web 应用的性能、可扩展性和安全性。一、Nginx 和 Node.js 集成的优势1.1 高性能反向代理Nginx 是一个高效的反向代理服务器,具有出色的并发处理能力。当将 Node.js 应用部署在 Nginx 后面时,Nginx 可以作为前端的反向代理,将来自客户端的请求转发给 Node.js。这样,Nginx 负责处理静态资源(如图片、CSS、JavaScript 文件),并将动态请求(如 API 请求)转发给 Node.js 应用进行处理,减少了 Node.js 的负担。1.2 静态资源处理与负载均衡Nginx 在处理静态资源(如图像、CSS、JavaScript 等)方面的性能非常强大。它能够高效地处理大量并发请求,而 Node.js 更适合处理动态请求。将静态资源的处理交给 Nginx,可以减少 Node.js 的负担,充分发挥 Nginx 的优势。此外,Nginx 还可以作为负载均衡器,将客户端的请求按轮询、加权等方式分发到多个 Node.js 实例,提高系统的扩展性和容错能力。1.3 安全性与 HTTPS 支持Nginx 提供了非常强大的安全性功能,如访问控制、防火墙设置、请求过滤等。通过将 Nginx 作为反向代理,还可以将 HTTPS 配置和证书管理的责任交给 Nginx,而不需要将其集成到 Node.js 应用中,从而简化了 Node.js 应用的配置。1.4 WebSocket 和长连接支持Node.js 的事件驱动模型非常适合处理 WebSocket 和长连接。而 Nginx 也可以很好地支持 WebSocket 协议。通过 Nginx 转发 WebSocket 请求到 Node.js 应用,可以使得 Node.js 更专注于处理实时通信,而 Nginx 负责转发和管理连接。二、Nginx 和 Node.js 集成的工作原理在将 Nginx 与 Node.js 集成时,Nginx 作为反向代理服务器,负责接收来自客户端的请求。具体工作流程如下:客户端请求:客户端发送请求到 Nginx,通常是通过 HTTP 或 HTTPS 协议。Nginx 处理静态资源:Nginx 会处理静态资源(如 HTML、图片、CSS、JavaScript 文件),如果请求的是动态内容,则将请求转发给 Node.js。反向代理到 Node.js:Nginx 将动态请求转发到 Node.js 应用,Node.js 处理请求并返回响应。响应返回客户端:Nginx 将 Node.js 返回的响应发送给客户端,完成整个请求的处理过程。2.1 基本的反向代理设置Nginx 通过 proxy_pass 指令将请求转发到后端的 Node.js 应用。基本配置如下:server { listen 80; server_name example.com; # 处理静态文件 location /static/ { root /var/www/html; } # 转发 API 请求到 Node.js 应用 location /api/ { proxy_pass http://localhost:3000; # 假设 Node.js 应用运行在 3000 端口 proxy_http_version 1.1; # 使用 HTTP/1.1 proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }}在上述配置中,Nginx 会将 /static/ 路径下的请求交给自己处理,而将以 /api/ 为前缀的请求转发到 Node.js 应用。proxy_pass 指令将请求转发到运行在 3000 端口的 Node.js 应用。2.2 支持 WebSocketNode.js 常用于实时应用(如聊天应用、实时通知等),这类应用通常使用 WebSocket 协议。Nginx 需要进行特别配置,才能正确地转发 WebSocket 请求。server { listen 80; server_name example.com; # WebSocket 代理 location /ws/ { proxy_pass http://localhost:3000; # Node.js WebSocket 服务运行在 3000 端口 proxy_http_version 1.1; # 使用 HTTP/1.1 proxy_set_header Upgrade $http_upgrade; # 支持 WebSocket proxy_set_header Connection 'upgrade'; # 允许升级协议 proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; }}在 WebSocket 的配置中,Upgrade 和 Connection 头部的设置至关重要,Nginx 需要通过这些头部告知 Node.js,客户端希望通过 WebSocket 建立长连接。2.3 HTTPS 配置在生产环境中,为了保证安全性,通常会启用 HTTPS。可以将 SSL/TLS 配置留给 Nginx 处理,而 Node.js 只需处理 HTTP 请求。Nginx 配置 HTTPS 的基本方法如下:server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / { proxy_pass http://localhost:3000; # 将请求转发给 Node.js 应用 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}在 Nginx 配置中,ssl_certificate 和 ssl_certificate_key 指定了 SSL 证书和私钥的路径。然后,Nginx 会将所有的 HTTPS 请求转发到 Node.js 应用。三、部署 Node.js 应用在将 Nginx 与 Node.js 集成时,Node.js 应用通常需要运行在某个端口上。为保证 Node.js 在生产环境中能够高效稳定运行,通常会将其部署在后台并使用进程管理工具(如 PM2)来管理应用。3.1 使用 PM2 启动 Node.js 应用PM2 是一个功能强大的 Node.js 进程管理工具,它能够确保 Node.js 应用在崩溃后自动重启,并支持日志管理、负载均衡等功能。使用 PM2 启动 Node.js 应用的基本命令如下:pm2 start app.js # 启动 Node.js 应用pm2 save # 保存进程配置pm2 startup # 配置系统开机自启123通过 PM2 启动 Node.js 应用后,Nginx 可以将请求转发到对应的端口(例如 3000 端口)。3.2 配置 Nginx 与 PM2 协同工作在 Nginx 中配置反向代理时,确保将请求转发到 PM2 管理的 Node.js 应用。例如,如果应用运行在 3000 端口,那么 Nginx 配置中的 proxy_pass 应指向 http://localhost:3000。四、常见问题与解决方案4.1 反向代理时 WebSocket 连接失败WebSocket 协议需要特殊处理,确保 Nginx 在代理时能正确地升级 HTTP 协议到 WebSocket 协议。检查以下 Nginx 配置是否正确:location /ws/ { proxy_pass http://localhost:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade;}确保 Upgrade 和 Connection 头部被正确传递,且 WebSocket 请求的路径(如 /ws/)在 Nginx 配置中被正确匹配。4.2 Node.js 应用负载均衡如果有多个 Node.js 实例运行在不同的端口上,可以通过 Nginx 配置负载均衡,合理分配客户端请求:upstream node_app { server 127.0.0.1:3000; server 127.0.0.1:3001; server 127.0.0.1:3002;}server { listen 80; server_name example.com; location / { proxy_pass http://node_app; # 使用负载均衡 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }}Nginx 会将客户端请求按照轮询或加权的方式分配到多个 Node.js 实例,提升整体性能和可用性。4.3 处理 SSL 证书错误如果在配置 SSL 时遇到证书错误,可以使用 openssl 工具检查证书链是否完整。确保证书文件和私钥文件的路径正确,并且证书链包含所有中间证书。openssl s_client -connect example.com:4431通过上述命令,可以验证 SSL 证书是否配置正确。五、总结将 Nginx 与 Node.js 集成,能够充分发挥 Nginx 在静态资源处理、负载均衡和安全性上的优势,同时利用 Node.js 在动态请求和实时应用中的高效性。通过合理的配置,Nginx 可以高效地代理 Node.js 应用,优化性能并提升系统的可靠性和扩展性。———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/Flying_Fish_roe/article/details/144523159
-
Nginx是一个高性能的HTTP和反向代理服务器,同时支持IMAP/POP3/SMTP/TCP(1.9或更高版本)代理服务。Nginx的功能强大且多样,这主要得益于其丰富的模块系统。以下是对Nginx的一些主要功能和模块的详细展开:核心模块ngx_http_core_module:Nginx的核心模块,提供了HTTP服务的基本功能。它负责处理HTTP请求和响应,并包含丰富的配置指令。例如,可以定义HTTP服务器的监听端口、访问日志、错误日志等,配置请求的解析和响应的处理,如请求头和响应头的处理,还可以设置客户端请求的限速和连接超时等。代理模块ngx_http_proxy_module:Nginx的代理模块,用于将客户端请求转发到后端服务器。它实现了反向代理功能,支持HTTP、HTTPS和WebSocket协议。通过配置代理缓存,可以减少后端服务器的负载。此外,它还可以将客户端请求分发到多个后端服务器,实现负载均衡。重写模块ngx_http_rewrite_module:Nginx的重写模块,用于修改客户端请求的URL。它可以根据特定的规则对请求进行重写或重定向,支持正则表达式的使用,实现灵活的URL重写规则。URL重写功能可以将旧的URL重写为新的URL,实现网站的伪静态化。路径重定向功能则可以根据不同的请求条件,将请求重定向到不同的页面或服务器。SSL模块ngx_http_ssl_module:Nginx的SSL模块,用于支持HTTPS协议,提供加密传输和安全认证功能。它支持SSL证书的管理,对客户端和服务器之间的数据进行加密处理,提供安全的HTTPS连接,保障数据的安全性和完整性。在需要加密传输和安全认证的场景中,如电子商务、银行等,可以使用HTTPS协议保护客户端和服务器之间的通信。压缩模块ngx_http_gzip_module:Nginx的压缩模块,用于对HTTP响应数据进行压缩,减少数据传输量,提高访问速度。它支持多种压缩算法和级别,可以根据需要调整压缩效果。在带宽有限或网络延迟较高的场景中,使用压缩模块可以减少数据传输时间,提高用户体验。在提供大量静态资源的场景中,压缩文件大小可以减少服务器带宽消耗。流模块ngx_stream_core_module:Nginx的流模块,用于处理TCP和UDP协议的流量,实现四层负载均衡功能。它提供了高性能和可扩展的解决方案,适用于游戏服务器、实时通信等场景。例如,在游戏服务器场景中,可以使用流模块处理玩家与服务器之间的TCP和UDP流量,实现游戏的稳定运行。在实时通信场景中,可以使用流模块处理音视频流的传输,保证通信的质量和稳定性。负载均衡模块ngx_http_upstream_module:Nginx的负载均衡模块,用于配置后端服务器列表和负载均衡策略。它可以配置后端服务器列表,定义服务器的地址和权重等。同时,它支持多种负载均衡算法,如轮询、IP哈希等。在高并发场景中,使用负载均衡模块可以将请求分发到多个后端服务器,提高系统的并发处理能力。在多服务器部署场景中,使用负载均衡模块可以实现故障转移和故障恢复,提高系统的可用性。其他常用模块http_cache_purge_module:用于清除缓存。http_auth_basic_module:用于基本认证。http_limit_req_module:用于限制请求速率,防止恶意请求或过载。http_limit_conn_module:用于限制连接数,保护服务器资源。http_log_module:用于日志记录,可以记录访问日志和错误日志,帮助管理员监控和分析服务器的运行状况。http_geo_module:用于基于IP地址的地理位置信息,可以根据客户端的IP地址判断其地理位置,并基于地理位置进行访问控制或内容分发等。综上所述,Nginx凭借其丰富的功能模块和强大的性能,在企业级应用中发挥着重要的作用。在实际应用中,可以根据业务需求选择合适的模块和配置,以达到最佳性能。
-
Nginx不仅可以作为Web服务器,还可以作为缓存服务器使用。通过Nginx缓存,可以对一些静态资源或者数据更新频率较低的后端服务做缓存,降低静态资源或后端服务的响应时间,同时也会降低后端的负载。以下将介绍Nginx配置缓存和清除缓存的方法。Nginx配置缓存要配置Nginx缓存,可以按照以下步骤进行:修改Nginx配置文件:在http上下文中使用proxy_cache_path指令创建keys zone,即创建一块共享内存空间,用于存储缓存数据的active key。同时,指定一个目录,用于存储缓存的数据。在http、server、location上下文中,使用proxy_cache指令,指定要使用的keys zone。在http、server、location上下文中,使用proxy_cache_valid指令,指定针对哪些返回码的响应做缓存,以及缓存多长时间。示例配置:假设要对一个6081端口的后端服务做缓存,Nginx配置示例如下:# 创建keys zone——test-cache,并设置1MB的共享内存空间 # 指定缓存数据保存在/tmp/nginx-cache目录下 proxy_cache_path /tmp/nginx-cache keys_zone=test-cache:1m use_temp_path=off; server { listen 12345; location / { proxy_cache test-cache; # 使用test-cache缓存zone # 只缓存状态码是200的响应,缓存时间为10分钟 proxy_cache_valid 200 10m; proxy_pass http://localhost:6081; # 代理后端服务 } }此外,如果需要缓存POST请求的响应,可以在http、server、location上下文中使用proxy_cache_methods指令指定POST参数,并使用proxy_cache_key指令在参数中添加$request_body变量。应用配置:将上述Nginx配置文件放到/etc/nginx/conf.d/目录下,并重新加载nginx服务使配置生效。清除Nginx缓存要清除Nginx的缓存,可以采取以下几种方法:手动删除缓存文件:Nginx默认的缓存路径是在/var/cache/nginx目录下(路径可能因安装方式或配置不同而有所差异)。可以通过命令sudo rm -rf /var/cache/nginx/*来删除所有缓存文件。但请注意,这种方法会删除所有缓存,可能会影响到正在被缓存的内容的访问。使用Nginx的proxy_cache_purge模块:如果Nginx配置了proxy_cache模块来进行缓存,可以使用proxy_cache_purge模块来清除指定URL的缓存。需要在Nginx配置文件中添加相应的配置,然后使用curl命令来发起清除缓存的请求。配置示例如下:location ~ /purge(/.*) { allow 127.0.0.1; # 只允许本地访问 deny all; proxy_cache_purge cache_zone_name $1; # 替换cache_zone_name为实际的缓存zone名称 }然后使用curl命令来清除缓存:curl -X PURGE http://example.com/purge/url_to_purge其中url_to_purge是要清除缓存的URL路径。重新加载Nginx配置:重新加载Nginx配置也会导致所有缓存文件被删除。但这种方法比较粗暴,通常不建议作为常规操作来使用。可以在需要完全清除缓存时考虑使用。重新加载Nginx配置的命令如下:sudo systemctl reload nginx使用缓存管理工具:有些Nginx的缓存管理工具可以帮助管理和清除缓存,例如ngx_cache_purge模块等。这些工具通常提供更丰富的功能和更灵活的操作方式,但需要根据具体需求进行选择和配置。注意事项在清除Nginx缓存之前,请确保已经备份了重要的数据或缓存内容,以防止误操作导致数据丢失。清除缓存可能会影响到正在被缓存的内容的访问速度和性能,因此请在进行清除操作之前评估其对业务的影响。在配置和使用Nginx缓存时,请务必根据实际需求进行合理的配置和优化,以提升系统的性能和可靠性。综上所述,Nginx配置缓存和清除缓存的方法相对简单且灵活,可以根据实际需求进行选择和配置。通过合理的配置和优化,可以充分利用Nginx的缓存功能来提升系统的性能和用户体验。
-
location ~* ^/(api|/files|v1|test)(.*)$ { proxy_pass http://10.111.111.1111:8080; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; client_max_body_size 600M; client_body_buffer_size 600M; uwsgi_send_timeout 1800; uwsgi_connect_timeout 1800; uwsgi_read_timeout 1800; proxy_read_timeout 1800; proxy_connect_timeout 1800; proxy_send_timeout 1800; }
-
当前在我们项目的cce环境中,为了实现pod之间的通信,采用ingress维护了一个pod的路由配置,想询问是否可以替换成ASM实现一样的能力。找了一圈也没看到有开发的指导,这个ASM是否只可用于pod之间通信的监控,并不能进行路由信息的配置呢?