医院信息系统(HIS)的部署就像搭建一栋数字化医院大楼,需要先打好地基。我建议使用CentOS 7作为基础操作系统,这个版本在企业级应用中稳定性已经得到充分验证。内存建议配置8GB以上,特别是当需要同时运行Elasticsearch和MySQL这些内存消耗较大的服务时。
在开始前,我们需要准备好以下组件:
我遇到过不少新手在环境准备阶段就踩坑,最常见的问题是依赖包缺失。建议先执行yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel安装基础开发工具链。对于生产环境,还需要考虑配置防火墙规则和SELinux策略,这里我们可以暂时关闭防火墙和SELinux以便测试:
bash复制systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
Nginx在这个架构中扮演着重要角色,它需要同时处理三项任务:
我推荐从源码编译安装Nginx,这样可以灵活启用需要的模块。以下是实测可用的编译参数:
bash复制./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-pcre
配置动静分离时,我踩过一个坑:location匹配规则顺序很重要。应该把精确匹配放在前面,模糊匹配放在后面。这是我的推荐配置:
nginx复制server {
listen 80;
server_name www.his.cn;
# 静态资源
location / {
root /usr/local/nginx/html;
try_files $uri $uri/ /index.html;
}
# API代理
location /prod-api/ {
proxy_pass http://127.0.0.1:8888/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
部署Vue项目后,记得处理路由刷新404问题。我通常会在Nginx配置中添加try_files $uri $uri/ /index.html;这条规则。另外建议开启gzip压缩,可以显著减少前端资源加载时间:
nginx复制gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
MySQL是HIS系统的核心数据存储,我建议采用MySQL 8.0版本,它在性能和安全性方面都有显著提升。安装完成后,第一件事就是修改默认密码策略,否则创建简单密码会遇到麻烦:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
SET GLOBAL validate_password.policy=LOW;
SET GLOBAL validate_password.length=4;
针对医疗系统的特点,我总结了几点MySQL优化建议:
ini复制[mysqld]
innodb_buffer_pool_size = 4G
query_cache_type = 1
query_cache_size = 256M
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
创建业务数据库和用户时,要注意权限最小化原则。这是我为HIS系统创建的数据库和用户:
sql复制CREATE DATABASE his CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'his_user'@'%' IDENTIFIED BY 'his_password';
GRANT ALL PRIVILEGES ON his.* TO 'his_user'@'%';
FLUSH PRIVILEGES;
导入初始数据后,建议立即创建备份。我习惯使用mysqldump配合cron定时任务:
bash复制mysqldump -uroot -p his > /backup/his_$(date +%Y%m%d).sql
Redis的配置看似简单,但有几个关键点需要注意。首先是内存淘汰策略,医疗系统推荐使用volatile-lru,这样只在内存不足时淘汰设置了过期时间的key。其次是持久化配置,建议同时启用RDB和AOF:
redis复制maxmemory 2GB
maxmemory-policy volatile-lru
appendonly yes
appendfsync everysec
Elasticsearch的配置更需要特别注意,我遇到过不少因为JVM堆内存设置不当导致的问题。建议堆内存不超过物理内存的50%,且不超过32GB。这是我的jvm.options配置:
yaml复制-Xms4g
-Xmx4g
针对中文搜索,ik分词器是必备插件。安装后可以通过以下API测试分词效果:
bash复制curl -X POST "http://localhost:9200/_analyze" -H 'Content-Type: application/json' -d'
{
"analyzer": "ik_max_word",
"text": "患者主诉头痛发热三天"
}'
对于医疗专业术语,我建议自定义词典。在config/analysis-ik目录下新建custom.dic文件,添加专业术语后修改IKAnalyzer.cfg.xml:
xml复制<entry key="ext_dict">custom.dic</entry>
后端部署最关键的准备工作是正确配置application.yml。我整理了几个容易出错的配置项:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/his?useSSL=false&serverTimezone=Asia/Shanghai
username: his_user
password: his_password
redis:
host: localhost
password: hisadmin
database: 0
rabbitmq:
host: localhost
port: 5672
username: admin
password: hisadmin
virtual-host: /his
启动SpringBoot应用时,我推荐使用nohup配合日志轮转:
bash复制nohup java -jar -Dspring.profiles.active=prod HIS-api-1.0-SNAPSHOT.jar > his.log 2>&1 &
为了确保服务稳定性,可以配置systemd服务单元:
ini复制[Unit]
Description=HIS Backend Service
After=syslog.target network.target
[Service]
User=root
ExecStart=/usr/bin/java -jar /opt/his/api/HIS-api-1.0-SNAPSHOT.jar --spring.profiles.active=prod
SuccessExitStatus=143
Restart=always
[Install]
WantedBy=multi-user.target
联调阶段最容易出现跨域问题。我通常在后端配置全局CORS过滤器:
java复制@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*");
}
}
测试挂号流程时,需要模拟完整的就诊数据流:
可以使用Postman创建测试集合,或者编写简单的Shell测试脚本:
bash复制# 测试挂号接口
curl -X POST "http://localhost:8888/prod-api/registration" \
-H "Content-Type: application/json" \
-d '{"patientId":1001,"deptId":2,"doctorId":5,"regType":1}'
完善的监控系统能提前发现潜在问题。我推荐使用Prometheus+Grafana组合监控以下指标:
SpringBoot应用可以添加Actuator端点:
xml复制<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
日志管理建议使用ELK栈,特别是对于分布式部署。关键的日志收集配置:
properties复制logging.file.name=/opt/his/logs/his-api.log
logging.level.root=info
logging.level.com.his=debug
对于生产环境,还需要考虑日志轮转。可以使用logrotate配置:
conf复制/opt/his/logs/*.log {
daily
rotate 30
compress
missingok
notifempty
copytruncate
}
安全加固是上线前的必要步骤。我总结了几点关键措施:
redis复制# 在redis.conf中添加
rename-command FLUSHDB ""
rename-command FLUSHALL ""
rename-command CONFIG ""
对于性能调优,我通常从这几个方面入手:
bash复制# JVM调优示例
java -jar -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 HIS-api.jar
数据库索引是提升查询性能的关键。这些是HIS系统必须创建的索引:
sql复制CREATE INDEX idx_patient_id ON pms_patient(patient_id);
CREATE INDEX idx_case_history ON dms_case_history(patient_id, visit_date);
CREATE INDEX idx_prescription ON dms_medicine_prescription_record(patient_id, create_time);