# V8微服务POC环境部署示例

# 适用场景

本手册适用于:

1、客户环境POC,需要看到V8微服务架构的部署效果,不需要做压力测试,只需要最小服务器配置能启动、能演示 2、V8运维新人练手环境,练习部署V8云原生微服务架构环境,用尽量低的配置部署V8所需服务并且安装启动系统

本手册仅部署开发环境,不涉及多套环境部署和推送联调(众所周知,真正的V8生产系统一般要2套)。

# 前期准备

在部署前,必须掌握以下知识:

1、系统性掌握V8平台部署的理论知识:了解部署架构、了解平台部署所需组件、了解每个组件的作用和资源测试规则、了解整体部署顺序《V8环境规划和安装部署指南 (opens new window)》 2、具备部署V8所需所有中间件和容器能力,个人已经多次反复完成相关依赖组件的部署,参考资料 《快速部署V8所需中间件参考 (opens new window)》 3、提前确定部署目标服务器信息、提前准备V8相关制品工具

# POC环境准备

POC环境资源配置推荐如下:

  • 1台4C/8G/100G数据盘:部署K8S Master
  • 2台16C/64G/500G数据盘(或1台32C/128G/500G数据盘):部署K8S Worker
  • 1台16C/64G/500G数据盘:部署V8所有中间件(MySQL、Nacos、Redis、Kafka、Nginx、ElasticSearch、ClickHouse、Harbor、GitLab、MinIO、NFS)

# 系统参数调整

在进行安装部署前,先按照如下配置优化Linux相关系统参数:

1、(修改Linux网络参数)通过 vim /etc/sysctl.conf 命令在文件末尾添加:

net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
# 非常关键:命令调整可创建的最大虚拟内存区域的数量
vm.max_map_count=262144

然后执行命令重启网络服务:

service network restart
# 如上一条命令不可用,可能是不同Linux发行版差异,尝试换一个命令重启
systemctl restart NetworkManager

2、通过 vim /etc/rc.d/rc.local 命令在文件末尾添加:

echo "30">/proc/sys/net/ipv4/tcp_fin_timeout
echo "1800">/proc/sys/net/ipv4/tcp_keepalive_time
echo "0">/proc/sys/net/ipv4/tcp_window_scaling
echo "0">/proc/sys/net/ipv4/tcp_sack
echo "0">/proc/sys/net/ipv4/tcp_timestamps

3、(修改Linux最大进程数最大文件打开数)通过 vim /etc/security/limits.conf 命令编辑此文件添加以下内容:

# open files  (-n)
* soft nofile 65535
* hard nofile 65535
# max user processes  (-u)
* soft nproc 65535
* hard nproc 65535

以上配置完成后,执行reboot重启操作系统,随后通过 ulimit -a 命令检查open files是否变成65535。

4、关闭SELINUX(如未操作可能systemctl管理中间件不生效):

# 执行如下命令永久关闭SELINUX
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
# 重启生效
sudo reboot

5、如果是麒麟系统,并且当前环境需要安装Docker,必须卸载麒麟系统自带的podman模块,执行 yum remove podmanapt remove podman 即可(哪个成功就用哪个),不做本步骤,后续部署Docker应用会失败!

# 中间件部署和参数准备

# ClickHouse参数准备

ClickHouse服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

  • ClickHouse地址
  • ClickHouse数据库名称
  • ClickHouse用户名
  • ClickHouse密码

如使用开放平台工具部署ClickHouse,在安装完成时,会输出一段日志“部署V8时在nacos的cdp-data中关于clickhouse的配置”,取日志下面的地址、数据库名、用户名、密码填写即可。

1757596639480.png

# Nacos参数准备

Nacos服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

1、Nacos的HTTP访问地址,一般是 http://Nacos服务器IP:8848。如果使用开放平台工具部署Nacos,端口在install-nacos.sh文件中已经提前设置。

2、Nacos的管理帐号密码,Nacos安装后必须通过浏览器访问 http://Nacos服务器IP:8848/nacos ,然后 nacos/nacos 登录修改成复杂密码。如果使用开放平台工具部署Nacos,密码在install-nacos.sh文件中已经提前设置。

