You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何识别Nginx多监听端口server块中请求的目标端口?

Nginx针对特定监听端口应用配置的实现方法

我有如下Nginx的server块:

server {
    listen 80;
    listen 81;
    server_name default_server;
}

现在我希望仅针对端口80应用某项配置(比如请求限制),该如何判断请求的目标端口是80还是81?我想实现类似这样的效果:

server {
    listen 80;
    listen 81;
    server_name default_server;

    if (post_requested == 80) {
        // 应用请求限制(示例)
    }
}

方案一:用内置变量$server_port结合if指令

Nginx内置了$server_port变量,它会存储当前请求到达的服务器端口,直接通过这个变量判断即可:

server {
    listen 80;
    listen 81;
    server_name default_server;

    if ($server_port = 80) {
        # 示例:添加请求限制规则
        limit_req zone=one burst=5 nodelay;
    }

    # 其他通用配置
}

注意:Nginx的if指令属于官方标注的“需谨慎使用”范畴,在复杂配置场景下可能出现意料之外的行为,仅推荐在简单规则场景下使用。

方案二:拆分独立server块(更推荐)

按照监听端口拆分出独立的server块,这是更符合Nginx设计理念的做法,逻辑清晰且能避免if的潜在问题:

# 仅监听80端口的server块
server {
    listen 80;
    server_name default_server;

    # 直接添加80端口专属配置,比如请求限制
    limit_req zone=one burst=5 nodelay;

    # 引入通用配置(如果有大量重复配置)
    include /etc/nginx/common/configs.conf;
}

# 仅监听81端口的server块
server {
    listen 81;
    server_name default_server;

    # 添加81端口需要的配置,或直接引入通用配置
    include /etc/nginx/common/configs.conf;
}

这种方式的优势在于配置结构清晰,便于维护,尤其是当不同端口需要的规则差异较大时,能避免规则混淆。如果存在大量通用配置,可以将其抽离成单独的配置文件,通过include指令复用,减少重复代码。

内容的提问来源于stack exchange,提问作者HarisRg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:17:11