centos更新并部署chat-next-web

2023-12-05 18:42:18 随笔 随笔

服务器环境部署

更新yum源

yum update更新最新版的yum,从而保障后续更新都是最新版的内容

当然,如果我们在更新yum的时候出现以下错误

# sudo yum update(或者输入yum update时):
No packages marked for update

那么此时就需要我们先清除一下yum的缓存,然后再更新yum

# 按照以下步骤清除yum缓存
rm -rf /var/cache/yum/*
yum clean all
yum update -y

开始安装node、npm、n和yarn

  • 安装node稳定版本:
    • 安装npm管理器:yum install npm
    • 安装n工具:npm n install n -g
    • 用最新版n工具安装最新稳定版node.js:n stable
cd
wget http://ftp.gnu.org/gnu/glibc/glibc-2.38.tar.gz
tar xf glibc-2.38.tar.gz 
cd glibc-2.28/ && mkdir build  && cd build

# 升级GCC(默认为4 升级为8)
yum install -y centos-release-scl
yum install -y devtoolset-8-gcc*
mv /usr/bin/gcc /usr/bin/gcc-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc
mv /usr/bin/g++ /usr/bin/g++-4.8.5
ln -s /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++

# 升级 make(默认为3 升级为4)
wget http://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz
tar -xzvf make-4.4.1.tar.gz && cd make-4.4.1/
./configure  --prefix=/usr/local/make
make && make install
cd /usr/bin/ && mv make make.bak
ln -sv /usr/local/make/bin/make /usr/bin/make

cd ~/glibc-2.38/build

make all
yum whatprovides libstdc++.so.6
yum update -y libstdc++.x86_64

sudo wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip
unzip libstdc.so_.6.0.26.zip
cp libstdc++.so.6.0.26 /lib64/
cd /lib64

# 把原来的命令做备份
cp libstdc++.so.6 libstdc++.so.6.bak
rm -f libstdc++.so.6

# 重新链接
ln -s libstdc++.so.6.0.26 libstdc++.so.6

Centos7.x系统软件更新

首先先更新一下yum源

sudo yum update

如下图所示,看到 Complete! 表明已经更新完毕

1699367145003

nodejs环境搭建

这里建议按照我的方法,先单独解决环境变量,然后再安装指定版本的node.js

gcc安装&升级

首先就是先安装依赖包gcc,并且手动更新为最新版本

yum install -y gcc-c ++ make

1699368094941

这里的版本是不够我们使用的,所以我们需要升级gcc至9.3版本

# 升级到gcc 9.3:
$ yum -y install centos-release-scl
$ yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
$ scl enable devtoolset-9 bash
# 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
如果要长期使用gcc 9.3的话:

$ echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
$ source /etc/profile

然后重启一下服务器让更改生效

让我们执行一下:

$ gcc -v

如果出现以下红框内内容,那就代表更新成功

1699368664071

make4.3更新

执行下面代码,查看当前make版本

$ cd /usr/bin/  # 进入bin目录
$ make -v       # 查看bin目录下make版本

1699369470796

输入cd回到根目录开始更新,依次执行以下命令:

$ wget http://mirrors.ustc.edu.cn/gnu/make/make-4.3.tar.gz
$ tar -xzvf make-4.3.tar.gz 
$ cd make-4.3/
# 创建构建目录
$ mkdir build && cd build
# 安装到指定目录
$ ./configure  --prefix=/usr/local/make
$ make && sudo make install
# 创建软链接
$ cd /usr/bin/
$ mv make make.bak
$ ln -sv /usr/local/make/bin/make /usr/bin/make

让我们再次查看一下版本:

1699370063303

ok,这下gcc&make均更新完毕

安装glibc2.28

# 在线安装之前记得回到根目录
$ wget http://mirrors.ustc.edu.cn/gnu/libc/glibc-2.28.tar.gz
# 解压
$ tar zxf glibc-2.28.tar.gz
$ cd glibc-2.28
$ mkdir build && cd build
$  ../configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror
# 这步执行时间依赖你的配置,我反正用了大概30多分钟,建议开把游戏
$ make && make install
$ sudo make localedata/install-locales

在安装这个的时候,执行mkdir build && cd build的时候可能会遇到一个错误,这个错误及导致结果如下图红框所示

1699370776289

当然,这个问题很好解决,提示我们too old: bison compiler,那我们就去更新一下就行了

解决bison&compiler问题

先看看有没有这个文件,回到根目录

1699371035593

好吧,都没有,那就安装呗

yum install bison

1699371148341

同理,先看看有没有,没有就直接去下载

Loaded plugins: fastestmirror

当我们相同通过解决bison来解决compiler问题时:

yum install compiler

会遗憾获得一个新的报错Loaded plugins: fastestmirror

1699371978581

原因:

  • fastestmirror是yum的一个加速插件,这里是插件提示信息是插件不能用了。
  • 由于12 月 8 日,CentOS 开发团队在其官博宣布,CentOS 8 将在 2021 年底结束支持,CentOS 7 由于用户基数与用户贡献较多,因此会按照计划维护至生命周期结束即 2024 年 6 月 30 日,接下来一年会把重心放到 CentOS Stream 上。好多镜像都已经不能访问了

解决方法:

  • 修改插件的配置文件vi /etc/yum/pluginconf.d/fastestmirror.conf

    • 键盘点击i键,进入编辑模式,enabled = 1由1改为0,禁用该插件,然后按ESC退出编辑,输入:wq保存退出
  • 修改yum的配置文件vi /etc/yum.conf

    • 同理操作,不过这里是将plugins=1由1改为0,不使用插件,保存退出
  • 清除缓存并重新构建yum源

    • yum clean all
    • yum makecache

如果你试着安装compiler还是会出现错误提示,那么大概率是gcc版本太高导致,建议重装8.3版本,下面给出重装步骤

  • 比如These critical programs are missing or too old: compiler

这里给出两个gcc版本供选择,两个我都试过,均能解决问题

# 升级到gcc 7.3:
$ yum -y install centos-release-scl
$ yum -y install devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
$ scl enable devtoolset-7 bash
# 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
# 如果要长期使用gcc 7.3的话:
$ echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile

# 升级到gcc 8.3:
$ yum -y install centos-release-scl
$ yum -y install devtoolset-8-gcc devtoolset-8-gcc-c++ devtoolset-8-binutils
$ scl enable devtoolset-8 bash
# 需要注意的是scl命令启用只是临时的,退出shell或重启就会恢复原系统gcc版本。
# 如果要长期使用gcc 8.3的话:
$ echo "source /opt/rh/devtoolset-8/enable" >>/etc/profile

再次查看版本

1699376514252

成功切回8.3.1版本

解决问题后正式开始安装glibc

安装完毕,回到glibc里的build目录继续执行

$ cd glibc-2.28/build/
$  ../configure  --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin --disable-sanity-checks --disable-werror
# 下一步执行时间依赖你的配置,我反正用了大概30多分钟,建议开把游戏
$ make && make install

此时我们回退至gcc8.3.1版本后,就能正常执行上面的步骤了,然后开始执行make && make install,半小时后见

make完后,可能会出现如下图的错误提示,无须担心,正常现象

1699411709118

最后执行一下

$ sudo make localedata/install-locales

等待完毕,查看一下

1699412413508

node.js安装

使用wget命令下载Node.s的压缩包。我们可以从官方网站上找到最新版本的Node.js,并复制其下载链接。例如,如果这里想下载版本v18.17.0,可以使用以下命令:

wget https://nodejs.org/dist/v18.17.0/node-v18.17.0.tar.gz

下载完成后,解压缩Node.is压缩包。可以使用以下命令

tar -xvf node-v18.17.0.tar.gz

进入解压后的目录

cd node-v18.17.0

接下来,使用以下命令进行配置和编译:

./configure
make

扁译完成后,使用以下命令进行安装

sudo make install

安装完成后,您可以使用以下命令验证Node.js是否成功安装

node -V

如果成功安装,将显示Node.js的版本号

此外,安装nodejs的时候也会安装npm

npm -V

当然,我们最好再安装一个管理nodejs各版本的n管理器

npm install n -g

最后结果为下面内容

[root@iZ0jl9sgt76d4mky0e0bs4Z ~]# node -v
v18.17.0
[root@iZ0jl9sgt76d4mky0e0bs4Z ~]# npm -v
9.6.7

[root@iZ0jl9sgt76d4mky0e0bs4Z ~]# npm install n -g

added 1 package in 4s

[root@iZ0jl9sgt76d4mky0e0bs4Z ~]# n -V
v9.2.0

安装yarn

设置Yarn仓库:

curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo rpm --import https://dl.yarnpkg.com/rpm/pubkey.gpg

添加存储库后,通过运行以下命令来安装Yarn:

sudo yum install yarn
或者(两者区别就是前者安装需要自己手动yes,后者给你自动yes了)
sudo yum install -y yarn

最后查看一下是否安装完毕

yarn -V

出现红框内容表示已经安装了最新版的yarn了

1699457318427

项目宝塔部署

下载源项目

还是老规矩,先到项目地址,登录Github,然后下载即可,这个方法虽然不是那么极客,但是简单啊~

1699462056830

配置宝塔面板

我这里使用的是centos7.9的系统,其余操作系统请自行百度

前往宝塔下载官网,然后复制红框内链接

1699462208029

前往服务器终端进行安装

安装完毕后保留下面框内的信息

1699462282487

其中外网面板地址就是我们的访问地址,密码账户就是默认初始登录信息

点击外网地址进入宝塔面板后,输入账号密码登录(无法访问面板那就是没放行安全组,去你购买云服务器的安全组放行端口即可)

然后按提示安装LNMP套件即可

1699462424177

安装完成后,就进入了部署阶段

开始部署

这里域名如果有自己的就可以填自己的,没有就填服务器公网ip即可

如果你填自己的域名,那么可以再看看后面的反向代理,通过反向代理你就能用你绑定的域名直接访问你的网站了

1699462662350

然后将下载好的源码上传到宝塔面板文件夹中,并解压缩

1699462737604

然后打开解压后的文件夹,新建一个.env文件,在里面填入你的环境变量,如下:

OPENAI_API_KEY=sk-XXX
CODE=XXX, YYY, ...
BASE_URL=https://api.openai.com/

保存并退出文件,然后点击终端(或者手动进入该项目目录下)

在这个项目目录下输入:

yarn install  # 安装所需模块
yarn dev      # 调试项目
yarn build && yarn start    # 构建并运行项目

如果构架运行项目给你提示:

Warning: For production Image Optimization with Next.js, the optional 'sharp' package is strongly recommended. Run 'yarn add sharp', and Next.js will use it automatically for Image Optimization.

那就执行yarn add sharp后,再构建运行项目

安装完成后,你就可以访问 http://你的服务器IP地址:3000 来访问NextWeb啦!

反向代理到域名

如果要直接使用域名来访问项目,你还需要将 docker 项目反向代理到域名,你首先需要将域名解析指向到服务器,比如你要用 chat.xxx.com 作为网站入口,那么应该在域名服务商那边添加解析,这里的记录值填你自己服务器的IP地址

这里补充一个示例

1699508145209

然后点开 设置,SSL,先申请一个 Let’s Encrypt 的免费证书,顺便把强制 HTTPS打开

1699508214267

当然如果你自己有证书,也可以用自己的,什么?你问我怎么获取证书?当然是去你买的服务器厂商哪里白嫖啊,如何白嫖请自行百度,这里不做赘叙

1699508426963

然后点击反向代理,添加一个反向代理,目标URL填入:http://127.0.0.1:3000 或者Docker中实际显示的地址

1699508643930

然后点开反向代理的配置,将下面这段代码去掉注释输入进去,保存,实现流式传输

# 不缓存,支持流式输出​
        proxy_cache off;  # 关闭缓存​
        proxy_buffering off;  # 关闭代理缓冲​
        chunked_transfer_encoding on;  # 开启分块传输编码​
        tcp_nopush on;  # 开启TCP NOPUSH选项,禁止Nagle算法​
        tcp_nodelay on;  # 开启TCP NODELAY选项,禁止延迟ACK算法​
        keepalive_timeout 300;  # 设定keep-alive超时时间为65秒

如下图所示

1699508740713

然后你就能通过你的域名访问网站了

反向代理产生的一些问题

当反向代理后,我们可能会发现,https://域名访问网站时会提示504访问超时,用http://域名也会提示超时,只有用http://域名:端口 或者 域名:端口的形式才能通过域名访问网站

这个问题本质是反向代理后的转发url错误,在我们前面反向代理本地http://url:端口后,里面的配置文件也是最开始填的默认的http://url:端口

但是我们现在转发代理的是域名而不是原来本地服务,所以我们就需要去配置文件中将这部分进行修改

如下图所示点击配置文件

1699507154547

将原本代理url改为你自己的http://网站域名:端口的形式,其余不变保存退出

1699507289403

然后手动或者在宝塔这里点击重载即可

1699507424184

这下你就可以直接同域名访问网站,并且安装SSL证书自动转换为https安全访问

1699507827661

CloudFlare worker搭建 OpenAI 反向代理

反向代理搭建

很多小伙伴可能会使用香港的服务器部署,或者在国内部署(别在国内部署!),任何无法直连到 OpenAI 官网的服务器,都需要一个反向代理,这里提供个最简单的反向代理配置方案,免费!

你需要准备:​

  1. 一个 CloudFlare 账号​
  2. 一个域名,最好是绑定到 CloudFlare 的域名

CloudFlare 账号就不多说了,自己注册就行,反正也有中文界面。登录之后,点击Workers,点击创建服务

1699514215659

然后点击配置

1699514315292

点击快速编辑,将下面这段代码复制下来,粘贴到编辑区域,保存并部署即可:

1699514375705

udda

async function handleRequest(request) {
  const url = new URL(request.url)
  const fetchAPI = request.url.replace(url.host, 'api.openai.com')

  // 添加跨域处理
  const corsHeaders = {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Methods': 'OPTIONS',
    'Access-Control-Allow-Headers': '*',
  };
  if (request.method === 'OPTIONS') return new Response(null, { headers: corsHeaders });

  return fetch(fetchAPI, { headers: request.headers, method: request.method, body: request.body })
}

addEventListener("fetch", (event) => {
  event.respondWith(handleRequest(event.request))
})

1699514454439

域名绑定至cloudflare

完事儿以后你还需要绑定一个自己的域名,方便国内访问,这个域名需要首先绑定到 cloudflare

1699514723922

需要准备以下几样东西:

  • 有独立IP的服务器(比如我的是阿里云ESC)
  • 拥有控制权的域名
  • Cloudflare 账号

以上几样缺一不可,准备好了就可以开始设置了

1. 添加站点:

1699515210427

2. 选择一个免费的方案:

1699515280575

3. 检测已有 DNS 记录,这里 Cloudflare 会把能检索到的 DNS 记录都列在下面,这里我们先不用管,直接下一步:

1699515361656

4. 替换 DNS 服务器地址,先记录下来 Cloudflare 让我们替换的内容,然后再根据提示去云服务器厂商哪里替换:

1699525082693

1699515547355

1699515583560

1699525124220

1699525851987

至此,需要设置的内容已经基本完成,剩下的就是等待…..48小时…慢慢等吧

先回 Cloudflare,点击下面的「Check nameservers」,当然,如果你之前已经把页面关了,也无所谓,因为这个就是个跳转,会跳转到当前域名的 overview 页面,如下图:

1699526001999

然后添加二级域名,如果提示你已经存在,那就是因为你之前在阿里云已经设置了这个二级域名,你只需要把原来的删除,然后重新在这里创建即可

1699526794324

然后就是漫长的等待,等到cloudflare给你发邮件提示即可

最后,将ChatGPT-Next-WebBASE_URL环境变量改成你的直连域名即可(可包含 https 或者 /)

需要注意的是,这个绑定的域名只能用作代理,不能拿来当做项目域名使用!!!如果要给项目绑定一个域名,那么就需要正常解析一个域名,然后再将这个新的域名反向代理绑定docker项目或本地项目!!!

问题解决

error Failed to start server

当我们使用yarn build && yarn start,执行到yarn start时提示下面这个错误

- error Failed to start server
Error: listen EADDRINUSE: address already in use :::3000
    at Server.setupListenHandle [as _listen2] (node:net:1751:16)
    at listenInCluster (node:net:1799:12)
    at Server.listen (node:net:1887:7)
    at /www/wwwroot/chat.aomanoh.com/node_modules/next/dist/server/lib/start-server.js:153:16
    at new Promise (<anonymous>)
    at startServer (/www/wwwroot/chat.aomanoh.com/node_modules/next/dist/server/lib/start-server.js:134:11)
    at nextStart (/www/wwwroot/chat.aomanoh.com/node_modules/next/dist/cli/next-start.js:77:40) {
  code: 'EADDRINUSE',
  errno: -98,
  syscall: 'listen',
  address: '::',
  port: 3000
}

这个就是因为端口已经被占用,所以我们只需要kill掉占用端口的进程即可

# 查询进程
$ udo lsof -i :被占用端口
$ kill 进程PID

# 如下面这个例子
$ sudo lsof -i :3000
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 2185 root    4u  IPv4  28575      0t0  TCP *:hbci (LISTEN)
$ kill 2185

然后执行yarn start就不会再提示问题了

域名无法反代使用问题

当我们想反代域名,然后通过域名访问docker部署的项目时,我们会访问进入这个页面:

我们通过worker将chat.aomanoh.com作为chat.openai.com的反代域名后,重新在DNS解析一个新的https域名,然后再宝塔反向代理本地端口,就能通过这个新的域名访问docker部署项目


上一篇:博客更新日志
下一篇:HBuilder打包app