3、命名空间不需要创建,V8工具初始化时自动完成

1757413655583.png

# Harbor镜像仓库准备

Harbor服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),Harbor是在Docker容器中运行,部署完成需要准备V8工具初始化时需要的信息:

1、Harbor镜像仓库的HTTP访问地址、Harbor的管理帐号密码,如果使用开放平台工具部署Harbor,以上信息记录在工具的 doc/apps-deployment-summary.txt

2、准备镜像仓库名称:通过浏览器访问Harbor,手动创建一个项目名称,如 seeyon-dev,V8工具后续需要使用

1757414179389.png

1757414492025.png

# MySQL数据源准备

MySQL服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

1、数据源地址:即数据库服务器IP 2、数据源端口:即数据库开放端口 3、用户名密码:需要创建数据库、表、索引等权限的帐号

如使用开放平台工具部署MySQL,端口、帐号、密码、程序路径信息记录在logs目录的script.log。

1757415490012.png

# Redis分布式缓存准备

Redis服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

1、Redis地址:Redis服务器IP和端口,如使用开放平台工具部署Redis,install-redis.sh安装脚本中指定了安装端口号,安装结束输出日志也有端口信息

2、密码:Redis的连接密码,如使用开放平台工具部署Redis,install-redis.sh安装脚本中指定了初始化密码,安装结束输出日志也有密码信息

1757415589020.png

# NFS安装准备

Kubernetes容器平台依赖外部存储挂载,需要准备足够的磁盘空间并安装NFS服务。 如POC环境,在中间件服务器安装NFS Server并暴露挂载路径,然后在K8S Worker节点安装NFS客户端组件。安装示例如下:

1、NFS服务器更新软件源,安装依赖:

# Debian及其衍生发行版(如Ubuntu)运行如下命令
sudo apt update && sudo apt upgrade -y
sudo apt install nfs-kernel-server -y

# RedHat体系(如CentOS)使用yum或dnf作为包管理工具
sudo yum update -y
sudo yum install nfs-utils -y

2、NFS服务器,创建共享目录。假设需要暴露的共享目录是 /data/mnt/share

# 创建共享目录:
sudo mkdir -p /data/mnt/share
# 设置目录权限:
sudo chmod 777 /data/mnt/share
NFS服务器:配置 NFS 共享:

# 打开/etc/exports配置文件
sudo nano /etc/exports
# 在/etc/exports配置文件中添加共享权限:注意/data/mnt/share对应NFS共享目录
/data/mnt/share *(rw,sync,no_root_squash)

# 上一步保存后,再执行如下命令,将上一步保存的信息刷新到NFS服务中,使NFS生效
sudo exportfs -a

3、NFS服务器,启动NFS服务:

# 启动 NFS 服务:
sudo systemctl start nfs-server

# 设置开机自启:
sudo systemctl enable nfs-server

#检查 NFS 服务状态:
sudo systemctl status nfs-server

4、NFS服务器,根据实际情况开启防火墙放行,确保K8S所有节点都能访问到共享目录。

sudo firewall-cmd --permanent --add-service=nfs
sudo firewall-cmd --permanent --add-service=rpc-bind
sudo firewall-cmd --permanent --add-service=mountd
sudo firewall-cmd --reload

5、所有K8S Worker节点安装NFS客户端组件,安装后无需配置K8S,后续V8安装工具会自动配置Kubernetes Pod 挂载 NFS。

# Debian及其衍生发行版(如Ubuntu)运行如下命令
sudo apt update && sudo apt upgrade -y
sudo apt install nfs-common -y

# RedHat体系(如CentOS)使用yum或dnf作为包管理工具
sudo yum update -y
sudo yum install nfs-utils -y

# K8S容器平台准备

Kubernetes容器平台服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

1、持久化存储配置:挂载方式NFS,地址和路径对应上一章节“NFS安装准备”的信息

2、Nacos地址:对应“Nacos参数准备”章节的信息,格式为Nacos服务器IP和端口

3、K8S Maser相关信息:K8S地址、用户名、certificate-authority-data、client-certificate-data、client-key-data等信息全部通过 /root/.kube/config 配置提取:

# 在K8S Master节点执行如下命令获取相关配置信息:
more /root/.kube/config > /home/k8s.txt
cat /home/k8s.txt

参考如下输出示例信息:

  • server: https://192.168.0.235:6443 中的信息对应K8S地址,注意协议是HTTPS
  • 命名空间:自定义
  • user: kubernetes-admin 中的信息对应用户名
  • certificate-authority-data 中的完整字符串对应CertificateAuthorityData
  • client-certificate-data 中的完整字符串对应ClientCertificateData
  • client-key-data 中的完整字符串对应ClientKeyData
# 以下信息为输出示例,仅供参考:
[root@k8s-m1 ~]# more /root/.kube/config > /home/k8s.txt
[root@k8s-m1 ~]# cat /home/k8s.txt
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURCekNDQWUrZ0F3SUJBZ0lJTENuaVNFSmQzMUV3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWdGdzB5TlRBNU1EUXhNRE0zTVRCYUdBOHlNVEkxTURneE1URXdOREl4TUZvdwpGVEVUTUJFR0ExVUVBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDCkFRb0NnZ0VCQU5iamQ0VUlxOWlzakVTekxyWDF4YkhJbDdTdjhEOUlLNmNYOXorRWlTT0RBYjl4dVpyeUVPQTgKZG5yVG05REc4Y1pBVWgrOG9LaVJMeXFCR3VNeHpGeWx1NkFTdUNSeVk2dmFsRmZFVjFkNDY4czd3L2Y3bQdHFYK2NnOEpaeVpNQzFJRS83SHMKc3gxNWlGQU1vK3FaVEEwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    server: https://192.168.0.235:6443
  name: k8s-cluster
contexts:
- context:
    cluster: k8s-cluster
    user: kubernetes-admin
  name: kubernetes-admin@k8s-cluster
current-context: kubernetes-admin@k8s-cluster
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLekNDQWhPZ0F3SUJBZ0lJUXdTZnl1YnB6bll3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWdGdzB5TlRBNU1EUXhNRE0zTVRCYUdBOHlNVEkxTURneE1URXdOREl4TUZvdwpQREVmTUIwR0ExVUVDaE1XYTNWaVpXRmtiVHBqYkhWemRHVnlMV0ZrYldsdWN6RVpNQmNHQTFVRUF4TVFhM1ZpClpYSnVaWFJsY3kxaFpHMXBiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNV0kKd0FUbmc2VGQwd3Zac09HM1ZTMEN0a2s0RFVISnJPQjM5VHE2QUxHUlJCdVlXVXRGN3dWNkZWcGVMMXNGSRQm5nZHhsVUdsU3hDd0ZPOGlBVkEKM002K2pZbnNzUllhRTZ6TFBlQkprZU91S2tsY1lXMC9hd3VOckJOemZzVlE2V1FiUXVubHd2MlZ6NGhiQkUwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBeFlqQUJPZURwTjNUQzltdzRiZFZMUUsyU1RnTlFjbXM0SGYxT3JvQXNaRkVHNWhaClMwWHZCWG9WV2w0dld3VWphQ2I0Tk4vQ2NEVHRHNUxKa05YQUpwZ2hmUk9ZbUFvbHYyUnllUzU5dm5wZThwSzUKRzJzM2xyc0RoNkNRUGRvTnJ2MllRdER3enA1WlZsdFd2ZEt0ZVllcUJHQU1wYUVnVU9mbUVta0dRUUtvNVJnOQp2L3ZVTWx4aXFtR084OXRXay9iYnJPNEc5MWd4YmxDcEd4ZGVna1ZmQ3h5Y25qMVRvNy9leFNpT24yVGVUVEhqCk52SjBiYUxxRHpyNTZITzNSd3d1ZTIvbTVQQnczalNscEIxNUYvVTN5ZTNmeU5DbEtRN2w3VGl6TZNUUZvSjlTZDJHMWRsdUhjeEE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=

1757415971589.png

# MinIO对象存储准备

MinIO服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

