linux服务器上部署v2raya

最近折腾n8n,结果好多服务、mcp都需要代理,不然的话用不起来。暂时又不想搞个境外服务器,因为阿里云和腾讯云的服务器就好几个了。于是想在其中一台机器上装个代理的镜像,然后本机器或者其他的机器使用这个代理。

我的服务器都是centos,首先在一台机器上安装下镜像,参考官方文档《https://v2raya.org/docs/prologue/installation/docker/》。

如果没有特别的设置,那么直接按照命令去执行就行。但是这个应用使用范围这么广,特定的端口肯定被扫描了,所以放在服务器上的话还是改一下端口比较好。

这是一个传统后端启动的示例:

docker run -d \
  --restart=always \
  --privileged \
  --network=host \
  --name v2raya \
  -e V2RAYA_LOG_FILE=/tmp/v2raya.log \
  -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
  -e V2RAYA_NFTABLES_SUPPORT=off \
  -e IPTABLES_MODE=legacy \
  -v /lib/modules:/lib/modules:ro \
  -v /etc/resolv.conf:/etc/resolv.conf \
  -v /etc/v2raya:/etc/v2raya \
  mzz2017/v2raya

自己的话,肯定要修改一下端口,所以选择使用下边这个示例

docker run -d \
  -p 2017:2017 \
  -p 20170-20172:20170-20172 \
  --restart=always \
  --name v2raya \
  -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
  -e V2RAYA_LOG_FILE=/tmp/v2raya.log \
  -v /etc/v2raya:/etc/v2raya \
  mzz2017/v2raya

安装成功,把指定的端口在防火墙里放开,用本机的浏览器直接访问,可行。创建了账号,然后导入订阅,到此为止,目前还算正常。

但是还需要验证。用ping没法加代理,于是用yum install httping安装了httping工具。

直接执行httping -x localhost:20170 -g http://www.google.com 反回了short read during receiving reply-headers from host。

点着点着发现v2ray2的页面里,点开导入的配置之后,需要选中线路并连接。。。忘了这茬。选中常用线路,点击“connect”,emmm,报了failed to connect: failed to connect: not support Trojan: strconv.Atoi: parsing “”: invalid syntax。根据文档《https://feiniu.nas50.cn/forum.php?mod=viewthread&tid=1792》操作时,点击“启动”的时候报failed to start v2ray-core: not support Trojan: strconv.Atoi: parsing “”: invalid syntax,搜了一下,这个问题好像讨论的不多。

docker各种不好使,但是应该是我使用的不对。最终在服务器上直接装的。

先到发布文件页面下载文件https://github.com/v2rayA/v2rayA/releases,我下载了linux的运行文件和rpm文件,最终使用的rpm文件。

然后使用命令 sudo yum install installer_redhat_x64_2.2.7.4.rpm 安装了下载的rpm包。

systemctl start v2raya 启动服务

systemctl enable v2raya 设置为开机启动

到服务器网络策略里,把2017的端口放开。访问ip:2017,发现服务没正常启动,去服务器的/var/log/v2raya.log里去看日志,发现在在在下载必要的文件“downloading missing geoip.dat and geosite.dat”。但是因为当前服务器还没代理,这些文件也下载不下来。

https://github.com/v2fly/geoip/releases/latest/download/geoip.dat

我把之前用docker启动时候运行时创建的文件给复制到对应的下载目录去了,启动,可以正常启动了

通过浏览器访问管理页面,正常。再选中线路,然后启动,又报错了:

Failed to start: main/commands: failed to load config: [/etc/v2raya/config.json] > infra/conf/rule: invalid field rule > infra/conf/rule: failed to load geoip: private > infra/conf/geodata/memconservative: failed to decode geodata file: geoip.dat > infra/conf/geodata/memconservative: country code private not found in geoip.dat

看起来有点像是我复制过来的文件有点问题。

终于,在重启服务的时候发现,/etc/v2raya下的文件都会被替换。config.json来自哪里还不确定,但是两个ip文件是来自/root/.local/share/v2ray 这里。把我自己下载的文件挪到这个目录来,重启,再次到管理页面点启动,OK了!

爬虫爬取某菠菜网站结果

查看网站,结果在外边没有,需要用正式用户或者游客身份登录之后才能拿到
登录之后,查看请求内容,发现只有一个get的请求是主要数据,但是整个是页面,不是单独的数据
摘出来链接:/member/dresult?lottery=AULUCKY5&date=*&table=1
写爬虫的时候需要替换这里的日期

