NVMe over RoCE 网络规划

NVMe over RoCE 存储系统的网络应认真规划,下面以一个简单的系统为例说明:

  • 一台双控制器(A控、B控)NVMe存储,每个控制器上有四个NVMe over RoCE的网口(A控A1-A4、B控B1-B4)
  • 两台无损以太网交换机(交换机A、交换机B)
  • 两台服务器(服务器1、服务器2)
  • 每台服务器有两个RoCE网卡(服务器X网卡1、服务器X网卡2),每个网卡有两个网口(服务器X网卡1A、服务器X网卡1B、服务器X网卡2A、服务器X网卡2B)
  • VLAN 123-124 用于 NVMe over RoCE、VLAN 99 用于业务网

交换机A的VLAN 123(192.168.123.0/24)用于传输NVMe over RoCE、交换机B用VLAN 124(192.168.124.0/24)用于传输NVMe over RoCE。无论是控制器、交换机、网卡坏任意一个,甚至每类都任意坏一个,均不影响业务连续性

接口交换机链接VLANNVMe over RoCE IP
存储A控A1交换机A123192.168.123.101
存储A控A2交换机A123192.168.123.102
存储A控A3交换机B124192.168.124.101
存储A控A4交换机B124192.168.124.102
存储B控B1交换机A123192.168.123.103
存储B控B2交换机A123192.168.123.104
存储B控B3交换机B124192.168.124.103
存储B控B4交换机B124192.168.124.104
服务器1网卡1A交换机A123192.168.123.11
服务器1网卡1B交换机B99业务网
服务器1网卡2A交换机A99业务网
服务器1网卡1B交换机B124192.168.124.11
服务器2网卡1A交换机A123192.168.123.12
服务器2网卡1B交换机B99业务网
服务器2网卡2A交换机A99业务网
服务器2网卡2B交换机B124192.168.124.12

VMware ESXi 配置 NVMe over RoCE

NVMe over RoCE 的相关配置需要在 vCenter Server Client 下面操作,ESXi Host Client 下是没有相关选项的,至少图形界面是这样,用 esxicli 估计可以直接在 ESXi 下面配置。所以需要先用本地的盘部署一套VCSA,精简配置大约150GB就够了,等NVMe配置好再迁移到存储上。

  • 在配置-网络-RDMA 适配器下确认RDMA适配器(vmrdmaX)对应的物理网络适配器(vmnicX),可通过交换机 shutdown 等方法确认规划用于 NVMe 的端口对应的物理网络适配器名称。
    如 vmrdma0 对应 vmnic2、vmrdma3 对应 vmnic5。
  • 在配置-网络-虚拟交换机下添加网络,选择 VMkernel 网络适配器、选择新建标准交换机、输入MTU(Dorado 推荐5500),选择一个用于NVMe的物理网络适配器,VLAN ID 填写对应交换机的 NVMe over RoCE 用 VLAN,可用服务中仅勾选 NVMe over RDMA,配置静态IPv4地址。
  • 重复上述过程,为每个 NVMe 端口对应的物理网络适配器创建独立的虚拟交换机并配置独立的 VLAN、独立的 VMkernel 端口,实现每个 VMKernel 和物理网络适配器之间一一映射。
    如 vSwitch1 绑定物理网络适配器 vmnic2、VMkernel 端口 vmk1 192.168.123.11、VLAN ID  123;vSwitch2 绑定物理网络适配器 vmnic5、VMkernel 端口 vmk2 192.168.124.11、VLAN ID  124。
  • 在配置-存储-存储适配器-添加软件适配器,添加 NVMe over RDMA 适配器,选择对应的RDMA设备。重复该过程为每个 NVMe 的 RDMA适配器 添加 软件适配器。
    如为 vmrdma0 添加 vmhba64,为 vmrdma3 添加 vmhba65
  • 在配置-存储-存储适配器中,选中刚刚添加的vmhbaXX(VMware NVME over RDMA Storage Adapter),在控制器中添加控制器,填写子系统NQN(存储的NQN)、该网络对应VLAN下的存储IP,保持活动时间 Dorado 推荐5秒,重复此过程添加存储在该VLAN下的所有IP。
    如 vmhba64 添加有 192.168.123.101-104 四个控制器
  • 重复上述过程给剩下的 vmhbaXX 添加控制器。
    vmhba65 添加有 192.168.124.101-104 四个控制器
  • 上述的每个控制器如果都可以访问同一个LUN,那么每一个都是一个多路径。7.0最多4条,8.0最多8条,8.0U1最多32条。
  • 最终结果如下表所示,8个路径 = 2个物理网络适配器 x 4个控制器