如使用工具部署MiniIO,脚本目录下document/v8-minio.txt存放了工具自动安装的桶信息,脚本目录下document/deploy-minio.info存放了minio的http和api访问地址及帐号密码。

  • access-key-id:对象存储用户名,需要具备桶创建、读写权限
  • access-key-secret:对象存储密码
  • api-endpoint:对象存储HTTP访问地址
  • access-endpoint:同上,对象存储HTTP访问地址
  • 公共桶名称:自定义,如 seeyon-public ,无需在对象存储服务中提前创建桶,V8安装工具会自动创建
  • 私有桶名称:自定义,如 seeyon-private,无需在对象存储服务中提前创建桶,V8安装工具会自动创建
  • 摆渡桶名称:自定义,如 seeyon-ferry,无需在对象存储服务中提前创建桶,V8安装工具会自动创建

1757416335026.png

# Kafka消息中间件准备

Kafka服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

消息服务地址:对应Kafka服务IP和端口,如采用工具部署Kafka,通过部署脚本目录下doc/apps-deployment-summary.txt文件查看主机IP和端口

1757416397187.png

# Gitlab准备

Gitlab服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

  • Gitlab地址:对应Gitlab服务http访问地址
  • 用户名密码:对应Gitlab管理员帐号密码
  • privateTokenValue:需要管理员通过http访问Gitlab服务,头像菜单 → Preferences(或 Edit profile)→ Access Tokens(个人令牌)页面,创建Access tokens,权限勾选api、read_api即可
  • 代码群组:无需修改,使用默认值

如使用开放平台工具部署Gitlab,工具目录的 doc/apps-deployment-summary.txt 文件存储了安装部署连接信息、管理员帐号密码、服务的启停维护信息

1757416554164.png

Gitlab创建Access tokens:

1757416137127.png

# ElasticSearch准备

ElasticSearch服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

  • 搜索引擎地址:对应ES服务器IP和端口
  • 用户名密码:对应ES访问帐号密码

如使用工具部署ES,记住安装结束后的输出日志“检查服务健康状态”里面的curl命令有帐号密码和连接HTTP地址。

也可以通过install-elfk.sh安装脚本配置获取搜索引擎端口配置,通过同级目录的es-password.txt获取ES的帐号密码。

1757416487138.png

# Nginx配置准备

Nginx服务自行部署(如参考 《快速部署V8所需中间件参考 (opens new window)》),部署完成需要准备V8工具初始化时需要的信息:

在V8安装配置阶段可以先不维护nginx.conf配置,等V8安装部署完成,再获取K8S的访问地址,配置更新nginx.conf也不迟。

在V8安装配置阶段,只需要先预设NG的访问地址,后续通过此地址能访问到V8系统。

1757416037492.png

# 其它:V8帐号密码配置

在使用V8安装工具部署应用时,需要设置系统管理员的密码,这个根据项目情况自定义即可。

1757415558195.png

# 设置信任私库Harbor

Docker 默认在从镜像仓库(Registry)拉取或推送镜像时要求 HTTPS/TLS 安全连接(即必须有合法的 SSL 证书)。

如果仓库启用了自签名证书,或者是纯 HTTP(没有 TLS),默认情况下 Docker 会因为 不安全 拒绝连接,出现类似错误:

Error response from daemon: Get "https://192.168.0.168:30280/v2/": x509: certificate signed by unknown authority
或者
http: server gave HTTP response to HTTPS client

1757572307517.png

在V8安装部署前,为防止因为拉取或推送镜像报错,需要在K8S容器运行时和V8工具所在Docker容器环境配置相关参数:

修改点一:Docker容器环境 vim /etc/docker/daemon.json,其中insecure-registries增加 Harbor的IP和端口:比如192.168.0.168:30280,完成配置后重启使配置生效。

1757416214819.png

修改点二:K8S Master和Worker均增加允许非安全访问配置,如果使用开放平台工具部署K8S,默认为Containerd容器运行时,containerd默认要求仓库必须是安全连接(HTTPS & 有效证书),否则会拒绝访问。为了解决非安全访问问题,需要参考如下命令:

# certs.d下创建一个专门存放 containerd 针对 192.168.100.213:30280 这个Harbor镜像仓库配置的目录
mkdir -p /etc/containerd/certs.d/192.168.100.213:30280

