1 新建 process/Proxy.php
<?php
namespace process;
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
class Proxy
{
public function onMessage(TcpConnection $connection, Request $request)
{
$replace = [
'api.example.com' => 'api.openai.com',
'discord.example.com' => 'discord.com',
'cdn.example.com' => 'cdn.discordapp.com',
'gateway.example.com' => 'gateway.discord.gg',
];
$host = $request->host(true);
if (!isset($replace[$host])) {
return $connection->send(response('404 not found', 404));
}
$host = $replace[$host];
$buffer = (string)$request;
$con = new AsyncTcpConnection("tcp://$host:443", ['ssl' =>[
'verify_peer' => false
]]);
$buffer = preg_replace("/Host: ?(.*?)\r\n/", "Host: $host\r\n", $buffer);
$con->transport = 'ssl';
$connection->protocol = null;
$con->send($buffer);
$con->pipe($connection);
$connection->pipe($con);
$con->connect();
}
}
2 修改 config/process.php
<?php
return [
// ... 这里省略了其它配置 ...
// http代理配置
'proxy' => [
'handler' => \process\Proxy::class,
'listen' => 'http://0.0.0.0:8989',
'count' => cpu_count(),
'reloadable' => false,
]
];
3 执行 php start.php restart
重启webman
4 设置nginx代理,用于开启https。(以api.example.com为例)
server {
server_name api.example.com;
listen 80;
root /home/www/webman/public;
# 这个配置很重要
proxy_buffering off;
# https证书
listen 443 ssl;
ssl_certificate ssl/xxx.pem;
ssl_certificate_key ssl/xxx.key;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
location ^~ / {
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Connection "";
if (!-f $request_filename){
proxy_pass http://127.0.0.1:8989;
}
}
}
5 设置nginx代理,用于开启wss。(以gateway.example.com为例)
server {
server_name gateway.example.com;
listen 80;
root /home/www/webman/public;
# 这个配置很重要
proxy_buffering off;
# https证书
listen 443 ssl;
ssl_certificate ssl/xxx.pem;
ssl_certificate_key ssl/xxx.key;
ssl_session_cache shared:le_nginx_SSL:1m;
ssl_session_timeout 1440m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS";
location ^~ / {
proxy_set_header Host $host;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
if (!-f $request_filename){
proxy_pass http://127.0.0.1:8989;
}
}
}
6 重启nginx
这样访问 https://api.example.com
实际上就是访问 https://api.openai.com
。
实现了代理api.example.com
代理api.openai.com
赞~
赞!已测试,可以使用。
之前用的是curl的代理ip访问的,这个方案也不错
这个功能是用于什么场景?
同问?做内网穿透?
直接用nginx代理实现的
nginx 从官方角度 对https支持不好
这个代理文件建在哪里?直接在app/controller吗?另有这个代理需要部署在外面的服务器吗?
这样能够实现cdn的效果嗎
赞
老大 这个是要安装ai的那一套进行绑定域名吗
没明白你在说什么
Midjourney代理里面这个怎么配置转发
-e mj.ng-discord.wss=wss://ws.imgin.top \
这个代理支持ws,不用特殊处理
知道了 搞定了
留个脚印,要是能收藏就好了
文章最后一行,有一个“星号”,点击即可收藏了
能不能实现对远程服务器返回的数据进行修改,比如嵌入一段自己的代码?
你想干啥?
好想法,比如加个广告?
那么这段代理服务器的代码是不是需要放到,一个能访问到api.openai.com的服务器上才行
对
这种方法可以用来访问google吗
workerman是完全可以轻松实现的,亲测成功,性能很高。但是比较麻烦,你需要开发服务端和客户端,并且配置系统或浏览器的代理,还会遇到一些小坑,如果你只是为了学习研究下倒也没啥,如果有另外的想法就真的大可不必了。
配置了http代理,有时候走了代理 大多数http 请求没走代理,直接请求了,不知是否和没有配置https 有关
再温习一次