一、下载

官网https://nginx.org/en/download.html
在这里插入图片描述

二、安装依赖包

yum -y install make gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel

三、上传压缩包并解压

将安装包nginx-1.28.0.tar.gz上传到/opt/nginx路径下并解压

mkdir /opt/nginx
cd /opt/nginx
tar -zxvf nginx-1.28.0.tar.gz

四、配置、编译和安装

默认是安装到/usr/local/nginx,如果需要更改路径,替换/usr/local/nginx

# 配置
cd /opt/nginx/nginx-1.28.0
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# 编译和安装
make && make install

五、查看Nginx安装路径

whereis nginx
# 或者
which nginx

使用which或者whereis,可能都找不到想要的结果,如下图所示
在这里插入图片描述
使用组合命令查找

# 找到nginx对应的pid
ps -ef | grep nginx
# 查找nginx路径 ls -l /proc/pid(换成上面命令找到的pid)/exe
ls -l /proc/4688/exe

六、nginx命令

# 如果安装在其他目录,替换/usr/local/nginx
# 启动
/usr/local/nginx/sbin/nginx
# 停止
/usr/local/nginx/sbin/nginx -s stop
# 退出
/usr/local/nginx/sbin/nginx -s quit
# 重启
/usr/local/nginx/sbin/nginx -s reload
# 查看nginx.conf配置是否正确
/usr/local/nginx/sbin/nginx -t
# 查看nginx版本
/usr/local/nginx/sbin/nginx -V

# 直接使用nginx进行操作
# 第一种方式:创建软连接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx
# 第二种方式:添加环境变量
# 编辑配置文件
vi /etc/profile
# 在文件末尾添加
export PATH=$PATH:/usr/local/nginx/sbin
# 使配置生效
source /etc/profile

# 就可以使用nginx操作了
nginx -V

非root用户启动会报错,非root用户没有使用80端口的权利
在这里插入图片描述
解决方式:

# 切换root用户
su - root
setcap 'cap_net_bind_service=+ep' /usr/local/nginx/sbin/nginx

七、测试Nginx是否启动成功

ps -ef | grep nginx
curl localhost:80

在这里插入图片描述
外网访问是否正常:http://ip:80,如果外网访问不正常,可能是端口没有开发或者防火墙问题

# 查看防火墙状态
systemctl status firewalld
# 暂时关闭防火墙
systemctl stop firewalld
# 永久关闭防火墙(慎用)
systemctl disable firewalld
# 开启防火墙
systemctl start firewalld
# 开放指定80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
# 关闭指定80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent

八、systemd方式管理nginx

vi /etc/systemd/system/nginx.service
[Unit]
Description=The Nginx HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
#PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

# 重载配置
systemctl daemon-reload
# 设置开机自启动
systemctl enable nginx
# 停止开机自启动
systemctl disable nginx
# 查看服务当前状态
systemctl status nginx
# 启动nginx服务
systemctl start nginx.service
# 停止nginx服务
systemctl stop nginx.service
# 重新启动服务
systemctl restart nginx.service
# 查看所有已启动的服务
systemctl list-units --type=service

九、nginx变量

  • $body_bytes_sent:发送给客户端的响应体字节数(不包含响应头);
  • $host:请求中的主机名(如example.com),优先使用请求行的主机名,否则使用 server_name;
  • $hostname:Nginx服务运行所在主机的主机名;
  • $http_cookie:客户端Cookie头;
  • $http_HEADER:匹配请求报文中指定的HEADER;
  • $http_host:匹配请求报文中的host首部;
  • $http_referer:客户端Referer头(来源页面);
  • $http_user_agent:客户端User-Agent头,如浏览器信息;
  • $http_x_forwarded_for:用于获取客户端的真实 IP 地址。在经过代理服务器(如负载均衡器、CDN)转发的请求中,客户端的原始 IP 会被记录在 X-Forwarded-For 请求头中,而非 $remote_addr(它记录的是直接连接到 Nginx 的客户端或代理服务器的 IP);
  • $remote_addr:客户端IP地址;
  • $remote_port:客户端端口号;
  • $remote_user:使用用户认证时客户端用户输入的用户名;
  • $request:记录请求的URL和HTTP协议;
  • $request_filename:用户请求中的URI经过本地root或alias转换后映射的本地文件路径;
  • $request_id:唯一的请求标识符,用于跟踪请求;
  • $request_method:请求方法,如GET、POST、PUT;
  • $request_time: 请求处理时间(单位:秒,精确到毫秒);
  • $request_uri:完整的请求URI,带参数;
  • $scheme:请求协议,如http或https;
  • $server_addr:服务器IP地址;
  • $server_name:服务器名称;
  • $server_port:服务器端口号;
  • $server_protocol:请求协议版本,如http/1.1、http/1.0;
  • $status:响应状态码,如200、404;
  • $time_local:请求时间;
  • $upstream_addr:上游服务器地址;
  • $upstream_response_time:上游服务器响应时间(多个上游时用逗号分隔);
  • $uri:当前请求的URI,不带参数;

