版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FreeSwitch+Opensips集群
安装配置操作指导书
拟制:日期:
杨机智2015-9-24
PreparedbyDate
审核:日期:
ReviewedbyDate
审核:日期:
ReviewedbyDate
批准:日期:
GrantedbyDate
修订记录Revisionrecord
日期修订版本修改描述作者
DateRevisionchangeDescriptionAuthor
version
2015-9-241.00初稿完成杨机智
目录TableofContents
1集群组网.............................................................................7
2Opensips安装配置....................................................................7
2.1环境说明.........................................................................7
2.2安装依赖的包.....................................................................8
2.3安装Opensips............................................................................................................................8
2.4配置Mysql...................................................................................................................................8
2.5复制启动脚本.....................................................................8
2.6启动Opensips............................................................................................................................9
3集群配置.............................................................................9
3.1Opensips负载均衡配置............................................................9
3.2Freeswitch集群配置..............................................................12
3.2.1环境说明....................................................................12
3.2.2安装依赖的包................................................................12
3.2.3ODBC配置..................................................................13
3.2.4Freeswitch安装..............................................................13
3.2.5数据库共享配置..............................................................14
3.2.6账号数据库验证模式配置....................................................14
3.2.7HighAvailability配置.........................................................16
3.2.8共享数据库表结构说明........................................................16
3.3NFS文件共享配置...............................................................18
3.3.1NFS软件包安装..............................................................18
3.3.2NFSServer配置.............................................................18
3.3.1NFSServer启动关闭.........................................................19
3.3.1NFSCIiem配置..............................................................19
3.3.1NFSClient挂载卸载..........................................................20
3.1rsync文件同步配置...............................................................20
3.1.1rsync介绍...................................................................20
3.1.2rsync安装...................................................................20
3.1.3rsync服务端配置.............................................................20
3.1.4rsync客户端配置.............................................................21
3.1.5rsync文件同步...............................................................22
4常见问题解决方法...................................................................22
4.1用nslookup解析域名解析不了...................................................22
4.1.1现象描述....................................................................22
4.1.2原因分析....................................................................22
4.1.3处理方法....................................................................22
4.2数据库连接不上.................................................................23
4.2.1现象描述....................................................................23
4.2.2原因.........................................................................23
4.2.3解决方法....................................................................23
图目录ListofFigures
图1XX图Figure1XX...........................................................................................错误味定义书签。
FreeSwitch+Opensips集群
安装配置操作指导书
关键词Keywords:FreeSwrch,Opensips,NFS,集群
摘要Abstract:本文介绍了Freeswitch+Opensips集群的安装与配置
缩略语清单Listofabbreviations:
Abbreviations缩略语Fullspelling英文全名Chineseexplanation中文解释
1集群组网
集群组网如下图所示:
Opensips+FS+NFS集群组网
集群组网说明:
Opensips部署在前端,作为集群的负载均衡器,同时负责疝FS节点的健康检查及故障转移
Freeswitch服务器集群部署在中间,提供注册及通话等服务
后端为mysql数据库及NFS服务器,mysql提供Freeswitch集群各节点的注册信息、会话信息的共享,
NFS服务器提供Freeswitch集群各节点配置文件的共享
2Opensips安装配置
2.1环境说明
操作系统:CentOS6.332位〔会升级为6.6)
数据库:Mysql5.1.73
2.2安装依赖的包
#yuminstallgcc-c++bisonflexlynxsubversion
2.3安装Opensips
从官方网站:http方/www.opensips.org/,卜.载稳定的版本,当前为:1.11.3
解压:
#tar-zxvfopensips-1_11.3_src.tar.gz
安装:
#cdopensips-1.11.3-tls
#makemenuconfig(选择ConfigureCompi1eOptions-ConfigureExcluded
Modu1es---mysq1)
#makeinclude.moduies=wdbjnysql”prefix="/usr/localwinstall
完成之后会在/usr/lccal/etc/下生成opensips文件夹
2.4配置Mysql
1.进入[安装目录]/ctc/opensips/,编辑opcnsipsctlrc乂件
DBENGINE:MYSQL(可选的有MYSQL,PGSQL,ORACLE,DB_BERKELEY,orDBTEXT)
DBHOST=localhost(数据库所在主机)
DBNAME=opensips(数据库的名称)
DBRWUSER=opensips(数据库的用户名)
DBRWPW=opensips(数据库的密码)
I)BROOTUSER=root(使用该数据库的用户)
2.在[安装目录]/sbin/下运行:./opensipsdbctlcreate
3.进入Mysql修改权限:
grantal1privilegesonopensips.*toopensips@loca1hostidentif'iedby'opensips';
2.5复制启动脚本
#cp/usr/src/opensips-1.11.3-tIs/packaging/rpm/opensips.init/etc/init.d/opensips
#sed-iz/s/\/usr\/sbin\/cpensips/\/usr\/local\/sbin\/opensips/g,z/etc/init.d/opensips
#sed-i"s/\/ctc\/opcnsips/\/usr\/local\/ctc\/opcnsips/g"/ctc/init.d/opcnsips
#sed-i^s/X/etcX/defau11\/opensips/Vusr\/1ocal\/etc\/opensips/g^
/etc/init.d/opensips
#sed-i〃s/RUN_OPENSIPS=ro/RUN_OPENSIPS=yes/g"/etc/init.d/opensips
chmod+x/etc/init.d/opensips
2.6启动Opensips
进入[安装目录]/sbin/运行:./opensips
3集群配置
3.1Opensips负载均衡配置
步骤1、修改opensips,cfg文件(建议先备份)
debug=6#设置输出的H志级别
logstderror=yes#将3打印到控制台上
log_facility=LOG_LOCALO#日志输出
fork=no#启动到前台,便于调试
childrcn-4
disabletcp=yes
dns_try_ipv6=no
autoaliases=no
disable_tls=yes
listen=udp:10.3.4.240:5060#用于监旷IP地址和端口
#加载的模块
#setmodulepath
mpath=n/usr/local/lib/opensips/modules/"
####SIGNALINGmodule
loadmodule"signaling.s。"
####StateLessmodule
loadmoduleusl.so"
####TransactionModule
loadmodule"tm.s。"
modparam("tm",ufr_timeout",5)
modparam("tm*',"fr_inv_timeoutH,30)
modparam("tm',,nrestart_fr_on_each_replyH,0)
modparam("tm*',”onreply_avp_mode”,1)
modparam(•'tm",,'fr_timeru,2)
####RecordRouteModule
loadmodulenrr.so"
/*donotappendfromtagtotheRR(noneedforthisscript)*/
modparam(Hrr",nappencl_fromtag'*,1)
modparam("rr","enable_double_rrn,1)
####MAXForWarDmodule
loadmoduleumaxfwd.so"
####SIPMSGOPerationSmodule
loadmodule“sipmsgops.so”
####FIFOManagementInterface
loadmodulenmi_fifo.so"
nH
modparam(mi_fifo"f"f二fo_name",/tmp/opensips_fifo")
#modparam(nmi_fifo",nfifo_mode",0666)
####URImodule
loadmodule"uri.so”
modparam("uri","use_uri_table”,0)
####USeRLOCationmodule
loadmodule“usrloc.so”
modparam(*usrloc*,"nat_bflag","NAT")
modparam(*usrloc*,“dbjnode”,0)
#期#REGISTRARmodule
loadmodule“registrar,so”
modparam("registrar","tcp_persistent_flag","TCP_PERSISTENT")
/*uncommentthenextlinenottoallowmorethan10contactsperAOR*/
#niodparani("registrar","maxcontacts”,10)
####.ACCountingmodule
loadmodule"acc.so”
/*whatspecialeventsshouldbeaccounted?*/
modparam("acc","earlyjncdia”,0)
modparam("acc","reportcancels^,0)
/*bydefaultwedonotadjustthedirectofthesequentialrequests,
ifyouenablethisparameter,besuretheenable"append_fromtag”
in"rr"module*/
modparam("acc",*detect_directionw,0)
modparam("acc",*failed_transaction_flag*,"ACC_FAILED")
/*accounttriggers(flags)*/
modparam("acc","log_flag","ACC_D0")
modparam("acc","log_missed_flag","ACC_MISSED")
loadmoduletextops,so”
###db_mysqlmodu1e
loadmodule“dbjnysql.so”
dbdefaulturl=^mysql://opensips:opensips@localhost/opensipsw
###dialogmodu1e
loadmodule"dialog,so”
modparam("dialog","db_mode”,1)
modparam("dialog","dburl”,,zmysq1://opensips:opensips@localhost/opensipsw)
##相dispatchermodule
loadmodule“dispatcher,so”
modparam("dispatcher”,“db_url","mysql://opensips:opensips@localhost/opensipsz,)
modparam("dispatcher","ds_ping_method","OPTIONS")
modparam("dispatcher”,“ds_ping_inlerval”,5)
modparam("dispatcher","dsjDrobingthreshhold",2)
modparam("dispatcher”,z/ds_probingmod。",1)
####loadbalancermodu1e
loadmodule/zload_balancer.so”
modparam(,zloadbalancer","db_url”,^mysql://opensips:opensips@localhost/opensipsw)
modparam(*loadbalancer","probingmethod",“OPTIONS")
modparain(*1oadba1ancer7",,/probing_intervalz,,5)
舶#琳##RoutingLogic####«###
#mainrequestroutinglogic
route{
if(!mf_process_maxfwd_header(^lO*)){
sl_send_reply(“483","TooManyHops");
exit;
}
if(!has_totag()){
#initialrequest
record_route();
}else(
#sequentialrequest-obeyRouteindication
loose_route();
t_relay();
exit;
}
#CANCELprocessing
if(isjnethod("CANCEL"))
(
if(t_check_trans())
t_relay();
exit;
)
#fromnowonwehaveonlytheinitialrequests
#selectthenodethat*11handlethecall(loadbalanced)
#themethodusedisdifferentforinvite/registerrequests
#unknownmethodsarerejectedhere
if(is_methodC!NVnr)){
if(!loadbalanced","pstn","1")){
sendreply(z,503,\"ServiceUnavailable");
exit;
)
}elseif(isjnethod("REGISTER")){
if(!ds_select_dstCl*,*0*)){
sendreply(“503","ServiceUnavailable");
exit;
}
}else(
sendreply("405","MethodNotAllowed*);
exii;
#routetherequest
if(!t_relay()){
sl_repiy_en'or();
}
}
步骤2、添加Freeswitch节点
添加Freeswitch节点作为负载均衡:
mysql>useopensips;
mysql>insertintoload_balancer(group_idrdst_uri,resources,description)
values(1,'sip:10.3.4.230','pstn=32',TSI');
mysql>insertintoload_balancer(group_idzdst_uri,resources,description)
values(1,*sip:10.3.4.232*,,pstn=32',*FS2,);
mysql>quit;
添加分发器节点:
格式为:opcnsipsctldispatcheraddgw<setid><dostination><socket><state><weight><attrs>
[description]
opensipsctldispatcheraddgw1sip:10.3.4.230'1050,FS1*'230cluster-FSl,
opensipsctldispatcheraddgw1sip:10.3.4.2321'050*FS1*'230cluster-FSl*
此时就可以将SIP客户端注册到regserver,yealink.com上,可以看到两个Freeswitch的节点上发现了注
册日志
3.2Freesw让ch集群配置
3.2.1环境说明
操作系统:CentOS6.332位(后面会更新成6.6)
Freeswitch:1.4
数据库:Mysql5J.73
3.2.2安装依赖的包
系统需要的包:
#yuminstallgitgcc-c++autoconfautomakelibzoolwgetpythonncurses-devel
zlib-devel1jbjpeg-developenssl-devele2fsprogs-develsql.ite-devel
libcurl-develpcre-develspeex-develIdns-devellibedit-devel
ODBC需要的包:
#yuminstallunixODBCunixODBC-devel
Mysql需要的包:
#yuminstallmysql-connector-odbc
更新系统的内核及依赖包:
#yum-yupdate
3.2.3ODBC配置
1、修改/etc/odbc.ini配置要连接的数据库信息
[freoswitch]
Driver=/usr/1ib/1ibmyodbc5.so
SERVER=10.3.4.220(数据库地址)
PORT=3306
DATABASE=freeswitch(数据库上要先创建该数据库名称)
USER=root(数据库用户名)
PASSWORD=123456(数据库密码)
OPTION=67108864(freeswitch会将多条SQL语句放一起执行,提高效率)
2、/etc/odbcinst.ini修改mysq的部分,将驱动包指向正确,关注Mysql数据库配置即可,
[MySQL]
Description=ODBCforMySQL
Driver=/usr/1ib/1ibmyodbc5.so
Setup=/usr/1ib/1ibodbcmyS.so
FileUsage=1
3、修改之后,执行isql-vfreeswitch
如果出现
[root@testetc]#isql-vfreeswitch
+----------------------------------------+
Connected!
II
sql-statement
help[tablename]
Iquit
II
+----------------------------------------+
SQL>
则代表你的unixodbc配置成4了
3.2.4Freeswitch安装
#cd/usr/local/src
#gitclone-bvl.4https://freeswitch.or^/stash/scm/fs/Freeswitch.Rit
#cd/usr/local/src/Freeswitch
#./configure--enable-core-odbc-support
#make
#makeinstall
#makecd-sounds-install(声音包)
#makecd-moh-install(声音包)
完成之后会默认在/usr/loca"路径下
3.2.5数据库共享配置
在每■—个Freeswitch集群节点按照如下设置数据库共享:
修改:/usr/local/freeswitch/conf/autoloadconfigs/switch.conf,xml
<paramname="core-db-dsn“value="freeswitch:root:123456”/>
修改:/usr/local/freeswitch/conf/autoload_configs/db.conf,xml
<paramnamc="odbc-dsn“valuc=/l,frecswitch:root:123456w/>
修改:/usr/local/freeswitch/conf/sip_profiles/internal.xml
<paramname="odbc-dsn"value=/zfreeswitch:root:123456w/>
修改freeswitch下的vars.xml文件,将
<X-PRE-PROCESScmd—set"data=,,domain=$${local_ip_v4}"/>
修改成:
<X-PRE-PROCESScmd="sct"data=,/domain=regscrvcr.ycalink.com"/〉
3.2.6账号数据库验证模式配置
Freeswitch默认是采用conf/direct。”/目录下的账号文件米进行注册账号的验证。如果采用
共享数据库的模式,也可以配置成通过mysql数据库的users表来进行注册账号的验证。具体可以
通过如下步骤来修改:
修改freeswitch/conf/autoload_configs/lua.conf,xml,内容如下:
<paramname=z,xml-handlor-script/,value=/,/usr/local/frecswitch/scripts/gcndiruserxml.lua”
/>
<paramname="xml-handler-bindings“value="directory”/>
其中gen_dir_user_xml.lua内容如下:
freeswitch.consoleLog("NOTICE","luataketheusers…\n");
-gone!iruserxml.lua
-examplescriptforgeneratinguserdirectoryXML
-commentthefollowinglineforproduction:
-frcoswitch.consoieLog(//noticc,/,“Debugfromgendiruserxml.lua,providedparams:\nz/
params:serialize()..”\n")
localreq_domain=params:getHeader("domain")
localreq_key=params:getHeader(,zkey,z)
localrequser=params:getHeader("user")
localreqpassword=parans:getHeader(^pass'O
——databasename:freeswitch
-databaseuser:root
-databasemedia:media
localdbh=freeswitch.Dbh("frees*tch","root","media");
freeswitch.consoleLog("NOTICE","startconnectDB…\r\n");
assert(dbh:connected());
-databaseusertablename:Users
dbh:query(""selectpasswordfromUserswhereid=z,..requser,function(row)
freeswitch.consoleLog("NOTICE”,string,format("%s\n”,row.password))
req_password=string.formatrow.password)
end);
dbh:release();
freeswitch.consoleLog("NOTICE","info:.reqdomain.."一.reqkey.."-.requser..,z-.req
password.."\n");
-assert(reqdomainandreqkeyandrequser,
―“Thisexamplescriptonlysupportsgeneratingdirectoryxmlforasingleuser!\n")
ifreqdomain~=nilandreq_key^=ni1andrequser=ni1then
XML_STRTNG=
[[<?xmlversion="l.0"encoding="UTF-8'standalone="no”?>
<documcnttypc-Wfrccswitch/xml,,>
<sectionname=z,directory'^
<domainname=z,]]..req_domain..[[*>
<params>
<paramname="dial-string”
valuc=w{presenceid=$(dialeduser}@${dialeddomain)}${sofiacontact(S{dialeduser}{dialedd
omain})}“/>
</params>
<groups>
<groupname=,,default,,>
<users>
<userid="]]..req_user..[[*>
<params>
<paramname="password"value=/,]]..req_password..[[”/>
<paramname="vm-password“value=z,1]..req_password..[["/>
</params>
<variables>
<variablename=vtollailow*value=,/domestic,international,local'/)
<variablename='*accountcode//value、”]]..req_user..[[”/>
<variablename='vusercontext“value=",defaultz7>
<variablename=vdirectory-visib1e,zvaluo=z,true,//>
<variablename="directory-exten-visible“value=A,true,,/>
<variablename="limit_max"value="15'7》
<variablename='*effective_cal1er_id-name"value="Extension]]..req_user..[[*/>
<variablename='veffective_cal1er_id_number,zvalue="]]..req_user..[[*/>
<variablename=vcallgroupz,value=//tcchsupport,z/>
</variables>
</user>
</users>
</group>
</groups>
</domain>
</section>
</document>]]
else
XML_STRING=
[[<?xmlversion="l.0"encoding="UTF-8'standalone=//no,,?>
<documenttype="freeswitch/xml”>
<sectionname="directory”〉
</section>
</document>]]
end
-commentthefollowinglineforproduction:
freeswitch.conso1eLog(*noticez,,“Debugfromgendiruserxml.lua,generatedXML:\nA
XML_STRING.."\n");
拨号规则配置(用于测试使用)
<include>
<extensionname=,/freeswitch”>
<conditionfield=,,destinationnumberexpression=r(29\d⑵)$”>
<actionapplication="log"data=*INF0testupdatemountfile219”/>
<actionapplication-,,sct/,data-,,dialcd_cxtcnsion_$1/z/>
<actionapplication="/bridge//dala="user/${dialed_extension}@${domainname}"/>
</condition>
</extension>
</include>
3.2.7HighAvailability配置
为了freeswitch在故障之后能够恢复,需要进行3步配置:
1.将故障前的信息写入数据库中,在sip_profiles/internal.xml添加参数:
<paramname="track-calls“value="true〃/>
2.Freeswitch恢复时是通过hostname来查询数据库中的数据,需要在switch,conf,xml中修改:
<paramname="swilchname"value=,,freeswitchz,/>
3.如果手动恢复freeswitch,需要在控制台中执行命令:
Sofiarecover
4.如果自动恢复frees*tch,需要在「reeswiich.xml中添加:
<X-PRE-PROCESScmd="set"data=,,apionstartup=sofiarecover'/)
3.2.8共享数据库表结构说明
表名来源作用备注
aliasesfreesuilch
basic_callfrees”itch通话的基本信息视图
callsfreeswitch通话的记录表,只记录双方的
uuid和时间
channelsfreeswitch记录一次通话的双方具体信息
db_dalafreeswitch
dctailcd_callsfreeswitch通话的详细信息视图
group_datafreeswitch
interfacesfreeswitch保存当前Freeswitch提供出的接
口,可以是application中的也可
以是file中的
limit_datafreeswitch
natfreeswitch
recoveryfrccswitch需要恢复的信息依赖3.2.7的配置记录下通
话的信息
registrationsfreesuitch己注册的SIP账号信息
sip_aulliciiliualioiificcswiluh保存服务器对SIP客户端的消息
摘要信息
sip_dialogsfreesuitch保存每路通话的信息
sip_presencefreeswitch
sip_rcgistrationsfrccswitch保存已注册的SIP客户端信息
sip_sharcd_appcaranccfrccswitch
.dialogs
sip_shared_appearancefreeswitch
.subscriptions
sip_subscriptionsfreeswitch存储非话机的SIP客户端例如使用Xlite注卅时会被
记录到该表中
tasksfreeswitch
users外部创建存储SIP账号目前该表仅做测试使用
数据库表;Users
名称类型长度是否为空是否主键备注
idvarchar128NY
passwordvarchar128NN
3.3NFS文件共享配置
3.3.1NFS软件包安装
NFS服务器和FreeSwitch各节点都要安装nfs和rpcbind软件包:
yum-yinstallnfs-utilsrpcbind
3.3.2NFSServer配置
步骤1:在服务器上创建NFS共享目录:mkdir/usr/local/freeswitch/conf
步骤2:设置共享目录的读写权限:chmod666/usr/local/freeswitch/conf
步骤3:编辑export文件:vi/etc/exports
/usr/local/freeswitch/conf10.3.4.xxx(rw,no_root_squash,no_all_squash,sync)
注意地址和参数表之间没有空格。如果下面设置的mountd端口大于1024,需要在参数表里加入参数:
insecure
步骤4:配置生效:
exportfs-r
注:配置文件说明:
/usr/local/freeswitch/conf为Freeswitch集群各节点共享的目录,使用绝对路径。
10.3.4.xxx(rw,no_root_squ&sh,no_all_squash,sync)为客户端的地址及权限,地址可以是一个
网段(如:/24),一个IP地址或者是一个域名,域名支持通配符,如:*.hpce.cn,
地址与权限中间没有空格。
权限说明:
rw:read-writc,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:M3客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,
也拥有root权限。显然开启这项是不安全的。
root.squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥
有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all.squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名
用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
3.3.1NFSServer启动关闭
启动:
#servicerpcbindstart
ftservicenfsstart
重启:
#servicenfsrestart
关闭:
#servicenfsstop
3.3.1NFSClient配置
步骤1:扫瞄可以使用的NFSServer目录
showmount-e10.3.4.xxx
步骤2:创建挂载目录
mkdir/usr/local/freeswitch/conf〃对于freeswitch节点这一步可以省略,因为目录已
经存在了
步骤3:使用mount进行挂载
mount-tnfs10.3.3.10:/usr/local/freeswitch/conf/usr/local/freeswitch/conf-o
proto=tcp-onolock
注:为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议
步骤4:查看挂载情况
用如下命令查看:
#df
FilesystemiK-blocksUsedAvailableUse%Mountedon
/dev/mapper/VolGroup-lv_rool
516061403471488455132128%/
tmpfs200428802CXJ428S0%/dev/shm
/dev/sdal4958445280941743512%/boot
/dev/mapper/VolGroup-lv_home
4245282722029524027604961%/home
10.34.xxx:/usr/local/freeswitch/conf
516065281611776473733124%/usr/local/frceswilch/conf
注:c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- zara员工考勤制度
- inditex员工考勤制度
- 教务处教师日常考勤制度
- 博物馆考勤制度管理制度
- 公益岗位人员考勤制度
- 学校厨房人员考勤制度
- 单位严格落实考勤制度
- 公务员考勤制度实施细则
- 2026年凝血检验试题及答案
- 十堰国人大药房考勤制度
- 许昌(魏都)循环经济产业园集中供热项目二期工程环评报告
- 地大水文地质学基础-课件
- 第五版-FMEA-新版FMEA【第五版】
- QC成果精装修工程墙面乳胶漆施工质量控制
- 文学批评导引PPT全套教学课件
- 带状疱疹中医治疗
- 财务部门廉洁风险点及防控措施(通用7篇)
- 2023年湖南九嶷职业技术学院单招职业适应性测试题库及答案解析
- 2023年高考天津化学试题(含答案解析)
- GB/T 41328-2022生物天然气
- 基层管理知识培训课件
评论
0/150
提交评论