Ubuntu 16.04服务器Nginx针对特定IP添加HTTP请求头的实现方法
既然你已经在Ubuntu 16.04上跑着Nginx当Web服务器,优先用Nginx本身实现需求肯定是最省事的——不用额外装软件,配置也贴合你现有的环境。当然如果你更倾向用HAproxy,我也给你整理了方案,咱们一个个说:
方法一:直接用Nginx实现
Nginx可以通过proxy_set_header(给后端转发的请求加头)结合IP匹配规则来实现,这里推荐用map指令处理IP匹配,比直接用if更稳定(Nginx的if在部分场景下有非预期行为)。
步骤1:修改Nginx配置
Ubuntu 16.04的Nginx主配置文件是/etc/nginx/nginx.conf,站点配置一般在/etc/nginx/sites-available/目录下(比如你的站点配置文件是/etc/nginx/sites-available/your-site)。
方式A:用map匹配多个IP/IP段(推荐)
先在http块中定义IP匹配规则:
http { # 定义map:匹配信任IP时返回"Yes",否则返回空 map $remote_addr $is_trusted_ip { default ""; 192.168.1.100 "Yes"; # 单个特定IP 10.0.0.0/24 "Yes"; # 整个IP段 203.0.113.5 "Yes"; # 另一个单个IP } # 其他原有配置... }
然后在代理后端的location块中添加请求头:
server { listen 80; server_name your-domain.com; # 代理后端应用的location location /api/ { proxy_pass http://localhost:8080; # 你的后端服务地址 # 给信任IP的请求添加自定义请求头 proxy_set_header X-Trusted-IP $is_trusted_ip; # 其他代理配置(比如主机头、超时等) proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # 前端静态文件的location location / { root /var/www/your-frontend; index index.html; } }
方式B:用if匹配单个IP
如果只需要匹配单个IP,也可以直接用if(但不推荐用于复杂场景):
location /api/ { proxy_pass http://localhost:8080; if ($remote_addr = 192.168.1.100) { proxy_set_header X-Trusted-IP "Yes"; } }
步骤2:验证并重启Nginx
修改配置后,先验证配置语法是否正确:
sudo nginx -t
如果输出test is successful,就可以重启Nginx生效:
sudo service nginx restart
方法二:用HAproxy实现
如果你想用HAproxy作为前置代理来处理IP匹配和请求头添加,步骤如下:
步骤1:安装HAproxy
sudo apt-get update && sudo apt-get install haproxy
步骤2:修改HAproxy配置
编辑默认配置文件/etc/haproxy/haproxy.cfg:
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 # 前端监听80端口,处理入站请求 frontend http_front bind *:80 # 定义ACL匹配信任IP/IP段 acl trusted_ip src 192.168.1.100 acl trusted_ip src 10.0.0.0/24 # 给匹配到的请求添加自定义请求头 http-request set-header X-Trusted-IP "Yes" if trusted_ip # 转发请求到后端的Nginx default_backend http_back # 后端指向你的Nginx服务(注意要把Nginx改成监听8080端口,避免端口冲突) backend http_back server nginx_local localhost:8080 check
步骤3:调整Nginx监听端口
修改Nginx的站点配置,把listen 80;改成listen 8080;,然后重启Nginx。
步骤4:验证并重启HAproxy
验证HAproxy配置:
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
没问题的话重启HAproxy:
sudo service haproxy restart
总结
如果你已经在使用Nginx,方法一的map方案是最优选择——配置简单、无需额外软件,且稳定性更高。如果你的架构已经依赖HAproxy,那么方法二可以无缝集成。
内容的提问来源于stack exchange,提问作者Samin Munankarmi