用熟悉的语言,java写,因为后续还需要做成服务,做服务的时候,java也比较顺畅

使用原来写的httpUtil爬取,发现从网站拿来的header有的不能用,搜了一下,是http2里可以自定义的key,比如key使用冒号开头
// :method: GET
// :path: /member/dresult?lottery=AULUCKY5&table=1&date=2018-01-01
使用java自带的http请求会无法携带这些自定义的header
查资料,发现jdk8处理http2略微有些麻烦,直接使用支持http2的jdk版本比较方便。到oracle上去下载。下载了16.

下载成功之后,安装,整个环境的参数已经被修改,执行java -version 显示是jdk16了。

使用开发工具idea增加仓库,发现总是报无法识别的仓库地址。想了一下,好像是因为我idea比较老的原因。。。我的idea还是2017版的。。。

没办法,这个方法得放弃了。使用另外一种方式。

修改项目依赖,增加依赖okhttp3,当前环境使用的是jdk8,直接在仓库里找了个比较新的版本

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.1</version>
</dependency>


结果依赖的包怎么都引入不进来,根本没法实例化。
弄了半天仍然不行,忽然想到可能也是版本的原因。

去查了一下这个版本包发布的时间,确实是在jdk8之后很久,时间差距有点太大,可能是这个原因,切换一个比较老的版本试试。

找了个距离jdk8发布时间比较接近的版本,

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.11.0</version>
</dependency>


修改这个配置之后,OK了,可以实例化了。
写个公用点的方法,可以动态添加header

public static String getUrlContent(String urlStr, Map<String, String> headers) {
try {
Request.Builder requestBuilder = new Request.Builder().url(urlStr);
headers.forEach(requestBuilder::addHeader);
Request request = requestBuilder.build();
Response response = client.newCall(request).execute();
if (Objects.isNull(response)) {
throw new IOException("Response is null");
}
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
if (Objects.isNull(response.body())) {
throw new IOException("Response body is null");
}
return response.body().string();
}
catch (IOException io) {
System.out.println("获取URL资源异常!,URL :" + urlStr);
throw new RuntimeException("获取URL资源异常!URL " + urlStr);
}
}

把从浏览器里扒出来的header都写到代码里,然后写死一个地址,尝试请求一下
/member/dresult?lottery=AULUCKY5&date=2018-01-01&table=1

请求成功,但是显示的是乱码。从网上找资料,有的说把gzip这个header的这一项去掉,试试。

尝试成功,打印出来了需要的页面内容。

按照之前跟大佬交流时候的提议,建议在爬完一些网页之后,为了避免需要重新摘取里面的数据的时候,网页出现了变化,需要重新解析,所以第一次爬完之后就把所有的爬取下来的网页直接保存成文件,后续需要用的时候,直接拿这些文件用就行了,不需要再重新去爬取,还需要处理各种外部变化问题。

不过这次应对的网站比较简单,感觉不会有这么频繁的变化,先把数据爬下来再说。写入文件也就一步简单的操作,先写数据解析的部分。

一个人的hackson:study – php server

从极客学院上获取学习的内容。正好认证了手机有两天的vip,现在开始学习 Android项目开发实战:新闻客户端。
原来已经搭建好了php+Apache+mysql的环境,所以php的环境可以直接使用。省去很多麻烦事,视频上也省略了这部分内容。
根据视频,首先使用php环境作为服务端生成客户端所需要的json数据。当时搭建环境的时候php基本选择了最新的版本,按照视频里的教程,出现了一些deprecated的方法用法,根据网络资料对其进行修改,主要是mysql_connect相关的方法,如mysql_connect和mysql_query需要分别修改为mysqli_connect和mysqli_query方法,同时参数列表也不太一样。
其次,是php语法是较早之前的时候学的了,现在有些不熟悉,比如查询结果的遍历,和给数组赋值,对array函数印象不深,结果导致一开始就写了一个arr就完事,导致执行出错。对数组这块的操作仍然需要更加熟悉一点。
修正掉以上的内容之后,我的服务端能跟视频内一样返回一开始插入数据库的数据的json字符串了。继续。
 
至此,服务端返回新闻列表数据的部分已经完成。下一日志继续。