本文最后更新于:2024年5月7日 下午
一言是很酷的中二短句生成平台,近来应该是访问量太大,服务器加入了一些限制,稍微有较大访问频率时便会报错,而针对这个问题一言提供了实例部署的方案解决,本文记录实现过程。
一言
用代码表达言语的魅力,用代码书写山河的壮丽。
一言是创建于 2016 年的项目,起初是用于个人目的。目前已经转为公益项目,由萌创团队运营,为大家提供服务。 所谓一言(ヒトコト),即一句话。这句话可以是传达了感动,可以是博人一笑,可以是发人深思。总之,一言,代表着言语的触动,灵魂的交流。
问题复现
近来对一言的语句接口访问稍微频繁一点(大概10秒内访问三五次)便会被屏蔽一段时间:
1 Access to XMLHttpRequest at 'https://v1.hitokoto.cn/' from origin 'https://www.zywvvd.com' has been blocked by CORS policy : No 'Access-Control-Allow-Origin' header is present on the requested resource.
不爽归不爽,但还是开心一言这个公益项目有这么多的访问量。
解决方案
https://developer.hitokoto.cn/sentence/deploy.html
一言官方自 v1.5.0
可以部署自己的实例,这个方案十分适合访问量大,站点私密性高的需求。为了方便隔离环境,我们直接使用 Docker 实现部署。
Docker 容器创建
在自己的服务器上床一个文件夹 hitokoto
,写入 docker-compose.yml
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 version: '3' networks: hitokoto_api: driver: bridge services: hitokoto_api: networks: - hitokoto_api image: hitokoto/api:release container_name: hitokoto_api hostname: hitokoto_api environment: NODE_ENV: production url: https://v1.hitokoto.cn api_name: vvd-hitokoto requests.hosts: "['v1.hitokoto.cn','international.v1.hitokoto.cn', 'api.a632079.me', 'api.hitokoto.cn', 'sslapi.hitokoto.cn']" redis.host: redis redis.port: 6379 ports: - 8000 :8000 links: - redis restart: always volumes: - ./etc/api:/usr/src/app/data redis: networks: - hitokoto_api image: redis restart: always container_name: redis hostname: redis volumes: - ./etc/redis.conf:/etc/redis/redis.conf - ./data/redis:/data command: redis-server /etc/redis/redis.conf
这里和官方提供的稍有不同,根据个人需求自己调整
之后就可以部署了:
如果有如下输出说明容器创建成功:
1 2 3 docker-compose up -d Recreating redis ... done Recreating hitokoto_api ... done
接口测试
测试地址:
1 2 127.0.0.1:8000 localhost:8000
如返回如下格式信息说明部署成功:
也可以在浏览器直接输入上述两个地址
1 2 $ curl localhost:8000 {"id" :7891 ,"uuid" :"7447ee12-e574-4984-8bd5-6d3b64d5beae" ,"hitokoto" :"若你困于无风之地,我将奏响高天之歌。" ,"type" :"c" ,"from" :"原神" ,"from_who" :"温迪" ,"creator" :"神在白天做梦" ,"creator_uid" :12651 ,"reviewer" :1 ,"commit_from" :"web" ,"created_at" :"1658136015" ,"length" :18 }
注意 :在刚刚部署完的几分钟内,测试接口报错 curl: (56) Recv failure: Connection reset by peer
或 curl: (52) Empty reply from server
都是正常的,应该是他在初始化个啥,得等一会才好使。
反向代理
Nginx 反向代理成 带证书的 https 接口,暴露给公网:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 server { listen <port> ssl; listen [::]:<port> ssl; ssl_certificate /ssl/uipv4.zywvvd.com.crt; ssl_certificate_key /ssl/uipv4.zywvvd.com.key; location / { proxy_set_header X-FORWARDED-FOR $remote_addr ; proxy_set_header X-FORWARDED-PROTO $scheme ; proxy_set_header Host $http_host ; proxy_pass http://<ip:port>; } }
Fluid 使用自建接口
所以我现在自建的一言接口: https://uipv4.zywvvd.com:33044/
将这个接口替换掉 _config.fluid.yml
文件中的 原始一言 接口 “https://v1.hitokoto.cn/ ” 可以平替功能的同时实现没有限制的访问。
如果你的网站调用 一言,访问量不那么大 的话可以用我这个试试看 ~
参考资料
文章链接:
https://www.zywvvd.com/notes/hexo/theme/fluid/fluid-hitokoto-deploy/hitokoto-deploy/