RDMA适配器VMkernel适配器VMkernel 适配器 IP物理适配器虚拟交换机VLAN存储适配器存储控制器 IP
vmrdma0vmk1192.168.123.11vmnic2vSwitch1123vmhba64192.168.123.101-104
vmrdma3vmk2192.168.124.11vmnic5vSwitch2124vmhba65192.168.124.101-104

NVMe over RoCE 网络配置

NVMe over RoCE 要求无损网络,因此交换机和主机网卡均需要一些配置来保证无损。

QoS标记采用PCP为例,PCP是在VLAN标签中标记优先级,所以流量必须在VLAN中,Dorado 不是所有的前端接口卡都支持DSCP。

  • 交换机启用PFC优先级3,1分钟发生死锁20次,关闭端口PFC
  • 交换机配置PFC死锁检测,检测时间1000ms,恢复时间1500ms
  • 交换机与存储和服务器链接用于NVMe over RoCE的所有端口配置PFC、VLAN和MTU
  • 两台交换机使用不同的VLAN,防止出现跨交换机的流量
  • 交换机在队列3启用AI-ECN并加载集中存储模型
  • 交换机启用LLDP(iNOF的基本要求)
  • 交换机启用简单的iNOF(默认域、无反射器)
dcb pfc nof
 priority 3 turn-off threshold 20
#
dcb pfc deadlock-detect timer 1000
dcb pfc deadlock-recovery timer 1500
#
interface 25GE1/0/1
 description Dorado-A
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#               
interface 25GE1/0/2
 description Dorado-A
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#
interface 25GE1/0/3
 description Dorado-B
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#               
interface 25GE1/0/4
 description Dorado-B
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#
interface 25GE1/0/9
 description Host-01
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#
interface 25GE1/0/11
 description Host-02
 port link-type trunk
 port trunk allow-pass vlan 123
 stp edged-port enable
 dcb pfc enable nof mode manual
 jumboframe enable 5500
#
lldp enable
#
ai-service
 #
 ai-ecn
  ai-ecn enable
  assign queue 3 model ai_ecn_centralizedstorage
 #
 inof
#
return
  • 为确保 RoCE 流量无损,在 ESXi 主机中将 PFC 优先级值配置为 3
[root@yaoge123:~] esxcli system module parameters set -m nmlx5_core -p "pfctx=0x08 pfcrx=0x08"
  • 重启后查看,pfctx和pfcrx值均为0x08
[root@yaoge123:~] esxcli system module parameters list -m nmlx5_core | grep pfc
pfcrx                int            0x08   Priority based Flow Control policy on RX.
   Notes: Must be equal to pfctx.
pfctx                int            0x08   Priority based Flow Control policy on TX.
   Notes: Must be equal to pfcrx.

