众所周知,有些服务存在着地区限制,我们可以通过在服务所属地区搭建代理服务来解决,其中在其服务范围内部署 Nginx 反代服务是个有效且流行的办法。
但如果区域很多,每个区域都布置一台服务器那成本会有些高昂且利用率很低,通常我们只是需要该地区的 IP 而已,如果手头上正好有这些地区的代理池的话,那我们就可以只用一台服务器部署Nginx反向代理结合服务所在地区的代理实现相同的效果。
本文着重介绍的就是如何让 Nginx 通过代理访问上游服务。(即 proxy_pass 的目标)
详细图文说明可以参见《Nginx 如何与 Socat 配合使用》
PS:本配置兼容 《哔哩漫游》 和 《解除b站区域限制》
代理请自备,本文是使用 SSR Python 版的客户端(local.py),监听本地 1080 端口,协议 socks5。
请先检查自己的代理服务是否正常。
curl --socks5-hostname 127.0.0.1:1080 cip.cc
期望返回参考
IP : 【代理出口IP】
地址 : 中国 台湾 台北市
运营商 : cht.com.tw
数据二 : 台湾省台北市 | 中华电信
数据三 : 中国台湾 | 中华电信
URL : http://www.cip.cc/【代理出口IP】
sudo apt install -y autoconf git yodl curl make
# 拉取源码
git clone https://github.com/runsisi/socat.git
# 进入目录
cd socat
# 处理配置
autoconf
./configure --prefix=/usr
# 编译
make
# 安装
sudo make install
# 检查是否成安装
socat -h
测试(开启两个终端):
socat TCP4-LISTEN:1081,reuseaddr,fork SOCKS5:127.0.0.1:cip.cc:80,socks5port=1080 # 测试完成后 Ctrl+C 终止运行
# 在另一个终端用 curl 测试
curl -v -H "Host: cip.cc" 127.0.0.1:1081
cd /etc/systemd/system # 进入目录
sudo vim socat-tw.service # 这里文件名随意,你好记就行,文件名就是服务名,但是后缀得是 .service
建议 ExecStart
使用绝对路径,通过 which socat
可以查询 socat 的路径。
输入以下内容(用于反代B站接口):
[Unit]
Description=socat-tw
After=network.target
[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/socat TCP4-LISTEN:1081,reuseaddr,fork SOCKS5:127.0.0.1:api.bilibili.com:443,socks5port=1080
[Install]
WantedBy=multi-user.target
(可选)再新建一个用于测试代理
sudo vim socat-cip.service
输入以下内容(用于测试代理是否正常):
[Unit]
Description=socat-cip
After=network.target
[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/socat TCP4-LISTEN:1082,reuseaddr,fork SOCKS5:127.0.0.1:cip.cc:80,socks5port=1080
[Install]
WantedBy=multi-user.target
重载与启动服务
sudo systemctl daemon-reload # 重新加载服务
sudo systemctl start socat-tw # 启动服务(这里的 socat-tw 就是上面的文件名)
sudo systemctl enable socat-tw # 设置开机启动
sudo systemctl status socat-tw # 检查状态
# 如果上面没有建 socat-cip 下面就不用了
sudo systemctl start socat-cip
sudo systemctl enable socat-cip
sudo systemctl status socat-tw
sudo apt install -y nginx # 安装 Nginx
cd /etc/nginx # 进入 Nginx 配置目录
sudo mkdir vhosts # 建立虚拟主机配置目录
sudo vim nginx.conf # 编辑 Nginx 主配置
在 nginx.conf
的 http{ }
中添加
include /etc/nginx/vhosts/*.conf;
cd vhosts # 进入配置目录
sudo vim example.com.conf # 建议使用域名作为配置文件名
写入如下配置
server {
server_name example.com # 填写自己的域名
listen 80;
listen [::]:80; # 监听IPv6,根据需要取舍
client_max_body_size 128M;
location /pgc/player/api/playurl { # 用于 APP 解析
proxy_set_header Host api.bilibili.com;
proxy_pass https://127.0.0.1:1081; # 通过代理连接到 api.bilibili.com
# 模块请求都会带上X-From-Biliroaming的请求头,为了防止被盗用,可以加上请求头判断
# 这里还需要给油猴脚本使用,因此不启用了
# if ($http_x_from_biliroaming ~ "^$") {
# return 403;
# }
}
location /pgc/player/web/playurl { # 为油猴脚本做准备
proxy_set_header Host api.bilibili.com;
proxy_pass https://127.0.0.1:1081;
}
location /cip/ { # 用于测试代理是否正常
proxy_set_header Host www.cip.cc;
proxy_pass http://127.0.0.1:1082/;
}
}
重载 Nginx
sudo systemctl start nginx 启动 Nginx
sudo systemctl enable nginx 设置 Nginx 开机启动
sudo nginx -s reload 重新加载 Nginx 配置
安装请前往 https://certbot.eff.org/instructions 查看相应文档
# 为 Nginx 站点添加 SSL,会给出域名列表,选择相应域名的序号即可
sudo certbot --nginx
完成后,记得前往 https://example.com/ 检查 SSL 是否启用成功。
代理问题解决了,不过启动服务的时候依旧提示
Exec format error.
错误信息跟之前一样
系统版本是Ubuntu 18.04.4 x86_64