如何识别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
相关产品推荐
相关产品推荐

