服务器要求:
软件安装:
bash# Ubuntu/Debian
sudo apt update && sudo apt install nginx
# CentOS
sudo yum install epel-release && sudo yum install nginx
防火墙设置:
bash# Ubuntu/Debian(UFW)
sudo ufw allow 8080/tcp
# CentOS(Firewalld)
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
bashsudo nano /etc/nginx/nginx.conf
在 http 块中添加以下内容:
nginxhttp { # 其他原有配置... server { listen 8080; # 监听端口,B 服务器将访问此端口 server_name _; # 允许所有域名访问 location /proxy { # 从 URL 参数获取子节点 IP 和端口 set $target_ip $arg_ip; set $target_port $arg_port; # 验证参数是否存在 if ($target_ip = "") { return 400 "Error: Please provide 'ip' parameter"; } if ($target_port = "") { set $target_port 80; # 默认端口为 80 } # 反向代理到目标子节点 proxy_pass http://$target_ip:$target_port; # 保留原始请求头 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } }
bashsudo systemctl restart nginx
在 B 服务器的浏览器中输入:
http://A服务器IP:8080/proxy?ip=子节点IP&port=子节点端口
http://192.168.1.100:8080/proxy?ip=192.168.1.101&port=80
bashcurl "http://A服务器IP:8080/proxy?ip=192.168.1.101&port=80"
如果子节点(如 A1)的 IP 经常变化,建议搭配 DDNS 服务:
a1.mydomain.com)$target_ip 为域名:
nginxproxy_pass http://$arg_ip:$target_port; # 直接使用 URL 中的域名参数
每次访问时直接传递最新 IP:
http://A服务器IP:8080/proxy?ip=192.168.1.102&port=80 # 假设 A1 的新 IP 是 192.168.1.102
HTTPS 支持:
nginxproxy_pass https://$target_ip:$target_port;
端口冲突:
安全加固:
nginxallow 192.168.1.200; # B 服务器的 IP deny all;
404 错误:
location /proxy 的路径502 Bad Gateway:
跨域问题:
nginxadd_header Access-Control-Allow-Origin *;
如果需要 B 服务器代理 B1/B2/B3,只需在 B 服务器重复上述配置,A 服务器通过 B 的 8080 端口访问即可。
本文作者:sea-whales
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!