ESXi 升级 Mellanox 网卡固件

    NVMe over RoCE 对RoCE网卡的固件兼容性有较高要求

    • 打开ESXi的SSH并进入维护模式,远程登录ESXi主机
    • 用 esxcfg-nics -l 查看网卡列表,用 esxcli network nic get -n 查看网卡驱动和固件版本
    [root@yaoge123:~] esxcfg-nics -l
    Name    PCI          Driver      Link Speed      Duplex MAC Address       MTU    Description                   
    vmnic0  0000:19:00.0 igbn        Up   1000Mbps   Full   **:**:**:**:**:** 1500   Intel Corporation I350 Gigabit Network Connection
    vmnic1  0000:19:00.1 igbn        Up   1000Mbps   Full   **:**:**:**:**:** 1500   Intel Corporation I350 Gigabit Network Connection
    vmnic2  0000:8a:00.0 nmlx5_core  Up   25000Mbps  Full   **:**:**:**:**:** 1500   Mellanox Technologies ConnectX-5 EN NIC; 10/25GbE; dual-port SFP28; PCIe3.0 x8; (MCX512A-ACU)
    vmnic3  0000:8a:00.1 nmlx5_core  Up   25000Mbps  Full   **:**:**:**:**:** 1500   Mellanox Technologies ConnectX-5 EN NIC; 10/25GbE; dual-port SFP28; PCIe3.0 x8; (MCX512A-ACU)
    vmnic4  0000:8b:00.0 nmlx5_core  Up   25000Mbps  Full   **:**:**:**:**:** 1500   Mellanox Technologies ConnectX-5 EN NIC; 10/25GbE; dual-port SFP28; PCIe3.0 x8; (MCX512A-ACU)
    vmnic5  0000:8b:00.1 nmlx5_core  Up   25000Mbps  Full   **:**:**:**:**:** 1500   Mellanox Technologies ConnectX-5 EN NIC; 10/25GbE; dual-port SFP28; PCIe3.0 x8; (MCX512A-ACU)
    [root@yaoge123:~] esxcli network nic get -n vmnic2
       Advertised Auto Negotiation: true
       Advertised Link Modes: Auto, 1000BaseCX-SGMII/Full, 10000BaseKR/Full, 25000BaseTwinax/Full
       Auto Negotiation: true
       Backing DPUId: N/A
       Cable Type: FIBRE
       Current Message Level: -1
       Driver Info: 
             Bus Info: 0000:8a:00:0
             Driver: nmlx5_core
             Firmware Version: 16.32.1010
             Version: 4.23.0.36
       Link Detected: true
       Link Status: Up 
       Name: vmnic2
       PHYAddress: 0
       Pause Autonegotiate: false
       Pause RX: true
       Pause TX: true
       Supported Ports: FIBRE, DA
       Supports Auto Negotiation: true
       Supports Pause: true
       Supports Wakeon: false
       Transceiver: internal
       Virtual Address: **:**:**:**:**:**
       Wakeon: None
    
    • VMware兼容性 搜索该网卡型号查询对应的驱动和固件版本
    • 下载 MFT,选择和ESXi版本匹配的安装包
    • 下载的Mellanox-MFT-Tools_*-package.zip解压,将解压出的.zip文件传至ESXi的/tmp,确认上传的.zip文件内根目录就有index.xml
    • 下载的Mellanox-NATIVE-NMST_*-package.zip解压,将解压出的.zip文件传至ESXi的/tmp,确认上传的.zip文件内根目录就有index.xml
    • 用 esxcli software component apply -d 安装上传的两个.zip,注意要写全路径
    [root@yaoge123:/tmp] esxcli software component apply -d /tmp/Mellanox-MFT-Tools_4.26.1.101-1OEM.801.0.0.21495797_22944840.zip 
    Installation Result
       Message: Operation finished successfully.
       Components Installed: Mellanox-MFT-Tools_4.26.1.101-1OEM.801.0.0.21495797
       Components Removed: 
       Components Skipped: 
       Reboot Required: false
       DPU Results: 
    [root@yaoge123:/tmp] esxcli software component apply -d /tmp/Mellanox-NATIVE-NMST_4.26.1.101-1OEM.801.0.0.21495797_22944879.zip 
    Installation Result
       Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
       Components Installed: Mellanox-NATIVE-NMST_4.26.1.101-1OEM.801.0.0.21495797
       Components Removed: 
       Components Skipped: 
       Reboot Required: true
       DPU Results: 
    
    • 重启ESXi再打开SSH
    • 下载 Firmware ,查找对应网卡的兼容版本固件下载
    • 下载的fw-*.bin.zip解压,将解压出的.bin文件上传至ESXi的/tmp
    • 在/tmp下执行/opt/mellanox/bin/mlxfwmanager,会自动发现新固件文件,然后添加-u升级
    [root@yaoge123:/tmp] /opt/mellanox/bin/mlxfwmanager
    Querying Mellanox devices firmware ...
    
    Device #1:
    ----------
    
      Device Type:      ConnectX5
      Part Number:      MCX512A-ACU_Ax_Bx
      Description:      ConnectX-5 EN network interface card; 10/25GbE dual-port SFP28; PCIe3.0 x8; UEFI Enabled (x86/ARM)
      PSID:             MT_0000000425
      PCI Device Name:  mt4119_pciconf0
      Base GUID:        ***
      Base MAC:         ***
      Versions:         Current        Available     
         FW             16.32.1010     16.34.1002    
         PXE            3.6.0502       3.6.0700      
         UEFI           14.25.0017     14.27.0014    
    
      Status:           Update required
    
    Device #2:
    ----------
    
      Device Type:      ConnectX5
      Part Number:      MCX512A-ACU_Ax_Bx
      Description:      ConnectX-5 EN network interface card; 10/25GbE dual-port SFP28; PCIe3.0 x8; UEFI Enabled (x86/ARM)
      PSID:             MT_0000000425
      PCI Device Name:  mt4119_pciconf1
      Base GUID:        ***
      Base MAC:         ***
      Versions:         Current        Available     
         FW             16.32.1010     16.34.1002    
         PXE            3.6.0502       3.6.0700      
         UEFI           14.25.0017     14.27.0014    
    
      Status:           Update required
    
    ---------
    Found 2 device(s) requiring firmware update. Please use -u flag to perform the update.
    
    [root@yaoge123:/tmp] /opt/mellanox/bin/mlxfwmanager -u
    Querying Mellanox devices firmware ...
    
    Device #1:
    ----------
    
      Device Type:      ConnectX5
      Part Number:      MCX512A-ACU_Ax_Bx
      Description:      ConnectX-5 EN network interface card; 10/25GbE dual-port SFP28; PCIe3.0 x8; UEFI Enabled (x86/ARM)
      PSID:             MT_0000000425
      PCI Device Name:  mt4119_pciconf0
      Base GUID:        ***
      Base MAC:         ***
      Versions:         Current        Available     
         FW             16.32.1010     16.34.1002    
         PXE            3.6.0502       3.6.0700      
         UEFI           14.25.0017     14.27.0014    
    
      Status:           Update required
    
    Device #2:
    ----------
    
      Device Type:      ConnectX5
      Part Number:      MCX512A-ACU_Ax_Bx
      Description:      ConnectX-5 EN network interface card; 10/25GbE dual-port SFP28; PCIe3.0 x8; UEFI Enabled (x86/ARM)
      PSID:             MT_0000000425
      PCI Device Name:  mt4119_pciconf1
      Base GUID:        ***
      Base MAC:         ***
      Versions:         Current        Available     
         FW             16.32.1010     16.34.1002    
         PXE            3.6.0502       3.6.0700      
         UEFI           14.25.0017     14.27.0014    
    
      Status:           Update required
    
    ---------
    Found 2 device(s) requiring firmware update...
    
    Perform FW update? [y/N]: y
    Device #1: Updating FW ...     
    FSMST_INITIALIZE -   OK          
    Writing Boot image component -   OK                                                                                                                                                              Done
    Device #2: Updating FW ...     
    FSMST_INITIALIZE -   OK          
    Writing Boot image component -   OK                                                                                                                                                              Done
    
    Restart needed for updates to take effect.
    
    • 重启后再检查网卡的固件版本
    [root@yaoge123:~] esxcli network nic get -n vmnic2
       Advertised Auto Negotiation: true
       Advertised Link Modes: Auto, 1000BaseCX-SGMII/Full, 10000BaseKR/Full, 25000BaseTwinax/Full
       Auto Negotiation: true
       Backing DPUId: N/A
       Cable Type: FIBRE
       Current Message Level: -1
       Driver Info: 
             Bus Info: 0000:8a:00:0
             Driver: nmlx5_core
             Firmware Version: 16.34.1002
             Version: 4.23.0.36
       Link Detected: true
       Link Status: Up 
       Name: vmnic2
       PHYAddress: 0
       Pause Autonegotiate: false
       Pause RX: true
       Pause TX: true
       Supported Ports: FIBRE, DA
       Supports Auto Negotiation: true
       Supports Pause: true
       Supports Wakeon: false
       Transceiver: internal
       Virtual Address: **:**:**:**:**:**
       Wakeon: None
    

    GitLab CVE-2023-7028 临时应对措施

    一个非常无语的高危漏洞,任何人都可以重置任意账号的密码然后发送到指定邮箱

    对于容器部署来说,直接修改 /var/opt/gitlab/nginx/conf/gitlab-http.conf 文件,在其中添加

    location /users/password { 
    return 444;
    }

    然后重新加载nginx配置文件

    gitlab-ctl hup nginx

    DNSmasq 为HPC集群外容器提供集群内主机名解析

    在HPC集群中通常有DNS和本地hosts提供解析服务,以便节点间通过主机名互相通信,而不是直接使用IP地址。但是如果在集群外有一个独立服务器中的容器需要与集群内的节点通过主机名通讯,就需要通过DNS来给容器提供解析服务。

    通过自动化脚本将集群的hosts拷贝到独立服务器的一个目录下,如 /home/hpc/dns/hosts

    自己做一个dnsmasq的容器:

    [yaoge123]$ cat dnsmasq/Dockerfile 
    FROM alpine:latest
    RUN apk update \
     && apk upgrade \
     && apk add --no-cache \
                dnsmasq \
     && rm -rf /var/cache/apk/*
    

    编写docker-compose.yml:

    1. dnsmasq提供了DNS服务,需要指定ip地址,以便在下面其它容器配置中指定dns ip
    2. /home/hpc/dns 是存储hosts的本机目录
    3. 生产环境用 –keep-in-foreground,调试时用–no-daemon和–log-queries
    4. –domain-needed 一定要加,防止dnsmasq将没有域的主机名(没有.的)转发给上游DNS
    5. –cache-size= 改的比hosts文件行数多一些
    6. abc是要解析集群内主机名的容器,添加的dns就是为了用dnsmasq来提供解析服务
    7. 不要解析的就不要加dns
    services:
      dnsmasq:
        build: ./dnsmasq
        image: dnsmasq
        container_name: dnsmasq
        networks:
          default:
            ipv4_address: 192.168.100.200
        volumes:
          - /home/hpc/dns:/etc/dns:ro
        command:
          - dnsmasq
          - --keep-in-foreground
            #- --no-daemon
            #- --log-queries
          - --domain-needed
          - --no-hosts
          - --cache-size=3000
          - --hostsdir=/etc/dns
      abc:
        image: abc
        container_name: abc
        dns:
          - 192.168.100.200
      …………
    networks:
      default:
        driver: bridge
        ipam:
          driver: default
          config:
            - subnet: 192.168.100.0/24

    测试解析和查看 dnsmasq 缓存情况,evictions为0最好

    [yaoge123]# run --rm -it --network=docker_default --dns=192.168.100.200 alpine sh
    / # apk add bind-tools
    / # dig +short node_name
    / # for i in "cachesize.bind insertions.bind evictions.bind misses.bind hits.bind auth.bind servers.bind";do dig +short chaos txt $i;done

    OnlyOffice Document Server 容器部署和监控

    大体架构是:前端 Nginx 卸载SSL后反代给 OnlyOffice,OnlyOffice 将监控信息喂给 statsd-exporter,Prometheus 从 statsd-exporter 拉取数据,最终用 Grafana 可视化展示。

    先来 docker-compose.yml 配置如下,有一些注意修改的地方:

    1. 可以把一些onlyoffice插件挂进容器中 /var/www/onlyoffice/documentserver/sdkjs-plugins/ 目录下,启动时会自动加载。
    2. onlyoffice自带的中文字体少的可怜,一定要整理一些常用字体(特别是Windows/Office自带的字体),将ttf/otf字体文件挂进容器中 /usr/share/fonts/ 目录下,启动时会自动加载。
    3. onlyoffice的持久化配置挂进容器 /etc/onlyoffice/documentserver/local-production-linux.json,这样升级重启的时候配置才能保留下来;容器里面的配置文件改了也没用,重建就全丢了。
    4. JWT_SECRET 配置一个足够强的Token,和应用软件配置要一样。
    services:
      onlyoffice:
        image: onlyoffice/documentserver-ee
        container_name: onlyoffice
        volumes:
          - ./onlyoffice/logs:/var/log/onlyoffice
          - ./onlyoffice/data:/var/www/onlyoffice/Data
          - ./onlyoffice/lib:/var/lib/onlyoffice
          - ./onlyoffice/db:/var/lib/postgresql
          - ./onlyoffice/fonts/dejavu:/usr/share/fonts/dejavu
          - ./onlyoffice/fonts/founder:/usr/share/fonts/founder
          - ./onlyoffice/fonts/liberation:/usr/share/fonts/liberation
          - ./onlyoffice/fonts/libertinus:/usr/share/fonts/libertinus
          - ./onlyoffice/fonts/noto-cjk:/usr/share/fonts/noto-cjk
          - ./onlyoffice/fonts/noto-emoji:/usr/share/fonts/noto-emoji
          - ./onlyoffice/fonts/sarasa-gothic:/usr/share/fonts/sarasa-gothic
          - ./onlyoffice/fonts/source-code-pro:/usr/share/fonts/source-code-pro
          - ./onlyoffice/fonts/source-han-sans:/usr/share/fonts/source-han-sans
          - ./onlyoffice/fonts/source-han-serif:/usr/share/fonts/source-han-serif
          - ./onlyoffice/fonts/source-sans:/usr/share/fonts/source-sans
          - ./onlyoffice/fonts/source-serif:/usr/share/fonts/source-serif
          - ./onlyoffice/fonts/windows:/usr/share/fonts/windows
          - ./onlyoffice/local-production-linux.json:/etc/onlyoffice/documentserver/local-production-linux.json
        environment:
          - TZ=Asia/Shanghai
          - JWT_ENABLED=true
          - JWT_SECRET=yaoge123
      statsd-exporter:
        image: prom/statsd-exporter
        container_name: statsd-exporter
        ports:
          - 9102:9102
        depends_on:
          - onlyoffice 
      nginx:
        image: nginx:alpine
        container_name: nginx
        ports:
          - 80:80
          - 443:443
        volumes:
          - ./nginx/conf.d/:/etc/nginx/conf.d/:ro
          - ./nginx/ssl/:/etc/nginx/ssl/:ro
        environment:
          - TZ=Asia/Shanghai
      nginx-exporter:
        image: nginx/nginx-prometheus-exporter
        container_name: nginx-prometheus-exporter
        ports:
          - 9113:9113
        command:
          - -nginx.scrape-uri
          - http://nginx:8080/stub_status
        depends_on:
          - nginx
    ……

    在 local-production-linux.json 对 OnlyOffice 进行持久化配置,主要是三部分:

    1. 开启statsd监控推送,填写statsd-exporter的主机名和端口
    2. 开启自动保存
    3. 打开文件尺寸扩大至1GB(默认是100MB)
    {
            "statsd": {
                    "useMetrics": true,
                    "host": "statsd-exporter",
                    "port": "9125",
                    "prefix": "ds."
            },
    	"services": {
    		"CoAuthoring": {
    			"autoAssembly": {
    				"enable": true,
    				"interval": "5m"
    			}
    		}
    	},
    	"FileConverter": {
    		"converter": {
    			"maxDownloadBytes": 1073741824,
    			"downloadAttemptMaxCount": 3
    		}
    	}
    }
    

    Nginx 配置反代卸载SSL

    map $http_host $this_host {
        "" $host;
        default $http_host;
    }
    
    map $http_x_forwarded_proto $the_scheme {
         default $http_x_forwarded_proto;
         "" $scheme;
    }
    
    map $http_x_forwarded_host $the_host {
        default $http_x_forwarded_host;
        "" $this_host;
    }
    
    map $http_upgrade $proxy_connection {
        default upgrade;
        "" close;
    }
    
    server {
    	listen 80;
    	listen [::]:80;
    	server_name onlyoffice.nju.edu.cn;
    	rewrite ^ https://$http_host$request_uri? permanent;
    	server_tokens off;
    }
    
    server {
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    	server_name onlyoffice.nju.edu.cn;
    	server_tokens off;
    
            include ssl/nju_edu_cn.conf;
    
    	add_header X-Content-Type-Options nosniff;
    
    	location / {
    		proxy_pass http://onlyoffice;
    		proxy_http_version 1.1;
    		proxy_set_header Upgrade $http_upgrade;
    		proxy_set_header Connection $proxy_connection;
    		proxy_set_header X-Forwarded-Host $the_host;
    		proxy_set_header X-Forwarded-Proto $the_scheme;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	}
    }
    
    server {
    	listen 8080;
    	listen [::]:8080;
    	server_name localhost;
    
    	location /stub_status {
    		stub_status on;
    		access_log off;
    	}
    }
    
    

    在 Consul 中注册 OnlyOffice 和 Nginx 的监控

    [yaoge123 ~]$ curl -X PUT -d '{"id": "onlyoffice.nju.edu.cn_statsd-exporter","name": "statsd_exporter","address": "onlyoffice.nju.edu.cn","port": 9102,"tags": ["prometheus","vm"],"checks": [{"http": "http://onlyoffice.nju.edu.cn:9102/metrics","interval": "30s"}]}' http://consul:8500/v1/agent/service/register
    
    [yaoge123 ~]$ curl -X PUT -d '{"id": "onlyoffice.nju.edu.cn_nginx-exporter","name": "nginx_exporter","address": "onlyoffice.nju.edu.cn","port": 9113,"tags": ["prometheus","vm"],"checks": [{"http": "http://onlyoffice.nju.edu.cn:9113/metrics","interval": "30s"}]}' http://consul:8500/v1/agent/service/register

    在Grafana中导入基于官方Dashboard的修改版

    https://grafana.com/grafana/dashboards/17048

    安装部署 Office Online Server 集群

    既然是集群,首先将域控变成两台:

    将AD2加入域中,服务器角色中添加AD域服务,然后将其提升为域控,选择添加到现有域。

    集群嘛,多安装几台 Office Online Server,但不导入SSL证书。

    在第一台上用管理员打开PowerShell部署 Office Online Server farm

    New-OfficeWebAppsFarm -InternalUrl "https://officeonline1.ad.local" -ExternalUrl "https://officeonline.nju.edu.cn" -SSLOffloaded -EditingEnabled

    在其它台上用管理员打开PowerShell加入 Office Online Server farm

    New-OfficeWebAppsMachine -MachineToJoin "officeonline1.ad.local"

    在PowerShell中查看所有节点的状态

    (Get-OfficeWebAppsFarm).Machines

    前端 Nginx 负载均衡卸载SSL

    upstream officeonline {
    	ip_hash;
    	server 192.168.1.11:80;
    	server 192.168.1.12:80;
    	server 192.168.1.13:80;
    }
    
    map $http_upgrade $connection_upgrade {
    	default	upgrade;
    	''	close;
    }
    
    server {
    	listen 80;
    	listen [::]:80;
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    	server_name officeonline.nju.edu.cn;
    
            include ssl/nju_edu_cn.conf;
    
    	location / {
    		proxy_pass http://officeonline;
    		proxy_http_version 1.1;
    		proxy_set_header Upgrade $http_upgrade;
    		proxy_set_header Connection $connection_upgrade;
    		proxy_cache_bypass $http_upgrade;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Real-PORT $remote_port;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		proxy_set_header X-Forwarded-Proto $scheme;
    	}
    }
    

    安装部署单台 Office Online Server

    Office Online Server 必须加入域,且不能装在域控上,因此先装两台带桌面体验的 Windows Server 2022 并升级。

    第一台用来做域控,给2C/4G的资源就够了,服务器角色中添加AD域服务,然后将其提升为域控,如添加新林的根域名为 ad.local

    第二台用来装Office Online Server,要多给资源,首先将其DNS改为域控的IP,加入域并重启。

    用管理员打开PowerShell执行安装要求的角色和服务,安装完成后重启。

    Add-WindowsFeature Web-Server,Web-Mgmt-Tools,Web-Mgmt-Console,Web-WebServer,Web-Common-Http,Web-Default-Doc,Web-Static-Content,Web-Performance,Web-Stat-Compression,Web-Dyn-Compression,Web-Security,Web-Filtering,Web-Windows-Auth,Web-App-Dev,Web-Net-Ext45,Web-Asp-Net45,Web-ISAPI-Ext,Web-ISAPI-Filter,Web-Includes,NET-Framework-Features,NET-Framework-45-Features,NET-Framework-Core,NET-Framework-45-Core,NET-HTTP-Activation,NET-Non-HTTP-Activ,NET-WCF-HTTP-Activation45,Windows-Identity-Foundation,Server-Media-Foundation

    安装如下依赖软件,部分软件在Windows 2022中已经存在(.NET和VC++ 2015),安装程序会有提示直接退出,这个没关系

    安装 Office Online Server ,当前版本是2018年11月发布的16.0.10338.20039

    0a764830ee8cca9a92f749c9a6a9cd6a0e99e592 en_office_online_server_last_updated_november_2018_x64_dvd_1b5ae10d.iso

    Microsoft Download Center下载语言包,在下载页面切换语言可以下载不同语言的语言包,当前是2018年11月发布的语言包,将多个语言包依次安装

    87b77a9abf29cf11e95f74c07fb7419026882c05 wacserverlanguagepack-20181129cn.exe
    33965054f9e93f6429cf3022dea0f6a575f8d178 wacserverlanguagepack-20181129en.exe
    0432a9b8a27b7f56692e37c117b8cf79c45458fa wacserverlanguagepack-20181129tw.exe

    Microsoft Update Catalog查找下载最新的Microsoft Office Online Server 服务器场部署安全更新,当前版本是2022年11月8日发布的KB5002276,安装时也会自动更新语言包

    5abacedb0f21d8629a0a0eab1b4d163ca0228f96  wacserver-x-none_5abacedb0f21d8629a0a0eab1b4d163ca0228f96.cab

    在MMC控制台-证书(本地计算机)-个人中导入pfx格式含私钥的HTTPS证书,注意IIS不支持双证书,因此考虑兼容性导入RSA证书,导入后右击证书属性,设置友好名称(如nju.edu.cn)

    用管理员打开PowerShell部署 Office Online Server farm

    New-OfficeWebAppsFarm -InternalUrl "https://officeonline.ad.local" -ExternalUrl "https://officeonline.nju.edu.cn" -CertificateName "nju.edu.cn" -EditingEnabled

    在PowerShell查看详细配置

    Get-OfficeWebAppsFarm