# 创建hosts.toml文件,定义镜像仓库的HTTP请求信息
cat > /etc/containerd/certs.d/192.168.100.213:30280/hosts.toml << 'EOF'
server = "http://192.168.100.213:30280"
[host."http://192.168.100.213:30280"]
  capabilities = ["pull", "resolve", "push"]
  skip_verify = true
EOF

# 运行V8安装工具

在完成中间件和K8S容器的部署和初始化准备后,进行V8应用部署:V8标准推荐使用安装工具可视化部署。

1、首先获取最新版本的出盘工具,按需下载符合当前系统架构的“安装程序”:

1757595566800.png

2、解压安装程序,再参考 《AI-COP A9 领航版 V5.0 安装部署手册(微服务) (opens new window)》 的 “3.首次使用安装工具的初始化配置” 章节进行工具的部署初始化。

3、然后浏览器访问工具,再按照手册进行初始化,POC环境可以将环境定义为“开发环境”。

4、剩下就参考部署手册和安装部署视频进行初始化即可。

5、关于部署包的自动扫描:比如要部署平台包,首先是选择合适的CPU架构以及中间件,然后是下载出盘工具中列出的所有平台包,再严格按照安装部署视频中的解压方法解压。

1757597224474.png

# V8安装完成后配置nginx.conf

V8安装完成后,到K8S Master节点,执行 kubectl -n seeyon-dev get svc 命令获取V8 webapi和openapi端口(命令中的seeyon-dev对应前面配置的空间)。

如下图示例:webapi对应30000端口,openapi对应30001端口,使用K8S Master的服务器IP加对应端口即可访问系统。

1757509300825.png

下一步是配置Nginx,让Nginx能代理到K8S的webapi和openapi:

1、备份原始nginx.conf,然后新建一个新的nginx.conf,将如下内容粘贴进去:

