• [技术干货] Nginx access.log日志详解及统计分析小结【转】
    一、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/
  • [技术干货] Nginx漏洞整改实现限制IP访问&隐藏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版本信息已经隐藏。
  • [技术干货] 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配置http和https的实现步骤【转】
    配置文件 默认放置位置:{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,为访问路径
  • [技术干货] Nginx解决Http慢攻击(Slow HTTP Attack)的方法【转】
    什么是慢速连接攻击缓慢的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。
  • [技术干货] nginx做白名单和限流【转】
    在我们生产环境中使用到了地图服务,每个月有免费请求次数,近一个月请求次数突然暴涨,导致直接开启付费模式,一个月上百刀的花销着实难扛,根据实际我们的业务使用情况,远达不到付费标准,故考虑做白名单和限流措施,基于以上情况并遇到春节急需快速处理,所以选择了最简单方便的方式,通过nginx做限流​ 我们都知道nginx里面是可以用lua脚本做一些稍微复杂些的逻辑处理的,要使用lua脚本需要编译lua解释器,时间有限我直接用了openresty,它集成了lua和nginx1、openresty是什么?OpenResty是一个基于Nginx的高性能Web平台,用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。具备下列特点:具备Nginx的完整功能基于Lua语言进行扩展,集成了大量精良的 Lua 库、第三方模块,允许使用Lua自定义业务逻辑、自定义库二、OpenResty的安装1、添加OpenResty仓库# 由于公共库中找不到openresty,所以需要添加openresty的源仓库 yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo # 注意,如果上面命令提示不存在,那就先安装一下 yum install -y yum-utils2. 安装OpenResty# 安装openresty yum install -y openresty # 安装OpenResty管理工具,帮助我们安装第三方的Lua模块 yum install -y openresty-opm3、目录结构​ 默认安装在/usr/local/openresty看到里面有一个nginx目录,进去可以看到跟我们平常用的nginx是一模一样的,OpenResty就是在Nginx基础上集成了一些Lua模块到这里我们就安装好了7. 启动和运行OpenResty底层是基于Nginx的,查看OpenResty目录的nginx目录,结构与windows中安装的nginx基本一致:所以这个里面的nginx和平常的nginx是一样的1)nginx配置文件worker_processes 1; events { worker_connections 1024; } http { server{ listen 999; server_name localhost; location /mapbox/ { access_by_lua_file "/usr/local/openresty/nginx/lua_script/rule.lua"; proxy_pass https://api.mapbox.com/; proxy_ssl_server_name on; } } } 2)lua脚本文件(白名单加限流)通过两个redis的key,map_request_limitation:存放令牌数量,map_request_white_list:白名单列表;白名单的IP,无需限流,只有白名单之外的才需要限流-- 其实这两个值可以从redis取 甚至可以给每个qrcode设置单独的速率和容积 -- 但如果想监听桶的状态 需要持续的请求, 只有每次请求后才重新计算并更新桶状态 否则桶状态不变 local tokens_per_second = 0.2 -- 生成速率 /s local max_tokens = 10 -- 最大溶剂 local current_time = ngx.now() local path = ngx.var.uri local redis_key = "map_request_limitation" local redis_key_white_list = "map_request_white_list" local client_ip = ngx.var.remote_addr -- local redis_key = "path:" .. path -- 连接Redis local redis = require "resty.redis" local red = redis:new() red:set_timeout(1000) local ok, err = red:connect("127.0.0.1", 6379) if not ok then ngx.log(ngx.ERR, "Redis连接失败: ", err) return ngx.exit(500) end -- 权限校验 local res, err = red:auth("123456") if not res then ngx.say("failed to authenticate: ", err) return end -- 发送 Lua 脚本(保证redis原子性操作) local script = [[ local redis_key = KEYS[1] local redis_white_list_key = KEYS[2] local tokens_per_second = tonumber(ARGV[1]) local max_tokens = tonumber(ARGV[2]) local current_time = tonumber(ARGV[3]) local client_ip = ARGV[4] -- ip是否存在列表中 local is_in_whitelist, err = redis.call('sismember', redis_white_list_key, client_ip) if is_in_whitelist == 1 then return 1 end -- 获取上次访问时间和令牌数量 local res = redis.call('HMGET', redis_key, 'last_access_time', 'tokens') local last_access_time local last_tokens if res[1] and res[2] then last_tokens = res[2] last_access_time = res[1] end -- 计算时间间隔 local time_passed = current_time - (tonumber(last_access_time) or 0) -- 计算新的令牌数量 last_tokens = last_tokens and tonumber(last_tokens) or max_tokens local new_tokens = math.min(max_tokens, last_tokens + time_passed * tokens_per_second) -- 判断令牌数量是否足够 if new_tokens >= 1 then -- 消耗令牌 redis.call('HMSET', redis_key, 'last_access_time', current_time, 'tokens', new_tokens - 1) return 1 else return 0 end ]] -- 执行脚本 local result = red:eval(script, 2, redis_key, redis_key_white_list,tokens_per_second, max_tokens,current_time,client_ip) if result == 1 then -- 成功 ngx.log(ngx.INFO, "成功") else -- 令牌不足 ngx.status = ngx.HTTP_TOO_MANY_REQUESTS ngx.say("OVERLOAD!!!!",result) return ngx.exit(ngx.HTTP_TOO_MANY_REQUESTS) end -- 返还redis连接到连接池 local ok, err = red:set_keepalive(10000, 100) if not ok then ngx.log(ngx.ERR, err) end启动之后当通过这个999端口访问之后,我们在redis里面可以看到以下两个key,白名单可以自行添加,即时生效转载自https://www.cnblogs.com/KingArmy/p/18019489
  • [技术干货] 负载均衡软件 LVS与Nginx的对比
    前言LVS和Nginx都是常见的负载均衡软件,它们各自具有不同的特点和优势。LVS是Linux内核级别的负载均衡软件,专注于负载均衡功能的实现,可以提供高性能和稳定性。它具有以下优点:抗负载能力强:由于其简单的工作方式和位于网络层第4层的特性,LVS主要进行请求分发,没有流量,因此在效率上基本不需要过多考虑。配置性低:这是一个优势,因为不需要经常去触碰它,从而大大减少了人为出错的几率。工作稳定:由于其本身抗负载能力很强,所以稳定性高。另外,各种LVS都有完整的双机热备方案,所以系统整体非常稳定。无流量:LVS仅仅分发请求,而流量并不从它本身出去,所以可以利用它来做一些线路分流之用。没有流量同时也保住了均衡器的IO性能不会受到大流量的影响。基本上能支持所有应用:由于工作在第4层,所以它可以对几乎所有应用做负载均衡,包括http、数据库、聊天室等。然而,LVS也有一些潜在的缺点。例如,它无法完全判别节点故障,如在使用wlc分配方式下,集群里有一个节点没有配置vip,会使整个集群不能使用。Nginx则是一个应用级的、采用事件驱动的方式进行负载均衡软件。除了负载均衡外,Nginx还可以作为Web服务器、反向代理服务器、缓存服务器等多种用途。它的特点是:高性能:Nginx使用了异步事件驱动架构,能够处理大量的并发连接。配置灵活:Nginx的配置非常灵活,可以通过配置文件进行各种定制化的设置。功能丰富:Nginx除了基本的负载均衡功能外,还提供了反向代理、请求缓存、SSL加密传输等许多其他功能。社区支持:Nginx有一个活跃的开发者社区,为使用者提供技术支持和新的功能模块。然而,与LVS相比,Nginx的抗负载能力和稳定性可能稍逊一筹。因此,选择LVS还是Nginx取决于具体需求和环境。如果需要一个专注于负载均衡的高性能和稳定性的解决方案,LVS可能是一个更好的选择。而如果需要一个功能丰富、配置灵活的负载均衡软件,并能处理大量的并发连接,那么Nginx可能更适合。LVS三种模式LVS三种模式中,虽然DR模式以及TUN模式只有请求的报文经过Director,但是NAT模式,Real Server回复的报文也会经过Director Server地址重写:首先要清楚的一点是,LVS是一个四层的负载均衡器,虽然是四层,但并没有TCP握手以及分手,只是偷窥了IP等信息,而Nginx是一个七层的负载均衡器,所以效率势必比四层的LVS低很多,但是可操作性比LVS高,后面所有的讨论都是基于这个区别。为什么四册比七层效率高?四层是TCP层,使用IP+端口四元组的方式。只是修改下IP地址,然后转发给后端服务器,TCP三次握手是直接和后端连接的。只不过在后端机器上看到的都是与代理机的IP的established而已,LVS中没有握手。7层代理则必须要先和代理机三次握手后,才能得到7层(HTT层)的具体内容,然后再转发。意思就是代理机必须要与client和后端的机器都要建立连接。显然性能不行,但胜在于七层,人工可操作性高,能写更多的转发规则。Nginx特点Nginx 专为性能优化而开发,性能是其最重要的要求,十分注重效率,有报告 Nginx 能支持高达 50000 个并发连接数。另外,Nginx 系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。正向代理与反向代理正向代理 :局域网中的电脑用户想要直接访问服务器是不可行的,服务器可能Hold不住,只能通过代理服务器来访问,这种代理服务就被称为正向代理,特点是客户端知道自己访问的是代理服务器。反向代理 :客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。负载均衡客户端发送多个请求到服务器,服务器处理请求,有一些可能要与数据库进行交互,服务器处理完毕之后,再将结果返回给客户端。推荐程序员摸鱼地址:https://www.yoodb.com/slack-off/home.html普通请求和响应过程如下图:但是随着信息数量增长,访问量和数据量增长,单台的Server以及Database就成了系统的瓶颈,这种架构无法满足日益增长的需求,这时候要么提升单机的性能,要么增加服务器的数量。关于提升性能,这儿就不赘述,提提如何增加服务器的数量,构建集群,将请求分发到各个服务器上,将原来请求集中到单个服务器的情况改为请求分发到多个服务器,也就是我们说的负载均衡。图解负载均衡:关于服务器如何拆分组建集群,这儿主要讲讲负载均衡,也就是图上的Proxy,可以是LVS,也可以是Nginx。假设有 15 个请求发送到代理服务器,那么由代理服务器根据服务器数量,这儿假如是平均分配,那么每个服务器处理 5 个请求,这个过程就叫做负载均衡。动静分离为了加快网站的解析速度,可以把动态页面和静态页面交给不同的服务器来解析,加快解析的速度,降低由单个服务器的压力。动静分离之前的状态动静分离之后光看两张图可能有人不理解这样做的意义是什么,我们在进行数据请求时,以淘宝购物为例,商品详情页有很多东西是动态的,随着登录人员的不同而改变,例如用户ID,用户头像,但是有些内容是静态的,例如商品详情页,那么我们可以通过CDN(全局负载均衡与CDN内容分发)将静态资源部署在用户较近的服务器中,用户数据信息安全性要更高,可以放在某处集中,这样相对于将说有数据放在一起,能分担主服务器的压力,也能加速商品详情页等内容传输速度。Nginx优势可操作性大Nginx是一个应用层的程序,所以用户可操作性的空间大得多,可以作为网页静态服务器,支持 Rewrite 重写规则;支持 GZIP 压缩,节省带宽;可以做缓存;可以针对 http 应用本身来做分流策略,静态分离,针对域名、目录结构等相比之下 LVS 并不具备这样的功能,所以 nginx 单凭这点可以利用的场合就远多于 LVS 了;但 nginx 有用的这些功能使其可调整度要高于 LVS,所以经常要去触碰,人为出现问题的几率也就大网络依赖小nginx 对网络的依赖较小,理论上只要 ping 得通,网页访问正常,nginx 就能连得通,nginx 同时还能区分内外网,如果是同时拥有内外网的节点,就相当于单机拥有了备份线路;LVS 就比较依赖于网络环境,目前来看服务器在同一网段内并且 LVS 使用 direct 方式分流,效果较能得到保证。另外注意,LVS 需要向托管商至少申请多于一个 ip 来做 visual ip安装简单nginx 安装和配置比较简单,测试起来也很方便,因为它基本能把错误用日志打印出来。LVS 的安装和配置、测试就要花比较长的时间,因为同上所述,LVS 对网络依赖性比较大,很多时候不能配置成功都是因为网络问题而不是配置问题,出了问题要解决也相应的会麻烦的多nginx 也同样能承受很高负载且稳定,但负载度和稳定度差 LVS 还有几个等级:nginx 处理所有流量所以受限于机器 IO 和配置;本身的 bug 也还是难以避免的;nginx 没有现成的双机热备方案,所以跑在单机上还是风险比较大,单机上的事情全都很难说支持健康检查以及请求重发nginx 可以检测到服务器内部的故障(健康检查),比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点。目前 LVS 中 ldirectd 也能支持针对服务器内部的情况来监控,但 LVS 的原理使其不能重发请求。比如用户正在上传一个文件,而处理该上传的节点刚好在上传过程中出现故障,nginx 会把上传切到另一台服务器重新处理,而 LVS 就直接断掉了。LVS优势抗负载能力强因为 LVS 工作方式的逻辑是非常简单的,而且工作在网络的第 4 层,仅作请求分发用,没有流量,所以在效率上基本不需要太过考虑。LVS 一般很少出现故障,即使出现故障一般也是其他地方(如内存、CPU 等)出现问题导致 LVS 出现问题配置性低这通常是一大劣势同时也是一大优势,因为没有太多的可配置的选项,所以除了增减服务器,并不需要经常去触碰它,大大减少了人为出错的几率工作稳定因为其本身抗负载能力很强,所以稳定性高也是顺理成章的事,另外各种 LVS 都有完整的双机热备方案,所以一点不用担心均衡器本身会出什么问题,节点出现故障的话,LVS 会自动判别,所以系统整体是非常稳定的无流量LVS 仅仅分发请求,而流量并不从它本身出去,所以可以利用它这点来做一些线路分流之用。没有流量同时也保住了均衡器的 IO 性能不会受到大流量的影响LVS 基本上能支持所有应用,因为 LVS 工作在第 4 层,所以它可以对几乎所有应用做负载均衡,包括 http、数据库、聊天室等。
  • [技术干货] docker环境下如何安装nginx并配置SSL
    在Docker环境下安装Nginx并配置SSL,可以按照以下步骤进行:拉取Nginx镜像:docker pull nginx创建SSL证书和私钥。首先,生成一个自签名的SSL证书和私钥:openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout nginx-selfsigned.key -out nginx-selfsigned.crt这将生成两个文件:nginx-selfsigned.key(私钥)和nginx-selfsigned.crt(证书)。创建一个名为default.conf的Nginx配置文件,内容如下:server { listen 80; server_name example.com; return 301 https://$host$request_uri; } server { listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/nginx-selfsigned.crt; ssl_certificate_key /etc/nginx/ssl/nginx-selfsigned.key; # 其他配置... }将example.com替换为您的域名。创建一个名为Dockerfile的文件,内容如下:FROM nginx:latest COPY default.conf /etc/nginx/conf.d/default.conf COPY nginx-selfsigned.crt /etc/nginx/ssl/nginx-selfsigned.crt COPY nginx-selfsigned.key /etc/nginx/ssl/nginx-selfsigned.key构建Docker镜像:docker build -t my-nginx .运行Docker容器:docker run -d -p 80:80 -p 443:443 --name my-nginx-container my-nginx现在,您已经在Docker环境下安装了Nginx并配置了SSL。请注意,由于我们使用的是自签名证书,浏览器可能会显示安全警告。在生产环境中,建议使用由受信任的证书颁发机构签发的证书。
  • [专题汇总] 12月份CodeArts板块技术干货合集,提前放送。
     随着鸿蒙系统的愈发壮大,鸿蒙知识的学习也就变得越发迫切。本月给大家带来的技术干货合集就包括鸿蒙,spring,springboot,java,nginx,redis等众多内容,希望可以帮到大家。  1.Centos搭建KMS(vlmcsd)激活服务器的步骤【转】 https://bbs.huaweicloud.com/forum/thread-0251137381864278028-1-1.html  2.鸿蒙极速入门(一)-HarmonyOS简介 https://bbs.huaweicloud.com/forum/thread-0217137149871563005-1-1.html  3.鸿蒙极速入门(二)-开发准备和HelloWorld https://bbs.huaweicloud.com/forum/thread-0212137150055432004-1-1.html  4.鸿蒙极速入门(三)-TypeScript语言简介 https://bbs.huaweicloud.com/forum/thread-0217137150099699006-1-1.html  5.鸿蒙极速入门(四)-通过登录Demo了解ArkTS https://bbs.huaweicloud.com/forum/thread-0212137150569231005-1-1.html  6.鸿蒙极速入门(五)-路由管理(Router) https://bbs.huaweicloud.com/forum/thread-0217137150812608007-1-1.html      7.HarmonyOS 实战项目 https://bbs.huaweicloud.com/forum/thread-0298137147742910003-1-1.html  8.HarmonyOS 高级特性 https://bbs.huaweicloud.com/forum/thread-0263137147693666005-1-1.html  9.HarmonyOS应用开发 https://bbs.huaweicloud.com/forum/thread-02125137147620736007-1-1.html  10.HarmonyOS UI 开发 https://bbs.huaweicloud.com/forum/thread-0251137147552748004-1-1.html  11.准备HarmonyOS开发环境 https://bbs.huaweicloud.com/forum/thread-0217137147386754003-1-1.html  12.Nginx服务器安装配置SSL证书流程(实现HTTPS安装) https://bbs.huaweicloud.com/forum/thread-0224137038725392014-1-1.html  13.几款值得选的SSH客户端软件 https://bbs.huaweicloud.com/forum/thread-02107137038433887013-1-1.html  14.8个站酷免费字体且可商用 不担心字体版权 https://bbs.huaweicloud.com/forum/thread-0235137038369347011-1-1.html  15.7个加速搜索引擎收录网站实用有效方法 https://bbs.huaweicloud.com/forum/thread-02112137038294122014-1-1.html  16. Java 算法篇-深入理解递归(递归实现:青蛙爬楼梯)-转载 https://bbs.huaweicloud.com/forum/thread-0213136969605169006-1-1.html  17.【内网穿透】搭建我的世界Java版服务器,公网远程联机-转载 https://bbs.huaweicloud.com/forum/thread-02112136969569637009-1-1.html  18.【Nginx篇】Nginx轻松上手-转载 https://bbs.huaweicloud.com/forum/thread-0213136969448107005-1-1.html  19.【SpringBoot(IDEA)+Vue(Vscode)前后端交互】-转载 https://bbs.huaweicloud.com/forum/thread-02107136969215321009-1-1.html  20.【SpringBoot】| SpringBoot 集成 Redis-转载 https://bbs.huaweicloud.com/forum/thread-0240136952804547006-1-1.html  21.基于SpringBoot的个人博客管理系统的设计与实现 毕业设计开题报告-转载 https://bbs.huaweicloud.com/forum/thread-02112136952724159004-1-1.html  22.【SpringBoot篇】Spring_Task定时任务框架-转载 https://bbs.huaweicloud.com/forum/thread-02127136952689543005-1-1.html  23.【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析-转载 https://bbs.huaweicloud.com/forum/thread-0224136952632959005-1-1.html  24. Spring Boot单元测试-转载 https://bbs.huaweicloud.com/forum/thread-0213136952529904002-1-1.html  25.【Springboot系列】SpringBoot整合Jpa-转载 https://bbs.huaweicloud.com/forum/thread-0240136952500264005-1-1.html  26. Spring Boot + MyBatis-Plus实现数据库读写分离 -转载 https://bbs.huaweicloud.com/forum/thread-02107136952426802006-1-1.html 
  • [技术干货] Nginx的rewrite规则
    什么是rewrite规则Nginx的rewrite规则是一种基于Nginx配置文件的URL重写机制。它允许您在Nginx配置文件中使用正则表达式匹配URL,并根据匹配的结果来重写URL,从而对请求进行相应的处理。通过使用rewrite规则,您可以实现以下功能:修改请求的URL:您可以根据需要修改请求的URL,以实现URL重定向、伪静态化等功能。修改请求参数:您可以提取和修改请求中的参数,以便进一步处理请求。跳转到其他位置:您可以根据匹配的结果将请求跳转到不同的URL或位置。在Nginx配置文件中,rewrite规则通常使用rewrite指令来实现。该指令后面可以跟一个正则表达式和替换的URL。当匹配到指定的正则表达式时,Nginx将自动将请求重定向到替换的URL。需要注意的是,rewrite规则可能会导致Nginx配置文件变得复杂且难以维护。因此,在使用rewrite规则时,应该仔细考虑其影响范围,并确保规则的正确性和安全性。用例说明1Nginx的rewrite规则用于修改客户端的请求URL,它可以在server块或location块中使用。rewrite规则可以用来重写URL,也可以用来进行重定向。以下是一个实际的Nginx rewrite规则的例子和具体配置方法:实际用途:假设我们有一个网站,我们想要将所有不以“/api”开头的请求重定向到我们的后端服务,同时保持URL的结构不变。具体配置方法:打开Nginx配置文件(通常是nginx.conf)。定位到server块,或者如果你想要对特定位置(如/)进行重写,则定位到相应的location块。使用rewrite指令来定义重写规则。以下是一个示例配置:server { listen 80; location / { # 非API请求重定向到后端服务 rewrite ^(?!/api)(.*)$ /api/$1 break; } # 定义API服务的location location /api/ { # 实际的API处理逻辑 } }在这个配置中,rewrite指令的^(?!/api)部分是一个正则表达式,它表示匹配所有不是以/api开头的请求。(.*)匹配原始URL,$1是捕获组,表示原始URL。/api/$1是将原始URL重定向到的目标URL。 break标记用于停止处理更多的重写规则,确保重写操作完成后不再继续检查其他规则。解释:^ 表示匹配行的开始。(?!/api) 是一个负向前瞻,确保匹配的URL不是以/api开头。.* 匹配任何字符串,$1 是对.*的捕获,即原始URL。/api/$1 是重定向的目标URL,其中$1被替换为捕获的原始URL。 这样,所有不符合/api开头的请求都会被重定向到后端服务,而符合/api开头的请求则会被正常处理。 请注意,实际部署时,你可能需要根据实际的URL结构和重定向需求调整正则表达式和重写规则。此外,确保在修改配置后测试Nginx,以确保重写规则按预期工作。用例说明2Nginx rewrite规则的实际用途和具体配置方法示例如下:实现URL重写:假设您有一个域名,您希望将所有以特定后缀(如“.html”)结尾的URL重定向到另一个域名。您可以使用rewrite规则来实现此目的。在Nginx配置文件中,您可以添加以下指令:server { listen 80; server_name example.com; location / { rewrite ^/(.*)\.html$ http://newdomain.com/$1 permanent; } }上述配置中,rewrite指令匹配所有以“.html”结尾的URL,并将其重定向到http://newdomain.com/,同时保留原始URL中的查询字符串和其他参数。实现URL跳转:假设您有一个网站,您希望在用户访问特定页面时自动跳转到另一个页面。您可以使用rewrite规则来实现此目的。在Nginx配置文件中,您可以添加以下指令:server { listen 80; server_name example.com; location /old-page { rewrite ^/old-page(.*)$ /new-page$1 last; } }上述配置中,rewrite指令匹配所有以/old-page开头的URL,并将其重定向到/new-page,同时保留原始URL中的查询字符串和其他参数。当用户访问http://example.com/old-page时,Nginx将自动将其重定向到http://example.com/new-page。这只是Nginx rewrite规则的两个示例用途。根据您的需求,您可以使用不同的正则表达式和替换URL来实现不同的功能。请注意,在使用rewrite规则时,应该仔细测试和验证配置文件的正确性,以确保不会对您的网站造成不必要的影响。
  • [技术干货] 常见的web负载均衡方法
    常见的负载均衡方法在常见的Web负载均衡方法中,主要目的是分散客户端请求,以优化资源使用、提升系统整体的处理能力和可靠性。以下是一些常见的Web负载均衡技术:轮询(Round Robin): 轮询法是依次将请求分配给服务器列表中的下一个服务器,确保每个服务器都能均等地接收到请求。这种方法简单且公平,但可能会因为某台服务器的性能下降而影响整个系统的响应速度。加权轮询(Weighted Round Robin): 与基本的轮询方法不同,加权轮询根据每台服务器的性能(权重)来分配请求。权重高的服务器会接收更多的请求,这样可以保证处理能力强的服务器不会被负载过轻的服务器拖慢。最少连接(Least Connections): 最少连接法将客户端请求分配给当前连接数最少的服务器。这种方法适用于处理时间不均匀的请求,因为它更关注于服务器的当前负载。IP哈希(IP Hash): 客户端的IP地址会被用来计算哈希值,然后根据哈希值将请求分发到对应的服务器。这样每个IP地址的请求都会固定到某一台服务器,有利于保持用户的会话状态。URL哈希: 与IP哈希类似,URL哈希根据请求的URL来进行哈希计算,然后决定将其转发到哪台服务器。这种方法适用于将特定URL的请求固定到某一台服务器。Cookie轮询: 服务器在处理请求时设置Cookie,根据Cookie值来判断用户请求应该被转发到哪台服务器。这样可以保持用户的会话状态,并且实现用户的固定。除了这些算法,还有其他一些方法,如使用反向代理、HTTP重定向、硬件负载均衡器等。每种方法都有其适用场景和优缺点,需要根据实际的系统需求和资源条件来选择最合适的负载均衡策略。不同负载均衡方法所适用的场景每种负载均衡方法都有其特定的应用场景,以下是各种方法适用的场景:轮询(Round Robin): 适用于请求可以被均匀分布到多个服务器,且服务器之间的性能相似的场景。它不适用于有明显性能差异的服务器环境,因为这样会导致性能较差的服务器承受过重的负载。加权轮询(Weighted Round Robin): 适用于有性能差异的服务器环境,可以通过为不同的服务器分配不同的权重来调整负载分配,保证性能较好的服务器能够处理更多的请求。最少连接(Least Connections): 适用于处理时间较长或短时负载重的应用,因为它会将新的请求发送到当前负载最低的服务器。这种方法适合于负载变化较大的环境。IP哈希(IP Hash): 适用于需要保持用户会话的场景,如数据库密集型的应用。通过确保来自同一IP地址的请求总是被转发到同一台服务器,可以保持用户的会话状态。URL哈希: 适用于将特定URL的请求固定到某一台服务器的情况,例如,将静态内容的请求总是发送到同一台服务器,以优化缓存和内容分发。Cookie轮询: 适用于需要保持用户会话和状态的场景,通过设置Cookie来跟踪用户的会话,确保用户的请求被发送到同一台服务器。 在实际应用中,可能会结合使用多种负载均衡方法,以适应不同的业务需求和系统特点。例如,对于一个大型电商平台,可能会同时使用轮询和最少连接方法,以平衡静态内容和动态内容的请求,同时保持用户会话的稳定性。
  • [技术干货] Nginx的负载均衡与反向代理
    什么是负载均衡负载均衡是一种将工作负载(例如网络流量、数据请求、计算任务等)分配到多个计算资源(例如服务器、虚拟机、容器等)的技术,以便优化性能、提高可靠性和增加可扩展性。负载均衡器通常位于应用程序前端,接受并分配传入的请求。通过使用算法来确定分配请求的最佳方式,负载均衡器可以防止任何一个资源过载或失效而导致应用程序的性能下降或停止响应。什么是反向代理反向代理(Reverse Proxy)是一种服务器代理模式,通常用于将客户端的请求转发到后端服务器,并将后端服务器的响应返回给客户端。客户端只知道反向代理的IP地址,而不知道在代理服务器后面的服务器集群的存在。反向代理可以隐藏后端服务器集群的IP地址,并且可以提供负载均衡、安全、加速等功能。Nginx 实现负载均衡与反向代理Nginx是一个高性能的Web服务器和反向代理服务器,可以用于实现负载均衡。Nginx提供了多种负载均衡算法,例如轮询、IP哈希、最少连接等。下面是一些使用Nginx实现负载均衡的步骤:安装Nginx首先,您需要安装Nginx。您可以从官方网站或软件包管理器下载并安装Nginx。nginx 的官网地址为:cid:link_0配置负载均衡在Nginx的配置文件中,您可以使用upstream指令来定义负载均衡池。例如:http { upstream backend { server backend1.example.com; server backend2.example.com; server backend3.example.com; } ... }在上面的配置中,我们定义了一个名为backend的负载均衡池,其中包含三个后端服务器。配置反向代理接下来,您需要配置Nginx作为反向代理服务器,将传入的请求转发到负载均衡池中的后端服务器。例如:http { ... server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } }在上面的配置中,我们将监听80端口,并将传入的请求转发到backend负载均衡池中的后端服务器。proxy_set_header指令用于设置请求头信息。启动Nginx最后,启动Nginx并检查配置文件是否正确:sudo nginx -t sudo nginx -s reload现在,您的Nginx服务器已经实现了负载均衡功能。它将根据配置的算法将传入的请求转发到后端服务器,以实现负载均衡和高性能。
  • [技术干货] 编写每天定时切割Nginx日志的脚本
    什么是bash脚本Bash 脚本是一种在 Unix 或 Linux 操作系统上运行的自动化脚本。它使用 Bash(Bourne Again SHell)作为其主要的脚本语言。Bash 脚本可用于执行各种任务,如系统管理、文件操作、数据处理等。以下是一个简单的 Bash 脚本示例,它用于列出当前目录中的所有文件:#!/bin/bash # This is a simple Bash script to list all files in the current directory. ls -l这个脚本的第一行指定了使用 Bash 作为解释器。#!/bin/bash 是一个特殊的字符串,称为 shebang,它告诉系统使用哪个解释器来执行该脚本。脚本的注释部分用 # 符号表示,用于提供有关脚本的说明或解释。ls -l 是一个命令,用于列出当前目录中的所有文件。这个命令在脚本中被执行,并将结果输出到控制台。要运行这个脚本,将其保存为一个文件(例如 list_files.sh),然后在终端中输入以下命令:bash list_files.sh这将执行脚本并将输出显示在终端上。使用bash脚本编写每天定时切割Nginx日志的工具以下是一个使用bash编写的每天定时切割Nginx日志的脚本示例:#!/bin/bash # Nginx日志文件路径 LOG_FILE="/var/log/nginx/access.log" # 切割日志文件的日期格式 DATE_FORMAT="%Y-%m-%d" # 获取当前日期并计算前一天日期 TODAY=$(date +"$DATE_FORMAT") YESTERDAY=$(date -d "$TODAY - 1 day" +"$DATE_FORMAT") # 定义日志文件备份目录 BACKUP_DIR="/var/log/nginx/backup" # 检查备份目录是否存在,如果不存在则创建 if [ ! -d "$BACKUP_DIR" ]; then mkdir -p "$BACKUP_DIR" fi # 定义要备份的日志文件名 LOG_FILE_NAME=$(basename "$LOG_FILE") # 切割日志文件并备份 mv "$LOG_FILE" "$BACKUP_DIR/$LOG_FILE_NAME.$YESTERDAY" touch "$LOG_FILE" # 输出日志切割完成信息 echo "Nginx log file $LOG_FILE_NAME has been backed up to $BACKUP_DIR/$LOG_FILE_NAME.$YESTERDAY and truncated."使用方法:将以上脚本保存为一个文件(例如nginx_log_rotate.sh)。将Nginx日志文件路径(LOG_FILE)和日志文件备份目录(BACKUP_DIR)设置为适当的值。使用chmod +x nginx_log_rotate.sh命令将脚本文件设置为可执行。添加一个定时任务(例如使用crontab -e命令)以每天自动运行该脚本。例如,以下cron表达式将每天凌晨3点运行该脚本:0 3 * * * /path/to/nginx_log_rotate.sh > /dev/null 2>&1
  • [技术干货] 在不停止Nginx服务的情况下平滑更变Nginx的配置
    在不停止Nginx服务的情况下平滑地更改Nginx的配置可以通过以下步骤实现:创建新的配置文件:首先,创建一个新的配置文件,其中包含您希望更改的Nginx配置。您可以使用任何文本编辑器创建该文件,并将其保存在适当的位置。备份原始配置文件:在更改配置之前,建议备份原始的Nginx配置文件,以便在需要时恢复到原始状态。更新配置文件:使用Nginx的配置文件语法,更新原始配置文件,以包含您希望更改的配置。确保在更改配置时遵循正确的语法和配置规则。验证配置文件:在更改完配置文件后,使用以下命令验证配置文件的语法是否正确:nginx -t如果输出显示配置文件语法正确,则可以继续下一步。如果显示错误,则需要检查配置文件的语法错误并修正它们。重启Nginx服务:使用以下命令重启Nginx服务,以使新的配置生效:systemctl restart nginx或者,如果您使用的是旧版本的Nginx,则可以使用以下命令:service nginx restart这将重新加载Nginx的配置文件,而不必停止整个服务。Nginx将平滑地切换到新的配置,而不会中断正在进行的连接。请注意,在进行任何更改之前,建议备份原始配置文件以防止意外情况发生。此外,确保仔细阅读Nginx的文档和配置规则,以确保您正确地更改了配置。
  • [技术干货] 调整Linux内核参数,优化Nginx性能
    前言Nginx是一个高性能的Web服务器和反向代理服务器,它已经经过了很好的优化,可以在大多数Linux发行版上运行良好。但是,您可以通过调整Linux内核参数来进一步优化Nginx的性能。具体步骤:调整文件描述符数量:Nginx需要打开许多文件描述符来处理连接和请求。您可以增加文件描述符的数量来提高Nginx的性能。在Linux系统中,您可以通过修改/etc/security/limits.conf文件来增加文件描述符数量。sudo nano /etc/security/limits.conf在文件中添加以下行:* soft nofile 1000000 * hard nofile 1000000这将将文件描述符的数量增加到100万个。调整内核参数:您可以通过修改Linux内核参数来优化Nginx的性能。在Linux系统中,您可以通过修改/etc/sysctl.conf文件来调整内核参数。sudo nano /etc/sysctl.conf在文件中添加以下行:net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 300 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 1024 65000这将调整TCP连接的参数,以提高性能和减少延迟。应用更改:要使更改生效,您需要重新加载Linux内核参数。在大多数Linux发行版上,您可以使用以下命令重新加载内核参数:sudo sysctl -p这将使您对sysctl.conf所做的更改生效。调整Nginx配置:除了调整Linux内核参数外,您还可以优化Nginx的配置以提高性能。这包括调整worker进程数、事件循环大小、连接超时等参数。请参考Nginx的官方文档和其他资源,根据您的特定需求进行相应的调整。监控和调优:最后,您应该监控Nginx的性能并进行调优。使用工具如top、htop、netstat等检查Nginx进程的资源使用情况,以及系统整体的资源使用情况。根据监控结果进行进一步的调优,并持续监控以验证改进的效果。top命令:是一个动态显示过程(正在运行的进程)的实用程序。它可以让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。它可以展示CPU、内存、Swap、进程和线程等系统资源的使用情况。htop命令:是一个强大的Linux系统监控工具,可以显示实时的系统资源使用情况,包括CPU、内存、Swap、进程和线程等。相比top命令,htop命令具有更强大的功能和更直观的显示效果。它也支持颜色主题、横向或纵向滚动浏览进程列表、鼠标操作等功能。netstat命令:是一个监控TCP/IP网络的非常有用的工具,通常用来查看某个端口的占用情况或者某个服务占用的端口情况。它可以显示网络连接和端口信息,包括本地地址和端口、外部地址和端口、连接状态等。