服务的一般性配置
1. 1. 启动脚本的配置
默认启动时没有设置jvm堆内存大小的,在某些系统上,可能只会占用非常少的内存,造成系统浪费和程序出现问题,可以参考《一次IM服务崩溃问题分析总结》。 针对不同的启动方式,有不同的修改方法。
- 压缩包命令行启动:在软件包bin目录下找到
wildfirechat.sh
脚本,在脚本的倒数第二行放开JVM内存的配置。 - Service方式启动:在
/opt/im-server/bin
目录下找到wildfirechat.sh
脚本,在脚本的倒数第二行放开JVM内存的配置。 - Docker方式启动:在启动参数中设置JVM内存的配置。
最大内存也不能设置过大,还需要留给操作系统、堆外内存、程序占用空间等预留。可以设置为所有内存的50%-75%之间。
linux文件格式和windows格式是有区别的,如果windows下改动启动脚本后可能会保存为windows格式,在linux上执行会出现错误。请参考服务器问题中的问题3。
2. 2. IM服务配置
2.1. 配置文件位置
在IM服务的wildfirechat.conf
是野火IM服务的配置文件。在不同的启动方式下,也是位于不同的目录
- 压缩包命令行启动:在软件目录下的config目录下。
- Service方式启动:在
/etc/im-server/config
目录下 - Docker方式启动:在启动参数中指定的配置目录下。
2.2. 配置项说明
2.2.1. 关于数据库的配置
- 关于关系型数据库的配置,正式上线时,一定要切换到非H2DB。如果数据量非常大,可以考虑关系型数据库+mongodb组合使用:
## 数据库类型。0 mysql;1 h2db;2 mysql+mongodb;3 kingbase-v8;4 dameng;5 sql server;6 postgresql;7 shentong。
## 内置数据库仅建议在研发时使用,上线请使用其他专业数据库。专业版集群部署时不能使用内置数据库。
## 如果使用非内置数据库,需要配置好c3p0的JDBC、用户名和密码等配置项,c3p0.xml在config目录下。金仓和达梦数据库需要按照migrate下的说明文件来手动创建库、创建表和初始化数据,其它数据库会自动处理建库建表初始化数据等。
## MySQL需要把事物隔离级别改成"Read committed",使用命令来修改"set global transaction_isolation='read-committed';",其他数据库默认已经是这个级别不用修改
## 如果是MySQL5.7,需要开启长索引的支持,在数据库中执行命令:"set global innodb_large_prefix=on;"。其他版本默认支持,不用修改。
embed.db 0
## 是否自动清理历史消息记录,当为true时,IM服务会定时扫描t_messages_x和t_user_messages_x表,清除掉db.keep_history_message_days天前的历史消息。
## 如果不开启自动清理,需要手动清理t_messages_x和t_user_messages_x表内的历史数据,保存数据不能超过3年。
## 使用mongodb时次开关无效(因为mongodb设置了消息过期时间,会自动清理)。
db.auto_clean_history_messages true
## 保留历史消息的天数,只有在db.auto_clean_history_messages为true时有效,默认值和最大值都是1095天(365*3),如果需要保存更长久时间,需要在到期之前进行转储。
db.keep_history_message_days 1095
## 消息不存在在数据库中,仅使用内存缓存。缓存最长保留7天,实际可能因内存不足很快被淘汰,可能会出现丢消息的情况。建议非特殊场景,不能打开此开关。
#db.not_save_message false
## 手动创建数据库。当此开关打开时,需要确保IM服务使用的数据库已经创建,IM服务不再尝试自动创建。金仓/达梦/神通数据库都需要手动创建,不受此开关影响。
#db.manual_create_database false
## 手动管理表及数据升级。当此开关打开时,需要确保手动执行数据库升级脚本。金仓/达梦/神通数据库都需要手动创建,不受此开关影响。
#db.manual_migration false
## 某些使用schema的数据库,默认需要schema域库名一致。如果需要使用不一致的schema,可以打开下面这个配置,配置为正确的schema.
#db.schema wfchat
## 如果数据库是表名和字段大小写敏感,且字段全是大写。可以打开下面这个配置,这样服务会把所有sql语句强制转化为大写。一般情况不要打开此开关
#db.sql_force_uppercase true
## h2db数据库的路径,默认为程序目录下的,可以指定其他目录。如果使用MySQL,可以忽略此配置
h2db.path ./h2db/wfchat
如果要切换到非H2DB,需要配置在config
目录下c3p0.xml
,配置数据的JDBC地址账号和密码相关信息。如果是金仓/达梦/神通数据库,需要按照migrate下的说明文件来手动创建库、创建表和初始化数据。
- 关于MongoDB数据库的配置,如果
db.save_messages_in_mongodb
为true,需要配置MongoDB。
## 消息是否存储在mongodb中。开关打开时只有消息和用户消息表存储在mongodb中,其他比如用户信息、群组信息等都还存储在关系数据库中。
## 开关打开时,必须正确配置后面的mongodb相关配置。
## 当embed.db为2时,db.save_message_in_mongodb取true值(兼容历史配置)。
db.save_messages_in_mongodb false
#*********************************************************************
# MongoDB configuration
#*********************************************************************
#专业版支持,社区版请忽略
#mongodb.client_uri mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
#mongodb.client_uri mongodb://host1:27017,host2:27017,host3:27017/wfchat?replicaSet=myReplicaSet
mongodb.client_uri mongodb://wfc:123456@localhost:27017/wfchat
#密码中不能有#等特殊字符,如果某些字符的密码无法连接,请尝试更新简单密码。
mongodb.database wfchat
#数据库消息过期时间,最长时间是3年减一个月。
mongodb.data_expire_days 1064
2.2.2. 关于Server API的配置
#管理端口
http.admin.port 18080
##服务器管理接口密钥。修改此端口时需要同步修改所有使用管理API的地方,比如应用服务、minio对象存储服务等。
http.admin.secret_key 123456
##服务器API接口参数是否检查时间。当设置为false时,所有的请求会检查时间的有效性;当设置为true时,可以在http.admin.secret_key保持不变的情况下,使用固定的服务API签名
##nonce = "76616", timestamp = "1558350862502", sign = "b98f9b0717f59febccf1440067a7f50d9b31bdde"
http.admin.no_check_time false
上线时,需要把http.admin.no_check_time
改成false,http.admin.secret_key
改成复杂密码,需要注意所有使用server api的服务都要同步这个密码。包括应用服务,Minio对象存储服务,开放平台服务等等。
2.2.3. 关于限频的配置
##API接口限频设置,时间是10秒内允许的请求次数。
##管理api频率限制,默认是10秒10000次。
http.admin.rate_limit 10000
##机器人api频率限制,默认是10秒1000次,按照机器人ID区分。
http.robot.rate_limit 1000
##频道api频率限制,默认是10秒1000次,按照频道ID区分。
http.channel.rate_limit 1000
##客户端请求频率限制,默认是10秒100次。通常情况下不要修改这个值。
client.request_rate_limit 100
默认这个配置就可以满足需求,如果有压力测试,或者业务繁忙出现超频错误码,可以考虑扩大数值。
2.2.4. 回调配置
野火IM可以把各种事件回调到指定地址。需要注意是回调需要快速返回,防止拉慢IM服务。
#*********************************************************************
# Push server configuration
#*********************************************************************
##推送服务项目地址:https://github.com/wildfirechat/push_server。
##安卓推送服务器地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
push.android.server.address http://localhost:8085/android/push
##苹果推送服务器地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
push.ios.server.address http://localhost:8085/ios/push
##其他平台推送服务器地址,比如使用web或者pc等推送。特殊场景下使用
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#push.other.server.address http://localhost:8085/other/push
#*********************************************************************
# 监控配置
#*********************************************************************
##异常事件产生回调
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#monitor.exception_event_address http://localhost:8888/im_exception_event/
#*********************************************************************
# 各种事件回调
#*********************************************************************
##用户在线状态事件回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#user.online_status_callback http://localhost:8888/im_event/user/online
##用户信息变动事件回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#relation.relation_update_callback http://localhost:8888/im_event/user/relation
##用户信息变动事件回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#user.user_info_update_callback http://localhost:8888/im_event/user/info
##消息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.forward.url http://localhost:8888/im_event/message
##需要转发的消息类型,当有多个时以英文逗号分割,可以用-来指定区间,注意区间不能太大,因为要把区间内的所有数字都放入到Set中。如果转发所有消息,请注释掉配置或者设置为空
#message.forward.types 1,2,3,5-10
##需要转发的消息类型,当有多个时以英文逗号分割,可以用-来指定区间,注意区间不能太大,因为要把区间内的所有数字都放入到Set中。
#message.forward.exclude_types 1,2,3,5-10
##敏感消息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.sensitive.forward.url http://localhost:8888/im_event/message
##提醒消息转发地址,@全体用户和@某个用户消息会回调此地址。
##此转发不受${message.forward.types}和${message.forward.exclude_types}限制。
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.mentionmsg.forward.url http://localhost:8888/im_event/message
##撤回消息转发地址,当用户撤回消息会回调此地址。
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.recallmsg.forward.url http://localhost:8888/im_event/recall_message
##设备信息转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#things_message.forward.url http://localhost:8087/im_event/things/message
##已读事件转发地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#message.read.forward.url http://localhost:8888/im_event/message_read
##群组信息变动事件回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#group.group_info_update_callback http://localhost:8888/im_event/group/info
##群组信息变动事件回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#group.group_member_update_callback http://localhost:8888/im_event/group/member
##频道信息变动回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#channel.channel_info_update_callback http://localhost:8888/im_event/channel/info
##聊天室信息变动回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#chatroom.chatroom_info_update_callback http://localhost:8888/im_event/chatroom/info
##聊天室成员变动回调地址
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#chatroom.chatroom_member_update_callback http://localhost:8888/im_event/chatroom/member
##会议创建事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.create_callback http://localhost:8888/im_event/conference/create
##会议销毁事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.destroy_callback http://localhost:8888/im_event/conference/destroy
##会议成员加入事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.member_join_callback http://localhost:8888/im_event/conference/member_join
##会议成员离开事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.member_leave_callback http://localhost:8888/im_event/conference/member_leave
##会议成员发布流事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.member_publish_callback http://localhost:8888/im_event/conference/member_publish
##会议成员取消发布流事件
##注意回调是单线程回调,接收服务必须在同一内网,且异步处理快速返回,否则会有延迟问题!!
#conference.member_unpublish_callback http://localhost:8888/im_event/conference/member_unpublish
2.2.5. 关于对象存储服务的配置
请参考链接进行配置:https://docs.wildfirechat.cn/server/oss.html
#*********************************************************************
# Media server configuration
#*********************************************************************
##存储使用类型,0使用内置文件服务器(仅供用于研发测试),1使用七牛云存储,2使用阿里云对象存储,3野火私有对象存储,4对象存储网关,5腾讯云存储,6华为云存储, 7AWS S3, 8京东云存储。
## 下面提供的对象存储配置示例,实际不可用。需要自己开通对应云服务或者部署野火私有对象存储服务。
media.server.media_type 0
## OSS配置,可以是七牛/阿里云OSS/野火私有OSS/野火对象存储网关/腾讯云存储。配置方法请参考文档。
## server_host与社区版不同,不能带http头和port。port配置在media.server_port和media.server_ssl_port属性。
media.server_host up.qbox.me
media.server_port 80
# 如果不支持SSL,这里配置为0,不要删掉。不能跟media.server_port相同。
media.server_ssl_port 443
media.access_key tU3vdBK5BL5j4N7jI5N5uZgq_HQDo170w5C9Amnn
media.secret_key YfQIJdgp5YGhwEw14vGpaD2HJZsuJldWtqens7i5
## 服务地域,AWS S3和京东云需要配置,其他不用处理。
media.server.region us-east-2
## bucket名字及Domain
media.bucket_general_name media
media.bucket_general_domain http://cdn.wildfirechat.cn
media.bucket_image_name media
media.bucket_image_domain http://cdn.wildfirechat.cn
media.bucket_voice_name media
media.bucket_voice_domain http://cdn.wildfirechat.cn
media.bucket_video_name media
media.bucket_video_domain http://cdn.wildfirechat.cn
media.bucket_file_name media
media.bucket_file_domain http://cdn.wildfirechat.cn
media.bucket_sticker_name media
media.bucket_sticker_domain http://cdn.wildfirechat.cn
media.bucket_moments_name media
media.bucket_moments_domain http://cdn.wildfirechat.cn
media.bucket_portrait_name storage
media.bucket_portrait_domain http://cdn2.wildfirechat.cn
media.bucket_favorite_name storage
media.bucket_favorite_domain http://cdn2.wildfirechat.cn
2.2.6. 关于音视频高级版的配置
如果想要使用音视频高级版,请参考连接 https://gitee.com/wfchat/wf-janus 进行配置。
#*********************************************************************
# 音视频会议
#*********************************************************************
#音视频服务id,需要与Janus服务配置的ID对应,建议上线时同步修改为UUID。
conference.client_list conference_server_1, conference_server_2, conference_server_3
#音视频服务录制策略。0 不允许录制,1 总是录制,2 客户端选择是否录制。
conference.record_strategy 0
#强制录制文件名称。一般情况下请保持为false。
conference.fixed_record_file_name false
#填写当前IM服务的内网地址,音视频服务会去连接本服务的内网地址。如果不配置,音视频服务会去连接外网地址,强烈建议配置。
#conference.signal_server_address 192.168.3.120
2.2.7. 关于epoll的配置
# 如果是linux系统,一定要打开下面这个参数,能大幅度提高性能。如果是arm64架构,把IM服务软件包下arm64_epoll_lib目录中的jar包放到lib目录下。
# 除了x86_64和arm64架构外,其他架构没有对应的epoll native sdk,所以其他架构请保持epoll关闭状态。
#netty.epoll true
2.2.8. 配置中的密码加密
野火IM服务配置中有多个密钥,如果服务被黑客入侵,这些信息很容易被找到并实施破坏。可以对这些密钥进行加密,加密的方法在软件包的skt
目录下。注意删除说明文件中的密钥另外保管。