信创环境部署:麒麟与达梦 8
本文以银河麒麟高级服务器操作系统 V10 + 达梦 8(DM8)+ Java 8 + Redis + Nginx 为例,介绍 SurveyKing Pro 的首次部署流程。完成后,用户通过 Nginx 访问系统,后端连接达梦数据库和 Redis。
示例将所有组件部署在一台服务器上。分机部署时,请将数据库、Redis 和 Nginx 上游地址调整为实际内网地址。单位要求使用 TongWeb 等国产中间件时,见文末的中间件替换说明。
1. 准备交付文件和运行环境
交付文件
准备同一版本、适配 DM8 的以下文件,并上传至服务器上的 /opt/surveyking-package 目录:
| 文件 | 用途 |
|---|---|
init-dm.sql | 独立交付的数据库初始化脚本,包含表结构、基础数据及所需函数 |
survey-3.2-xxxx.zip | 前端交付包,包含管理后台与公开页面 |
surveyking-server.jar | 后端程序,已包含达梦数据库驱动 |
license.lic | 与部署服务器匹配的系统授权文件 |
xxxx 代表实际交付的版本标识,执行命令时请替换为完整文件名。如果 JAR 和授权文件的名称也带版本标识,请在部署时分别复制为 surveyking-server.jar 和 license.lic,并确认两者来自同一套交付文件。
环境约定
| 项目 | 本文示例 |
|---|---|
| 操作系统 | 银河麒麟高级服务器操作系统 V10 |
| 运行环境 | 64 位 Java 8,安装包与服务器 CPU 架构一致 |
| 数据库 | DM8,安装在 /opt/dmdbms,监听 5236 |
| 数据库用户及 schema | SURVEYKING |
| Redis | 127.0.0.1:6379,使用 0 号逻辑库 |
| 后端 | 127.0.0.1:48080,生产配置 prod |
| 访问入口 | Nginx,域名示例 survey.example.com |
| 应用目录 | /opt/surveyking |
| 本地附件目录 | /opt/surveyking/files |
同机部署可从 4 核 CPU、8 GB 内存起步,并按并发量、数据库大小和附件容量增加资源。本文 Java 最大堆内存为 4 GB,还需为达梦、Redis、操作系统及 Java 的其他内存开销预留空间,请按实际情况调整。
以下 Linux 命令由具有 sudo 权限的运维账号执行;SQL 在达梦 disql 中执行。示例域名、密码和文件名都需要替换为现场值。
2. 安装 Java 8、Redis 和 Nginx
使用麒麟系统的软件源或单位提供的离线安装包。软件源提供以下包名时,可执行:
sudo dnf install -y java-1.8.0-openjdk-headless redis nginx unzip
java -version
redis-server --version
nginx -v
确认 java -version 显示 1.8。如果使用指定 JDK,请记下其 java 可执行文件的绝对路径,后续替换服务配置中的 /usr/bin/java。
启动 Redis:
sudo systemctl enable --now redis
redis-cli -h 127.0.0.1 -p 6379 ping
未启用密码时应返回 PONG。已启用密码时,使用支持 --askpass 的客户端执行 redis-cli --askpass -h 127.0.0.1 -p 6379 ping,按提示输入密码。服务名和配置文件位置以现场安装结果为准。
Redis 监听地址与后端连接地址应保持一致。同机部署使用回环地址;分机部署时允许应用服务器访问对应内网地址。
3. 初始化达梦数据库
3.1 安装并创建数据库实例
按照达梦官方单机安装说明,使用 dmdba 操作系统账号安装 DM8,完成安装程序要求的服务注册操作。选择与麒麟版本、CPU 架构匹配的安装包,并配置有效的数据库授权。
本系统使用以下实例参数:
| 参数 | 设置值 | 说明 |
|---|---|---|
PAGE_SIZE | 32 | 数据页大小为 32 KB |
EXTENT_SIZE | 16 | 簇大小为 16 页 |
CHARSET | 1 | UTF-8 编码 |
CASE_SENSITIVE | 0 | 大小写不敏感 |
BLANK_PAD_MODE | 0 | 不采用空格填充模式 |
PORT_NUM | 5236 | 数据库端口,可按现场调整 |
页大小、字符集和大小写规则需要在创建实例时设置。若数据库由管理员统一提供,请先确认这些参数满足要求,再创建应用用户。
以下为新实例的命令行示例。将占位密码替换为符合数据库密码策略的实际值,安装目录和数据目录也可按需调整:
sudo install -d -o dmdba -m 0750 /data/dm8
sudo -u dmdba env LD_LIBRARY_PATH=/opt/dmdbms/bin \
/opt/dmdbms/bin/dminit \
PATH=/data/dm8 DB_NAME=SURVEYKING INSTANCE_NAME=SURVEYKING \
PORT_NUM=5236 PAGE_SIZE=32 EXTENT_SIZE=16 \
CHARSET=1 CASE_SENSITIVE=0 BLANK_PAD_MODE=0 \
SYSDBA_PWD='<管理用户密码>' SYSAUDITOR_PWD='<审计用户密码>'
注册并启动数据库实例服务:
sudo /opt/dmdbms/script/root/dm_service_installer.sh \
-t dmserver -dm_ini /data/dm8/SURVEYKING/dm.ini -p SURVEYKING
sudo systemctl enable --now DmServiceSURVEYKING
dm.ini 路径和服务名以实际创建结果为准。数据库管理员已经提供可用实例时,从下一步开始。
3.2 设置兼容参数并创建应用用户
在数据库服务器上打开 disql:
sudo -u dmdba env LANG=en_US.UTF-8 LD_LIBRARY_PATH=/opt/dmdbms/bin \
/opt/dmdbms/bin/disql /nolog
输入 LOGIN,按提示填写服务器地址 127.0.0.1:5236、用户名 SYSDBA 和管理密码。登录方式详见达梦 DIsql 使用说明。
登录后执行以下 SQL,其中应用用户密码需要自行设置,并在后端配置中使用相同的值:
WHENEVER SQLERROR EXIT SQL.SQLCODE;
SP_SET_PARA_VALUE(2, 'COMPATIBLE_MODE', 4);
SP_SET_PARA_VALUE(2, 'JSON_MODE', 2);
CREATE USER SURVEYKING IDENTIFIED BY "<应用用户密码>";
GRANT RESOURCE TO SURVEYKING;
EXIT;
重启实例,使兼容参数生效:
sudo systemctl restart DmServiceSURVEYKING
等待数据库恢复连接后,再用 SYSDBA 登录 disql,确认两个参数分别为 4 和 2:
SELECT PARA_NAME, PARA_VALUE
FROM V$DM_INI
WHERE PARA_NAME IN ('COMPATIBLE_MODE', 'JSON_MODE');
EXIT;
3.3 导入 init-dm.sql
init-dm.sql 会在 SURVEYKING schema 下创建表和导入基础数据。应用用户与同名 schema 已在上一步创建,初始化脚本只需在该空 schema 中执行一次。
将 SQL 文件放到 dmdba 可读取的目录;数据库分机部署时,请先将文件上传到数据库服务器:
sudo install -d -o dmdba -m 0700 /home/dmdba/surveyking-init
sudo install -o dmdba -m 0600 /opt/surveyking-package/init-dm.sql \
/home/dmdba/surveyking-init/init-dm.sql
sudo -u dmdba env LANG=en_US.UTF-8 LD_LIBRARY_PATH=/opt/dmdbms/bin \
/opt/dmdbms/bin/disql /nolog
输入 LOGIN,这次使用 SURVEYKING 应用用户及其密码登录,然后执行:
@/home/dmdba/surveyking-init/init-dm.sql
SQL 文件按 UTF-8 编码读取,执行过程中不应出现 SQL 错误。脚本完成后会提交并退出 disql;遇到 SQL 错误也会退出,请先排查错误再继续部署。脚本已包含所需的 SK_JSON_NUMBER 函数,无需单独安装。
如需使用其他应用用户名,请同时调整 SQL 文件中的 SET SCHEMA SURVEYKING、创建用户的 SQL,以及后端配置中的 schema 和用户名,确保三者一致。
4. 部署后端和授权文件
4.1 创建运行账号及目录
在应用服务器上执行:
sudo useradd --system --user-group --home-dir /opt/surveyking \
--shell /sbin/nologin surveyking
sudo mkdir -p /opt/surveyking/{server,client,config,files,logs}
sudo chown -R surveyking:surveyking /opt/surveyking
sudo chmod 755 /opt/surveyking /opt/surveyking/client
sudo chmod 750 /opt/surveyking/config
sudo install -o surveyking -g surveyking -m 0640 \
/opt/surveyking-package/surveyking-server.jar \
/opt/surveyking/server/surveyking-server.jar
sudo install -o surveyking -g surveyking -m 0600 \
/opt/surveyking-package/license.lic \
/opt/surveyking/config/license.lic
如果运行账号已由运维创建,可跳过 useradd,并确认目录归属一致。后端启动时会通过 --license.path 显式加载上面的授权文件;请使用针对实际部署服务器签发的文件。
4.2 配置数据库和 Redis
创建 /opt/surveyking/config/application-prod.yml,填写实际连接信息:
server:
address: 127.0.0.1
port: 48080
spring:
datasource:
dynamic:
datasource:
master:
name: SURVEYKING
driver-class-name: dm.jdbc.driver.DmDriver
url: jdbc:dm://127.0.0.1:5236?schema=SURVEYKING
username: SURVEYKING
password: '请替换为应用用户密码'
redis:
host: 127.0.0.1
port: 6379
database: 0
# 仅在 Redis 启用密码时取消下一行注释,并填写实际密码。
# password: '请替换为 Redis 密码'
logging:
file:
name: /opt/surveyking/logs/surveyking-server.log
配置说明:
master.name和 JDBC URL 中的schema都是数据库的应用 schema,本例均为SURVEYKING。username、password使用上一步创建的应用账号。- Redis 无密码时,省略
password配置项,也不要设置 Redis 密码环境变量。 有密码时再填写实际值。 - Nginx 与后端分机部署时,将
server.address改为应用服务器供 Nginx 访问的内网地址,并同步修改 Nginx 上游地址。
设置配置文件权限:
sudo chown surveyking:surveyking /opt/surveyking/config/application-prod.yml
sudo chmod 600 /opt/surveyking/config/application-prod.yml
4.3 使用 systemd 启动后端
创建服务文件:
[Unit]
Description=SurveyKing Pro
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=surveyking
Group=surveyking
WorkingDirectory=/opt/surveyking/files
ExecStart=/usr/bin/java -Xms512m -Xmx4g -Dfile.encoding=UTF-8 -jar /opt/surveyking/server/surveyking-server.jar --spring.profiles.active=prod --spring.config.additional-location=file:/opt/surveyking/config/ --license.path=/opt/surveyking/config/license.lic
SuccessExitStatus=143
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
交付的后端默认使用 prod,启动命令中也显式指定该配置。外部的 application-prod.yml 用于覆盖部署环境的连接和日志设置。
-Xmx4g 表示最大堆内存为 4 GB,请根据服务器可用内存和业务规模修改。 修改服务文件后,需要执行 systemctl daemon-reload 并重启服务。
确认达梦和 Redis 已就绪,再启动应用:
sudo systemctl daemon-reload
sudo systemctl enable --now surveyking
sudo systemctl status surveyking --no-pager
sudo journalctl -u surveyking -n 100 --no-pager
日志出现启动完成信息,且没有数据库、Redis 或授权错误后,继续配置前端。
5. 部署前端并配置 Nginx
5.1 解压前端交付包
将下面的 survey-3.2-xxxx.zip 替换为实际交付文件名:
sudo unzip -q /opt/surveyking-package/survey-3.2-xxxx.zip \
-d /opt/surveyking/client
sudo chown -R surveyking:surveyking /opt/surveyking/client
sudo chmod -R a+rX /opt/surveyking/client
test -f /opt/surveyking/client/dist/public/index.html
test -f /opt/surveyking/client/dist/admin/index.html
两个入口文件都应存在,最终目录如下:
/opt/surveyking/
├── server/
│ └── surveyking-server.jar
├── config/
│ ├── application-prod.yml
│ └── license.lic
├── client/
│ └── dist/
│ ├── public/
│ │ └── index.html
│ └── admin/
│ └── index.html
├── files/
└── logs/
5.2 配置站点
创建 /etc/nginx/conf.d/surveyking.conf,将 survey.example.com 换为实际访问域名。通过 IP 访问时,可填写服务器 IP。
确认 Nginx 主配置的 http {} 中已经包含 include /etc/nginx/conf.d/*.conf;,并加载了 mime.types。下面的 map 位于 server 外部,由主配置纳入 http;若已经定义过同名变量,请复用现有定义。
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name survey.example.com;
index index.html;
client_max_body_size 100m;
location = /pub { return 301 /pub/; }
location = /adm { return 301 /adm/; }
# 两套前端入口 HTML 不缓存。
location = /pub/index.html {
root /opt/surveyking/client/dist/public;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
try_files /index.html =404;
}
location = /adm/index.html {
root /opt/surveyking/client/dist/admin;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
try_files /index.html =404;
}
location ^~ /pub/ {
alias /opt/surveyking/client/dist/public/;
}
location ^~ /adm/ {
alias /opt/surveyking/client/dist/admin/;
}
# 答题、结果、公开查询等页面使用 public 入口。
location ~ ^/(e|s|t|q|share|redeem)(/|$) {
root /opt/surveyking/client/dist/public;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
try_files /index.html =404;
}
location ~ ^/user/(login|register|binding)/?$ {
root /opt/surveyking/client/dist/public;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
try_files /index.html =404;
}
# 接口路径原样传递给后端,proxy_pass 末尾不添加 /。
location ^~ /admin-api {
proxy_pass http://127.0.0.1:48080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
proxy_cache off;
proxy_connect_timeout 60s;
proxy_read_timeout 1800s;
proxy_send_timeout 1800s;
}
location ^~ /captcha {
proxy_pass http://127.0.0.1:48080;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 管理后台页面及刷新后的路由回退。
location / {
root /opt/surveyking/client/dist/admin;
add_header Cache-Control "no-cache, no-store, must-revalidate" always;
try_files $uri $uri/ /index.html;
}
}
检查配置并启动或重新加载 Nginx:
sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx
确认域名解析到服务器,并按网络策略放行访问端口。启用 HTTPS 时,在该站点配置有效证书并保留相同的路由与代理规则,系统中的对外地址也统一使用 HTTPS。
6. 登录并完成系统初始化
浏览器打开 http://survey.example.com/user/login,使用交付说明中的管理员账号登录。
部署完成后必须进行系统初始化,再正式开放使用。 根据实际环境设置系统名称、对外访问地址、管理员信息和文件存储,并修改初始登录密码。
配置本地硬盘存储
如果附件保存在本地硬盘,打开管理后台的 基础设置 → 文件管理 → 文件配置,页面路径为 /infra/file/file-config。
编辑“本地磁盘”配置,并填写:
| 配置项 | 本文示例 | 填写说明 |
|---|---|---|
| 存储器 | 本地磁盘 | 选择本地磁盘类型 |
| 基础路径 | /opt/surveyking/files | 后端所在服务器的绝对路径,运行用户必须可读写 |
| 自定义域名 | http://survey.example.com | 使用用户实际可访问的地址;启用 HTTPS 时使用 https://,末尾不加 / |
保存后,将该项设为主配置,点击“测试”,确认返回的文件地址可以打开。本地文件通过后端接口访问,上面的 Nginx /admin-api 代理已覆盖该路径。
若改用 /data/files 等其他目录,请先在后端服务器上创建目录并授予运行用户权限,再修改“基础路径”:
sudo install -d -o surveyking -g surveyking -m 0750 /data/files
完成初始化后,创建一个测试问卷并提交答卷,检查后台数据,以及附件上传、预览和下载。确认登录、填写和文件访问都正常后,再正式使用。
7. 常用运维命令与问题排查
# 查看后端状态与最近日志
sudo systemctl status surveyking --no-pager
sudo journalctl -u surveyking -n 100 --no-pager
# 修改配置后重启后端
sudo systemctl restart surveyking
# 停止后端
sudo systemctl stop surveyking
# 修改 Nginx 配置后检查并加载
sudo nginx -t && sudo systemctl reload nginx
| 现象 | 检查内容 |
|---|---|
| 数据库连接失败 | DM8 服务和 5236 端口、应用用户名与密码、内网连通性 |
| 提示表或函数不存在 | SQL 是否成功导入、JDBC URL 的 schema 是否一致、两个兼容参数是否生效 |
| 导入时提示中文或 SQL 语法错误 | SQL 文件和 disql 环境是否使用 UTF-8,实例参数是否符合本文要求 |
| Redis 提示认证失败 | 无密码时是否仍设置了密码项或密码环境变量;有密码时配置值是否正确 |
| 授权校验失败 | --license.path 指向的文件是否可读、授权是否与服务器匹配且在有效期内 |
| 页面空白或资源 404 | dist/public、dist/admin 目录及 Nginx 路径是否一致,静态文件是否可读 |
| 接口返回 502 | 后端是否启动成功、Nginx 上游地址是否正确、代理连接是否被系统访问策略拦截 |
| 文件上传或访问失败 | 文件配置的基础路径、运行用户权限、自定义域名和主配置是否正确 |
日常备份应包括达梦数据库、本地附件目录、外部配置和授权文件。
使用 TongWeb 等国产中间件
可按项目要求将应用服务器替换为 TongWeb 等国产中间件。实施前请向交付方确认中间件版本、Java 版本及对应的部署包,并按照该部署包的说明安装;若中间件采用 WAR 部署,需要提供相应的 WAR 包。
替换后仍需配置 DM8、Redis、授权文件和附件目录,并将 Nginx 的接口代理指向中间件实际监听的地址和端口,保持 /admin-api、/captcha 等对外路径一致。完成部署后,同样需要进行系统初始化和文件存储配置。