十、http状态码

http状态码是用以表示网页服务器HTTP响应状态的3位数字代码。
可通过查看HTTP状态码来判断服务器状态,常见的有404、502等。

  • 301:永久移动,被请求的资源已被永久移动位置;
  • 302:请求的资源限制临时从不同的URI响应请求;
  • 305:使用代理,被请求的资源必须通过指定的代理才能访问;
  • 307:临时跳转,被请求的资源在临时从不同的URL响应请求;
  • 400:错误请求;
  • 402:需要付款,预留状态码,用于将来一些数字货币或者微支付;
  • 403:禁止访问,服务器已理解请求,但拒绝执行它;
  • 404:找不到对象,请求失败,资源不存在;
  • 406:不可接受的,请求的资源内容特性无法满足请求头部中的条件,因而无法生成响应实体;
  • 408:请求超时;
  • 409:冲突,由于和被请求的资源的当前状态之间存在冲突,请求无法完成;
  • 410:遗失的,被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址;
  • 413:响应实体太大,服务器拒绝处理当前请求,请求超过服务器所能处理和允许的最大值;
  • 417:期望失败。在请求头 Expect 中指定的预期内容无法被服务器满足;
  • 418:我是一个茶壶。超文本咖啡罐控制协议,但是并没有被实际的HTTP服务器实现;
  • 420:方法失效;
  • 422:不可处理的实体。请求格式正确,但是由于含有语义错误,无法响应;
  • 500:服务器内部错误。服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理;
  • 502:请求后端失败;
  • 504:请求成功,但是响应超时;

十一、白/黑名单配置

注意:IP同时出现在白名单和黑名单中,则以配置顺序为准,先匹配(顺序在前)的生效
第一种方式:直接配置在配置文件中:

# 白名单设置,allow后面为可访问的IP
location / {
    # 允许单个IP访问
    allow 192.168.1.1
    # 允许一个IP段访问
    allow 10.0.0.0/24
    # 禁止所有其他IP访问
    deny all;
}
# 白名单,特定目录访问限制
location /tree/list {
    # 允许单个IP访问
    allow 192.168.2.1
    # 允许一个IP段访问
    allow 10.0.0.0/24
    # 禁止所有其他IP访问
    deny all;
}
# 黑名单设置,deny后面为限制的IP
location / {
    # 禁止单个IP访问
    deny 192.168.1.2
    # 禁止一个IP段访问
    deny 192.168.2.0/24
    # 允许所有其他IP访问,可以不写,默认开启
    allow all;
}

第二种方式:读取文件IP配置

location / {
    include /usr/local/nginx/whitelist.conf
}

cat /usr/local/nginx/whitelist.conf
# 允许单个IP访问
allow 192.168.1.1
# 允许一个IP段访问
allow 10.0.0.0/24
# 禁止所有其他IP访问
deny all;

十二、location路径匹配

匹配遵循以下顺序:

  • 1.精确匹配(=);
  • 2.前缀匹配(^~);
  • 3.正则匹配(~ 或 *),按定义顺序;:区分大小写; ~*:不区分大小写;
  • 4.普通前缀匹配(最长匹配);
location / {
    return 200 "Default";
}
location /api/ {
    return 200 "API";
}
location ^~ /api/private/ {
    return 200 "Private";
}

访问 /api/private/test,结果返回 "Private",因为 ^~ 优先级高于 /api/

十三、日志

13.1 日志格式

# 访问日志access.log默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"
127.0.0.1 - - [09/Jan/2023:14:20:00 +0800] "POST /dkqz/api/findRegionDataList HTTP/1.1" 200 382426 "http://localhost/screen" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36"
$remote_addr--客户端的IP地址:127.0.0.1
$remote_user--认证用户名:第二个-
$time_local--请求时间:09/Jan/2023:14:20:00 +0800
$request--客户端的请求信息:POST /dkqz/api/findRegionDataList HTTP/1.1
$status--HTTP状态码:200
$body_bytes_sent--发送给客户端的响应体字节数:382426
$http_referer--请求的来源页面:http://localhost/screen
$http_user_agent--客户端的用户代理信息:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36

