文章目录什么是 PAC 文件举个例子需要准备的文件1. 主程序agent-pac.py2. 代理规则文件proxy.pac如何启动服务第一步准备文件第二步修改配置第三步启动服务第四步检查是否启动成功常用操作命令启动服务查看运行状态停止服务测试服务客户端如何使用Windows 电脑设置Mac 电脑设置手机设置iPhone/AndroidChrome 浏览器设置Firefox 浏览器设置整体业务流程详细流程图使用场景场景 1公司办公场景 2家里上网场景 3开发测试常见问题Q1服务启动失败提示端口被占用Q2客户端获取不到 PAC 文件Q3修改了 proxy.pac 为什么不生效Q4如何添加新的网站规则Q5如何停止后台服务快速参考文件清单启动命令检查命令客户端配置地址什么是 PAC 文件PACProxy Auto-Config文件是一个简单的文本文件告诉浏览器访问哪些网站走代理哪些网站直接连接。举个例子访问百度、淘宝 → 直接连接速度快访问 Google、YouTube → 走代理服务器能访问这样就不需要手动切换代理全部自动完成需要准备的文件1. 主程序agent-pac.py# Created by johnny on 20240412importosimporthttp.serverimportsocketserver PORT22222PACFILE_NAMEproxy.pacdefprepare_pac():dir_pathos.path.dirname(os.path.abspath(__file__))pacfile_pathos.path.join(dir_path,PACFILE_NAME)try:withopen(pacfile_path,rb)asf:returnf.read()exceptFileNotFoundError:print(fFile{pacfile_path}not found.)returnNoneclassPacRequestHandler(http.server.SimpleHTTPRequestHandler):defdo_GET(self):ifself.path/PACFILE_NAME:pac_contentprepare_pac()ifpac_contentisNone:self.send_error(404)returnself.send_response(200)self.send_header(Content-type,application/x-ns-proxy-autoconfig)self.end_headers()self.wfile.write(pac_content)else:self.send_error(404)classThreadingTCPServer(socketserver.ThreadingTCPServer):allow_reuse_addressTruedefmain():HandlerPacRequestHandlerwithThreadingTCPServer((10.11.12.222,PORT),Handler)ashttpd:print(Serving PAC file on port,PORT)try:httpd.serve_forever()exceptKeyboardInterrupt:print(Shutting down server...)httpd.shutdown()if__name____main__:main()2. 代理规则文件proxy.pac在同一个文件夹下创建proxy.pac文件内容如下functionFindProxyForURL(url,host){// 1. 公司内部网站直接访问if(dnsDomainIs(host,.company.com)||shExpMatch(host,*.local)){returnDIRECT;}// 2. 国内网站直接访问if(shExpMatch(host,*.baidu.com)||shExpMatch(host,*.taobao.com)||shExpMatch(host,*.cn)){returnDIRECT;}// 3. 国外网站走代理if(shExpMatch(host,*.google.com)||shExpMatch(host,*.youtube.com)){returnPROXY 10.11.12.222:8080;}// 4. 其他的默认直连returnDIRECT;}说明DIRECT 直接连接不走代理PROXY 10.11.12.222:8080 走代理服务器请改成你的代理地址可以添加更多网站规则如何启动服务第一步准备文件把下面两个文件放在同一个文件夹里/opt/pac-server/ ├── agent-pac.py # 主程序 └── proxy.pac # 代理规则第二步修改配置用记事本打开agent-pac.py找到这一行withThreadingTCPServer((10.11.12.222,PORT),Handler)ashttpd:把10.11.12.222改成你电脑的实际 IP 地址。第三步启动服务在终端里执行命令nohuppython3 agent-pac.py命令说明nohup让程序在后台运行关掉终端也不会停止表示后台运行第四步检查是否启动成功netstat-tnpl|grep22222如果看到类似这样的输出说明启动成功了tcp 0 0 10.11.12.222:22222 0.0.0.0:* LISTEN 12345/python3常用操作命令启动服务# 后台启动推荐nohuppython3 agent-pac.py# 后台启动并记录日志到指定文件nohuppython3 agent-pac.pypac.log21查看运行状态# 查看服务是否在运行netstat-tnpl|grep22222# 查看进程psaux|grepagent-pac# 查看日志tail-f nohup.out停止服务# 查找进程号并停止psaux|grepagent-packill进程号# 或者一键停止pkill-f agent-pac.py测试服务# 在服务器上测试curlhttp://10.11.12.222:22222/proxy.pac# 在其他电脑上测试确保网络连通curlhttp://10.11.12.222:22222/proxy.pac客户端如何使用Windows 电脑设置打开设置→网络和 Internet→代理打开使用设置脚本填入地址http://10.11.12.222:22222/proxy.pac点击保存Mac 电脑设置打开系统偏好设置→网络选择当前网络点击高级→代理勾选自动代理配置填入地址http://10.11.12.222:22222/proxy.pac点击好→应用手机设置iPhone/Android进入Wi-Fi 设置点击当前 Wi-Fi 后面的ⓘ或修改找到代理设置选择自动填入地址http://10.11.12.222:22222/proxy.pac保存Chrome 浏览器设置Chrome 使用系统代理设置好系统代理即可。也可以用命令行启动chrome.exe --proxy-pac-urlhttp://10.11.12.222:22222/proxy.pacFirefox 浏览器设置打开设置 → 网络设置选择自动代理配置 URL填入http://10.11.12.222:22222/proxy.pac确定整体业务流程1.获取配置返回规则2.访问百度3.访问Google你的电脑/手机PAC服务器直接连接代理服务器Google网站详细流程图目标网站代理服务器PAC服务器用户浏览器目标网站代理服务器PAC服务器用户浏览器用户访问 www.baidu.com用户访问 www.google.com请求http://10.11.12.222:22222/proxy.pac读取 proxy.pac 文件返回代理规则检查规则直连直接访问检查规则走代理通过代理访问转发请求返回内容返回内容使用场景场景 1公司办公问题公司内部系统和外部网站都要访问手动切换代理很麻烦。解决// 公司内网直接访问if(dnsDomainIs(host,.company.com)){returnDIRECT;}// 外网走公司代理returnPROXY company-proxy.com:8080;场景 2家里上网问题想自动区分国内网站和国外网站国内直连国外走代理。解决// 国内网站直连if(shExpMatch(host,*.baidu.com)||shExpMatch(host,*.cn)){returnDIRECT;}// 其他走代理访问国外网站returnPROXY 你的代理服务器:端口;场景 3开发测试问题开发和生产环境用不同的代理。解决if(shExpMatch(host,*.test.com)){returnPROXY test-proxy:8080;}if(shExpMatch(host,*.prod.com)){returnPROXY prod-proxy:8080;}常见问题Q1服务启动失败提示端口被占用解决# 查看谁占用了 22222 端口netstat-tlnp|grep22222# 杀掉占用进程kill进程号# 或者修改端口修改 agent-pac.py 里的 PORT 22222Q2客户端获取不到 PAC 文件排查服务器上测试curl http://localhost:22222/proxy.pac其他电脑 ping 服务器ping 10.11.12.222检查防火墙是否放行 22222 端口Q3修改了 proxy.pac 为什么不生效原因浏览器会缓存 PAC 文件。解决重启浏览器Chrome 访问chrome://net-internals/#proxy点击重新加载Q4如何添加新的网站规则方法编辑proxy.pac文件添加新的规则保存即可。示例// 让 GitHub 走代理if(shExpMatch(host,*.github.com)){returnPROXY 10.11.12.222:8080;}Q5如何停止后台服务# 查找进程psaux|grepagent-pac# 你会看到类似这样的输出# root 12345 0.0 0.1 ... python3 agent-pac.py# 停止进程12345 是进程号kill12345快速参考文件清单agent-pac.py # 主程序启动服务 proxy.pac # 代理规则定义哪些网站走代理启动命令cd/opt/pac-servernohuppython3 agent-pac.py检查命令netstat-tnpl|grep22222客户端配置地址http://10.11.12.222:22222/proxy.pac请把 IP 改成你的实际服务器 IP