如下配置主要提供了82的监听端口做监控检查,并且引入了扩展文件conf.d/*.conf,其中V8的webapi和openapi在扩展文件中定义

user  nginx;
worker_processes  4;  #定义nginx子线程数,根据服务器cpu配置

error_log  logs/error.log; #定义error日志输出
pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections 65535;
    multi_accept on;
}

http {
    #prometheusa监控参数
    vhost_traffic_status_zone;
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	        '$status $body_bytes_sent "$http_referer" '
	        '"$http_user_agent" $http_x_forwarded_for '
	        '"$upstream_addr" "$upstream_status" "$upstream_response_time" "$request_time"';
    access_log  logs/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    #keepalive_timeout  65;
    gzip  on;
    #最小压缩文件大小
    gzip_min_length 1k;
    #压缩缓冲区
    gzip_buffers 32 4k;
    #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)
    #gzip_http_version 1.0;
    #压缩等级
    gzip_comp_level 6;
    #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。
    gzip_types text/plain application/json application/javascript text/css application/xml text/javascript;
    #选择支持vary header,可以让前端的缓存服务器缓存经过gzip压缩的页面;
    gzip_vary on;
    resolver 100.125.1.250;
    server_names_hash_bucket_size  256;
    server_tokens off;
    client_max_body_size 50m;
    map $http_upgrade $connection_upgrade {
        #default keep-alive;
        default upgrade;
        #'websocket' upgrade;
        '' close;
    }

	# 健康检查片段
    server {
        #listen 443 ssl default_server;
        listen 82 default_server;
        server_name _;
        keepalive_timeout 300;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        #ssl_certificate "cert/6529988__seeyonv8.com.pem"; #替换ssl证书pem
        #ssl_certificate_key "cert/6529988__seeyonv8.com.key"; #替换ssl证书key
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        #ssl_prefer_server_ciphers on;
        access_log off;
        location = /-/health {
            return 200 'ok';
        }
        location / {
            return 403;
        }
        location /metrics {
            vhost_traffic_status_display;
            # 接口地址 /metrics
            vhost_traffic_status_display_format prometheus;
        }
    }

	# V8 openapi、webapi配置片段
    include conf.d/*.conf;
}

2、到conf.d目录下一层级新建一个维护v8的配置 vim v8.conf,将如下内容粘贴进去并按需修改带#号注释说明部分:

# 定义V8 webapi代理信息
server {
    listen 80;
    server_name _;
    keepalive_timeout 300;
    client_header_buffer_size 128k;
    large_client_header_buffers 4 8k;
    proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置
    proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)
    proxy_temp_file_write_size 2048k;#设定缓存文件夹大小,大于这个值,将从upstream服务器传
    access_log logs/frontend_access.log main;
    client_max_body_size 500M;
    add_header 'Access-Control-Allow-Origin' $http_origin;
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
    add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,X-XSRF-TOKEN,Cookie,Set-Cookie,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
    add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';

    if ($request_method = 'OPTIONS') {
        return 200;
    }

    location = / {
        return 301 ./main/;
    }
    location ~ /service/ {
		# 配置代理到K8S Master IP和webapi端口
        proxy_pass http://10.101.68.3:30000;
        rewrite ^/service/(.*)$ /$1 break;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header sy-host $host;
        client_max_body_size 500M;
    }
    location ~ \/file\/download {
	   # 配置代理到MiniIO地址
       proxy_pass http://10.101.68.2:9000;
    }
    location ~ \.(txt|bmp|png|apng|avif|gif|jpg|jpeg|jfif|pjpeg|pjp|svg|webp|ico|cur|tif|tiff|ttf|eot|woff|woff2|js|css|html|map|json)$ {
        default_type text/html;
        add_header Content-Disposition inline;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options nosniff;
		# 配置空间名称
        rewrite ^(.*) /seeyon-dev/$1 break;
		# 配置代理到MiniIO地址
        proxy_pass http://10.101.68.2:9000;

        set $cache_control "max-age=2592000";
        set $accept_encoding "gzip";
        # 没有 hash 值的前端资源,走协商缓存
        if ($uri ~ ((remoteEntry|sy-icon|seeyon-sw-register)\.js|\.html|(sy-icon|sy-icon-colorful)\.css|(sy-icon|sy-icon-colorful)\.woff|(sy-icon|sy-icon-colorful)\.woff2|(sy-icon|sy-icon-colorful)\.ttf)$) {
           set $cache_control "no-cache";
           # 阿里云 OSS gzip 的资源第一次请求没有 etag,只有 Last-Modified,为了拿到 etag 这里禁用上游请求的 gzip
           set $accept_encoding "";
           # 如果请求 upsteam 资源,需要禁用 gzip,避免生成 weak etag 导致 304 失效,
           gzip off;
        }
       add_header Cache-Control $cache_control;
       proxy_set_header Accept-Encoding $accept_encoding;
    }

    location ~ ^/(?!(?:service|openapi|ctp-user\/sso)/)([^/]+) {
        default_type text/html;
        index index.html;
        add_header Content-Disposition inline;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Content-Type-Options nosniff;

        if ($request_filename ~* .*\.(?:htm|html)$) {
            add_header Cache-Control "private, no-store, no-cache, must-revalidate, proxy-revalidate";
        }
        rewrite ^/([a-zA-Z0-9\-\_]+)/?[a-zA-Z0-9\/\-\_]*$ /dev-public/$1/index.html break;
		# 配置代理到MiniIO地址
        proxy_pass http://10.101.68.2:9000;
    }

    error_page   500 502 504 503  /50x.html;

    error_page 404 /404.html;
        location = /404.html {
            root   html;
    }
}

# 定义V8 openapi代理信息
server {
    listen 81;
    server_name _;
    access_log logs/openapi_access.log main;
    keepalive_timeout 300;
    client_header_buffer_size 128k;
    large_client_header_buffers 4 8k;
    add_header 'Access-Control-Allow-Origin' '*';
    add_header 'Access-Control-Allow-Credentials' 'true';
    add_header 'Access-Control-Allow-Methods' '*';
    add_header 'Access-Control-Allow-Headers' '*';
    location / {
		# 配置代理到K8S Master IP和openapi端口
        proxy_pass http://10.101.68.3:30000;
        proxy_set_header HOST $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }
}

编撰人:het