# 错误日志error.log:时间戳--日志级别--进程ID(nginx主进程ID#线程ID)--请求ID--错误信息--客户端IP--服务器--请求信息--上游地址--主机--来源页面
# 时间戳(YYYY/MM/DD HH:MM:SS):2023/02/06 15:41:37
# 日志级别:error
# 进程ID(nginx主进程ID#线程ID):10092#12592
# 请求ID:*573
# 错误信息:connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream
# 客户端IP:client: 127.0.0.1
# 服务器:server: localhost
# 请求信息:request: "POST /dkqz/api/screen/yhksyxz HTTP/1.1"
# 上游地址:upstream: "http://127.0.0.1:81/dkqz/api/screen/yhksyxz"
# 主机:host: "localhost"
# 来源页面:referrer: "http://localhost/screen"
2023/02/06 15:41:37 [error] 10092#12592: *573 connect() failed (10061: No connection could be made because the target machine actively refused it) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "POST /dkqz/api/screen/yhksyxz HTTP/1.1", upstream: "http://127.0.0.1:81/dkqz/api/screen/yhksyxz", host: "localhost", referrer: "http://localhost/screen"

13.2 日志分割

13.2.1 使用logrotate工具

logrotate 是 Linux 系统中一个常用的日志管理工具,可以按照指定的规则自动对日志文件进行轮转、压缩和删除等操作

# 安装logrotate
yum install logrotate

# 创建一个新的 logrotate 配置文件,例如 /etc/logrotate.d/nginx
sudo vim /etc/logrotate.d/nginx
/usr/local/nginx/logs/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 nobody nobody
    dateext
    dateformat -%Y%m%d
    sharedscripts
    postrotate
        if [ -f /usr/local/nginx/logs/nginx.pid ]; then
            kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`
        fi
    endscript
}
 # 参数解释:
    - `/usr/local/nginx/logs/*.log`:指定要处理的日志文件路径,这里表示处理 `/usr/local/nginx/logs/` 目录下所有的日志文件。
    - `daily`:表示每天进行一次日志轮转。
    - `missingok`:如果日志文件不存在,不报错继续执行。
    - `rotate 30`:保留最近 30 个日志文件,旧的日志文件会被删除。
    - `compress`:对轮转后的日志文件进行压缩(gzip格式)。
    - `delaycompress`:延迟压缩上一次轮转的日志文件,即下一次轮转时才压缩上一次的文件。
    - `notifempty`:如果日志文件为空,不进行轮转。
    - `create 0640 nobody nobody`:轮转后创建新的日志文件,权限为 0640,所有者为 `nobody`,所属组为 `nobody`(通过ps -ef|grep nginx 查看 worker process 的运行用户)。
    - `dateext`:切割后的文件添加日期作为后缀。
    - `dateformat -%Y%m%d`:日期格式。
    - `sharedscripts`:表示在所有日志文件轮转完成后只执行一次 `postrotate` 脚本。
    - `postrotate``endscript`:在日志轮转完成后执行的脚本,这里通过 `kill -USR1` 信号通知 Nginx 重新打开日志文件,以便后续日志写入新文件。
    
# 测试 logrotate 是否正常工作:-d表示进行一次调试运行,不会修改任何文件,但会显示将要执行的操作
sudo logrotate -d /etc/logrotate.d/nginx
# 手动执行一次
sudo logrotate -vf /etc/logrotate.d/nginx
# 查看结果
ls -la /usr/local/nginx/logs/

# logrotate 通常会由系统的 cron 任务每天自动执行,可以查看 /etc/cron.daily/logrotate 文件来确认
cat /etc/cron.daily/logrotate

13.2.2 使用Shell脚本+Cron

# 创建脚本
sudo vim /opt/nginx/nginx-cut-log.sh
#!/bin/bash
#设置日志文件存放目录
LOG_PATH="/usr/local/nginx/logs"
YESTERDAY=$(date -d yesterday +"%d")
# 移动日志文件(重命名)
mv ${LOG_PATH}/access.log ${LOG_PATH}/access-${YESTERDAY}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error-${YESTERDAY}.log
# 通知nginx重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)
# 清理 30 天前的日志
find ${LOG_PATH} -name "access_*.log" -type f -mtime +30 -exec rm -rf {} \;
find ${LOG_PATH} -name "error_*.log" -type f -mtime +30 -exec rm -rf {} \;

# 赋予脚本执行权限
sudo chmod +x /opt/nginx/nginx-cut-log.sh

# 设置cron定时任务
sudo crontab -e
0 0 * * * /bin/bash /opt/nginx/nginx-cut-log.sh

十四、openssl创建自签名证书

# 生成 CA 私钥(4096位,比 2048 位更安全)
openssl genrsa -out ca.key 4096
# 生成自签名根证书(有效期10年)
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyCompany/OU=IT/CN=My-Root-CA"

# openssl req: 执行证书签名请求(CSR)的管理工具。
# -new: 创建一个新的请求。
# -x509: 关键参数。它告诉 OpenSSL 不要生成 CSR(请求文件),而是直接输出一个 自签名的证书(Self-Signed Certificate)。这通常用于创建根 CA。
# -days 3650: 证书有效期为 3650 天(大约 10 年)。
# -key ca.key: 使用刚才生成的私钥 ca.key 对这张证书进行签名。
# -out ca.crt: 生成的公钥证书文件名为 ca.crt。这个文件是公开的,你需要把它分发给客户端(如浏览器、Docker守护进程、操作系统)去信任它。
# -subj "...": 指定证书的主题信息(Subject),避免交互式输入,直接把信息填进去:
# /C=CN: Country,国家(中国)。
# /ST=Beijing: State/Province,省份(北京)。
# /L=Beijing: Locality,城市(北京)。
# /O=MyCompany: Organization,组织/公司名称(MyCompany)。
# /OU=com: Organizational Unit,部门(通常写 IT 或 com)。
# /CN=My-Root-CA: Common Name,通用名称。这是证书最重要的标识,通常是域名或主机名(这里叫 My-Root-CA)。

# 查看证书详细信息
openssl x509 -in ca.crt -text -noout
# 验证私钥和证书是否匹配,输出的 MD5 值应该相同
openssl x509 -noout -modulus -in ca.crt | openssl md5
openssl rsa -noout -modulus -in ca.key | openssl md5

十五、配置文件示例

# 运行用户(nobody、nginx、root等自定义用户)
#user  nobody;
# 启动进程数,通常设置成和 CPU 核心数相等,或者设置为 auto 自动检测,具体数值则是启动对应数值的进程
worker_processes  1;

# 错误日志路径及级别:debug, info, notice, warn, error, crit
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
# 进程PID文件路径
#pid        logs/nginx.pid;

events {
    # 每个worker最大连接数,实际最大并发连接数 = worker_processes * worker_connections
    worker_connections  2048;
    # Linux高效事件模型,使用 epoll 模型
    use epoll;
    # 允许多个请求同时被接受
    multi_accept on;
}

http {
    # 引入 MIME 类型映射文件
    include       mime.types;
    # 默认文件类型,如果无法识别文件类型,则默认下载
    default_type  application/octet-stream;

    # 定义一个名为 'main' 的日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '"$request_id" '
                      'time="$request_time, $upstream_response_time"';
    # 访问日志路径,使用上面定义的 main 格式
    access_log  logs/access.log  main;
    # 隐藏 Nginx 版本号,防止黑客针对特定版本漏洞攻击
    server_tokens off;
    # 开启高效文件传输
    sendfile        on;
    # 必须和 sendfile 配合使用,在一个数据包里发送所有头文件,减少网络报文数量
    #tcp_nopush     on;
    # 开启 TCP_NODELAY,禁用 Nagle 算法,尽快发送数据,适用于小数据包高频发送
    #tcp_nodelay     on;

    # 长连接超时时间 (单位:秒)
    keepalive_timeout  65;
    # 客户端上传文件大小限制 (默认 1m,上传大文件需修改)
    client_max_body_size 100m;

    # 开启 gzip 压缩,减少带宽占用,提高加载速度
    gzip  on;  
    # 无论是谁请求都压缩 (包括代理)
    gzip_proxied any;
    # 最小压缩文件大小,小于 1k 的文件不压缩 (压缩反而变大)
    gzip_min_length 1k;
    # 压缩缓冲区
    #gzip_buffers 4 16k;
    # 压缩级别 1-9,数字越大压缩越好但越占 CPU,建议设置在5左右
    gzip_comp_level 6; 
    # 需要压缩的文件类型 (MIME type)
    gzip_types text/plain application/javascript application/x-javascript text/css text/xml application/xml text/javascript application/json;
    # 是否添加“Vary: Accept-Encoding”响应头
    gzip_vary on;
    # 禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
    gzip_disable "MSIE [1-6]\."; 
    
    # 限速(每个IP,1次/秒,使用10M内存做配置存储)
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
    # 限制同一个IP并发连接,使用10M内存做配置存储
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
    
    # 定义一个后端服务器组,名为 web_server
    upstream web_server {
        # 负载均衡策略:
        # 1. 轮询 (默认):按时间顺序逐一分配
        # 2. weight:权重,默认为 1,权重越高分配的请求越多
        # 3. ip_hash:每个请求按访问 IP 的 hash 结果分配,可解决 Session 共享问题
        
        server 192.168.1.101:8080 weight=5;
        server 192.168.1.102:8080 weight=1;
        
        # backup: 备份机,只有当其他所有非 backup 机器挂掉时才启用
        server 192.168.1.103:8080 backup;
        
        # down: 表示该机器暂时不参与负载
        # server 192.168.1.104:8080 down;
    }
    
    # 正向代理服务器
    # 注意:Nginx 原生仅支持 HTTP 正向代理,不支持 HTTPS (CONNECT 方法)
    # 如果需要 HTTPS 正向代理,需要打补丁 ngx_http_proxy_connect_module
    server {        
        listen 8080;
        
        # DNS 解析配置
        resolver 8.8.8.8 114.114.114.114 ipv6=off;
        resolver_timeout 5s;
        
        # 启用 CONNECT 方法(用于HTTPS代理)
        #proxy_connect;
        # 允许的端口
        #proxy_connect_allow 443 563;  
        #proxy_connect_timeout 30;
        #proxy_read_timeout 30;
        #proxy_send_timeout 30;
  
        
        # 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
        include whitelist.conf  

        location / {
            # 开启 proxy_pass,直接转发 $http_host 和 $request_uri
            proxy_pass http://$http_host$request_uri;
            
            # 设置允许代理
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                

        }
    }

    server {
        # web服务监听端口
        listen       80;
        # 服务器名称(域名)
        server_name  localhost;
                       
        # 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
        include whitelist.conf  
        
        # 永久重定向到 https 站点
        #return 301 https://$http_host$request_uri;
        
        location / {
            root html;
            index index.html index.htm;
        }
        
        location /test {
            client_max_body_size 15m;
            # 增加头部ID
            proxy_set_header X-Request-Id $request_id;
            proxy_set_header Host $http_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;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_pass http://web_server;
            
            # 同一个IP允许瞬间突发5个请求,超过的请求就返回503
            # burst=5:允许突发 5 个请求(缓冲队列)
            # nodelay: 突发请求立即处理,不延迟
            limit_req zone=req_zone burst=5 nodelay;
            # 限制同一个IP并发数为5
            limit_conn conn_zone 5;            
        }
    }
    
    server {
        listen 443 ssl;
        server_name  localhost;
        
        # SSL 证书文件路径
        ssl_certificate cert/ca.crt;
        ssl_certificate_key cert/ca.key;
        # SSL 协议和加密套件优化 (推荐配置)
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout 5m;
        # 优先选择支持前向加密的算法,且按照性能的优先顺序排列
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!3DES:!ADH:!RC4:!DH:!DHE:!IDEA:!DES;
        ssl_prefer_server_ciphers on;
        # 指定TLS协议的版本,不安全的SSL2和SSL3要废弃掉
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
       
        # 使用文件配置,whitelist.conf和配置文件在同级目录下就可以不配置完整路径
        include whitelist.conf  
        
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
        
        location / {
            root html;
            index index.html index.htm;
        }
        
        location /test {
            client_max_body_size 15m;
            # 增加头部ID
            proxy_set_header X-Request-Id $request_id;
            proxy_set_header Host $http_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;
            # 解决 https 重定时向回到了 http 的问题
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_pass http://web_server;
            
            # 同一个IP允许瞬间突发5个请求,超过的请求就返回503
            # burst=5:允许突发 5 个请求(缓冲队列)
            # nodelay: 突发请求立即处理,不延迟
            limit_req zone=req_zone burst=5 nodelay;
            # 限制同一个IP并发数为5
            limit_conn conn_zone 5;     
        }
}
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