Linux云服务器企业级知识库线上部署与自动化发布实践

4 篇文章 0 订阅
1 篇文章 0 订阅

知识库介绍:企业级知识库管理系统。

网站前台http://www.wjxxr.com/

全文检索(基于Lucene的全文索引):

管理员后台http://admin.wjxxr.com/

 

知识详情页(使用FreeMark静态化技术,用户直接访问静态化页面,由于Tomcat不适合作为静态资源的web容器,采用Nginx作为静态资源的容器,而Nginx能处理并发的请求为4万左右,大大增加了我们服务器的性能。当用户创建知识条目后,通过MQ发送给页面静态化服务,生成静态页面):

附件文件预览(基于openoffice, 将主流的文档格式转化成可在线预览的html, 附件要生成全文索引,方便供搜索服务检索):

项目架构,可以根据业务的体量选择合适的架构:

分布式SOA服务架构,其中每个服务都可以单独部署在Tomcat等web容器中,每个服务都可以做集群。

集群架构

要特别注意搭建集群后某些业务并发的问题,比如现在有一个业务需求:需要5分钟统计一次各个知识条目的热度,比如下载量,好评率做一个统计分析的定时任务,但这个定时任务在好几台机器上都发布了,我们不能说让每台机子都去执行一下这个定时任务,解决这个问题可以采用分布式锁。

 

在这里,我只只按最小单位部署,不搭集群,搭个单体架构。但为了项目的可扩展性,能比较方便地从单体架构向集群架构向微服务分布式架构演进,项目根据业务模块进行了划分,单个业务之间“高内聚”,不同业务之间“低耦合”。

众所周知,像Dobbo这种消息中间件采用的是RPC,即远程过程调用(Remote Procedure Call, RPC)可以用于一个进程调用另一个进程(很可能在另一个远程主机上)中的过程,从而提供了过程的分布能力。Java 的 RMI 则在 RPC 的基础上向前又迈进了一步,即提供分布式对象间的通讯。这里我采用原生实现了三个web之间通过RMI的调用。

wda-web调用了wcp-web相关接口,rmi协议暂定为:rmi://wcp-web部署的机子的ip地址:8701/luyuanwcpapi

wda-tag调用了wda-web的相关接口,rmi协议暂定为:rmi://wda-web部署的机子的ip地址:8702/luyuanwdaapi

云服务部署流程

云服务器(申请,配置)

建议:安全组策略全部开放,我们通过防火墙和ip接口进行安全控制。不然,安全组策略和防火墙的配置出现重复劳动。

◆ 域名(申请、备案、配置)

 DNS解析:我们可以配置多个二级域名,可以通过Nginx对ServerName进行判断从而对服务进行转发。

◆ 源配置

◆ 用户权限配置

   企业开发中,由于root管理员账号权限太高,为了安全考虑,会分配给不同的开发组具有不同权限的普通账号,比如后端开发人员,数据库开发人员,测试人员,运维人员,不同分工的人员所分配的账号权限不一样。

◆ 线上环境——单体系统架构(后期可以根据业务体量,扩展到“集群架构", "分布式SOA架构",服务直接通过RPC,MQ调用)

    ▪ JDK1.7

    ▪ Tomcat7

    ▪ Maven3.5.4

    ▪ Vsftpd2.2

    ▪ Nginx1.10.2

    ▪ Mysql5.7(注意: Linux下Mysql安装完后默认:区分表名的大小写,不区分列名的大小写; Windows下数据库名、表名、列名、别名都不区分大小写)

    ▪ Git2.8 (业内一般:分支提交,主干发布)

◆ 防火墙的配置(很重要)

◆ 自动化发布脚本

◆ 线上验证

源配置

1、备份

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/,这里我用的是CentOS6.8,所以选择Centos-6.repo

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 

如果是CentOS7及以上版本:

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 

3、之后运行yum makecache生成缓存。

用户权限配置
新建一个具有sudo权限的普通用户,以后都用该账号进行连接(模拟企业真实开发的环境)。
这样该用户操作非/usr/wujie其他目录时,比如该用户想删除/developer/目录下的一个文件,此时由于没有该文件夹的权限,必须用sudo来删除,这样管理员就可以跟踪sudo日志来查看每个开发人员在服务器上的相关操作。
后面会创建一个账号,有登陆ftp服务的权限,但没有登陆云服务器的权限。
给登录名wujie创建一个主目录/usr/wujie, 然后重置一下新创建的账号的密码

useradd -d /usr/wujie -m wujie 
cd /usr/wujie/
passwd wujie

要给该账号赋予一个sudo权限,以其能执行某些只有root用户才能执行的命令。

sudo vim /etc/sudoers

进入以后,查找root关键字:”/root“回车搜索,点击”n“可以切换下一个相同的词。查找到要找的词后,”:noh“可以取消高亮。

在root后面增加:

退出后,以新创建的账号进行连接。

线上环境

1. JDK的安装
先检查一下是否安装了JDK:

rpm -qa|grep jdk

如果有的话,需要卸载该JDK, 用我们自己的指定的JDK: 

rpm -e --nodeps  xxx

(--nodeps就是安装时不检查依赖关系,比如你这个rpm需要A,但是你没装A,这样你的包就装不上,用了--nodeps你就能装上了。--force就是强制安装,比如你装过这个rpm的版本1,如果你想装这个rpm的版本2,就需要用--force强制安装)
也可以通过:

yum remove xxx 

(yum remove 会检查依赖,如果你要移除的包被别的软件包需要的话,它会把其他软件包一起移除。而rpm -e 则会直接告诉你被别的包需要,所以无法移除。)
在根目录下创建一个/develop/setup目录,用于存放软件包

sudo mkdir -p /develop/setup

下载JDK文件到当前setup目录:

sudo wget jdk的网络地址

安装JDK,使用默认路径安装/usr/java:

sudo rpm -ivh jdk-7u80-linux-x64.rpm

然后,配置环境变量:

sudo vim /etc/profile

在末尾添加:

export JAVA_HOME=/usr/java/jdk1.7.0_80
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export PATH=$PATH:$JAVA_HOME/bin
export LC_ALL=en_US.UTF-8

保存退出,使配置生效:

source /etc/profile

看到java的版本信息,说明安装JDK成功。

2. Tomcat7的安装和优化
① 上传tomcat到setup目录。
② 解压到develop目录:

sudo tar -zxvf apache-tomcat-7.0.63.tar.gz -C ../

③ 解压成功后,编辑server.xml文件,对Tomcat7进行优化

  •  字符集改为UTF-8
  • 修改Tomcat的运行模式,从默认的BIO==> NIO。   bio:默认的模式,性能非常低下,没有经过任何优化处理和支持。
     nio:nio(new I/O),是Java SE 1.4及后续版本提供的一种新的I/O操作方式(即java.nio包及其子包)。Java nio是一个基于缓冲区、并能 提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的缩写。它拥有比传统I/O操作(bio)更好的并发运行性能。
  • 在Tomcat中每一个用户请求都是一个线程,所以可以使用线程池提高性能。
  • 连接器
  • 禁用AJP(Apache JServer Protocol)连接器。AJPv13协议是面向包的。WEB服务器和Servlet容器通过TCP连接来交互;为了节省SOCKET创建的昂贵代价,WEB服务器会尝试维护一个永久TCP连接到servlet容器,并且在多个请求和响应周期过程会重用连接。我们使用Nginx+tomcat的架构,所以用不着AJP协议,所以把AJP连接器禁用。
  • 配置tomcat管理员账户:。


   

3.Maven安装

  • 上传apache-maven-3.5.4-bin.tar.gz到/develop/setup/目录下
  •   解压安装
  • 配置环境变量 

注意:最好配置一下国内镜像,不然后面编译项目下载pom依赖时很可能出现下载依赖失败:在conf目录中找到settings.xml 文件,配置mirrors的子节点,添加个阿里云的mirror:

<mirror>  
    <id>nexus-aliyun</id>  
    <mirrorOf>central</mirrorOf>    
    <name>Nexus aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>  
</mirror>

4.FTP服务器安装

  • 下载安装vsftpd,直接从yum下载安装
  • sudo yum -y install  vsftpd (y表示全自动)

    创建一个用户,有ftp的权限但没有登陆云服务器的权限。一般设置这样的帐号是给启动服务的账号所用的,这只是让服务启动起来,但是不能登录系统。比如这里的ftp服务器的连接账号,只是提供启动ftp服务的权限。

  • 在根目录创建 

    sudo mkdir ftpfile
    sudo useradd ftpadmin -d /ftpfile/productimgs -s  /sbin/nologin

     

  •  

  • 修改一下ftpadmin的权限, 要让productimgs目录及其子目录的用户和用户组都为ftpadmin,用户组有rwx的权限,其他用户只有x的权限。
sudo chown -R ftpadmin productimgs/

sudo chgrp -R ftpadmin productimgs/

sudo chmod o+x -R  productimgs/

可以将wujie用户添加到ftpadmin组( usermod -a -G {group-name} username):

sudo usermod -a -G ftpadmin wujie

(sudo chown -R ftpadmin.ftpadmin ./productimgs/, 可以让用户组与用户相同R=4 w=2 x=1 参数-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) )

修改ftpadmin的密码:

sudo passwd ftpadmin
  • 需要将刚刚创建的ftpadmin用户添加到 /etc/vsftpd/chroot_list文件中:
sudo vim /etc/vsftpd/chroot_list 
  • 防止FTP登录报错:500 OOPS错误,需要更改安全策略,确认/etc/selinux/config文件中的SELINUX=disabled

  

 修改/etc/vsftpd/vsftpd.conf的配置。

5. Nginx的安装

  • 将下载好的linux-nginx-1.10.2.tar.gz上传的云服务器
  • 将nginx解压: # sudo tar -zxvf linux-nginx-1.10.2.tar.gz -C ../
  • 由于Nginx需要编译,所以先安装好编译需要的环境,然后进行编译。
  • nginx安装依赖命令

    sudo yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 

  • 加载/nginx-1.10.2/configure(这里可以指定nginx安装的目录,我们一般用它默认的目录)
    sudo ./configure
    sudo make
    sudo make install 

  • 编译完成,在nginx的主配置文件nginx.conf中引入我们自己定义的几个配置文件:

       

  • 在conf目录下创建vhost目录,在vhost目录下创建下列文件:
  • 修改后,测试nginx配置是否正确    ./nginx -t 
  • 最后,运行Nginx: # sudo ./sbin/nginx
  •  查看一下nginx的进程,是否真的已经启动了: # ps -ef|grep nginx

6. Mysql的安装

  • 检查一下是否安装了mysql
  • 我这里要装的是Mysql5.7, 先卸载5.1的版本及相关依赖。
sudo yum -y remove mysql-xxxx
  •  默认, yum安装mysql的版本为5.1,但我现在想装的是5.7,此时需要配置mysql yum源获取指定的mysql版本。

        从官网下载mysql Yum Repository   

     

sudo wget  https://repo.mysql.com//mysql80-community-release-el6-1.noarch.rpm

  • 安装MySQL的yum源
 sudo rpm -Uvh mysql80-community-release-el6-1.noarch.rpm
  • 用下面的命令查看目前mysql有效的源
     yum repolist enabled | grep mysql

      我想用的是5.7,所以禁用MySQL8.0的源,启用MySQL5.7的源, 需要修改mysql的源配置文件mysql-community.repo中5.7和8.0的enable字段.

 

  • 再执行一遍查询,发现此时的mysql有效源已经是5.7了。

       这样,就可以通过yum安装了

sudo yum -y install mysql-community-server

     

  • 安装成功后,修改mysql的字符集为utf-8,避免由于字符集不一样造成中文乱码。

        #vim /etc/my.cnf,增加:character-set-server=utf8

       

  • 设置mysql为开机自启动。
    sudo chkconfig mysqld on

    检查一下刚刚的设置是否起效,列出mysqld服务设置情况

sudo chkconfig --list mysqld

       

  •  运行级别2,3,4,5都是on, 说明设置是ok的。
  •  重启mysql,使刚刚配置生效。如果重启初始化失败,如果报以下错误:   

 

  • 需要清空数据目录后再重启:
rm -rf /var/lib/mysql/*
  •   重启成功以后登陆,默认用户名root,这时候需要去查找初始密码。
    grep 'temporary password' /var/log/mysqld.log 

  • 登陆以后赶紧修改一下root的密码, mysql5.7密码必须含有数字,小写或大写字母,特殊字符,不然密码设置会报错:
set password for root@localhost = password('xxxxxxx');

或 ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxxxxxx';

查询一下所有用户:select user, host from mysql.user;

 

由于我们是单体架构,没必要开放3306端口,即使开放3306端口,也走只对内网ip开放。(注意:对外网开放是相当危险的一种行为)

以之前负责的一个企业知识库的sql脚本为例。

创建数据库luyuankmsdb: 

CREATE DATABASE `luyuankmsdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

创建一个用户。(注意:数据库服务器可能有多个数据库,要做好权限管理)

CREATE USER 'luyuankmsadmin'@'localhost' IDENTIFIED BY 'xxxxxxxxx';

给该用户luyuankmsadmin赋予操作数据库luyuankmsdb的相关权限:

GRANT ALL PRIVILEGES ON luyuankmsdb.* to 'luyuankmsadmin'@'localhost' IDENTIFIED by 'xxxxxxxxx'; 

刷新一下: FLUSH PRIVILEGES;

将需要导入的sql脚本导入:

use luyuankmsdb;

source /xx/xx/luyuankmsdb.sql

导入成功,查看一下所有表是否都导入成功,选择一张表检查一下数据(要重点关注中文是否有乱码):

 

SELECT * from tablename\G;       #\G表示格式化展示,正常,中文也没乱码问题

改变表名的大小写区分规则的方法:在/etc/my.cnf 或 /etc/mysql/my.cnf 中的[mysqld]后添加添加lower_case_table_names=1, 重启MySQL服务,若设置成功,则不再区分表名的大小写。

7. Git的安装(需要编译)

  1. 下载git-v2.8.0.tar.gz

  2. 安装git的依赖: sudo yum -y install zlib-devel openssl-devel cpio expat-devel gettext-devel curl-devel perl-ExtUtils-CBuilder perl-ExtUtils- MakeMaker 

  3. 解压git: # sudo tar -zxvf git-v2.8.0.tar.gz -C ../

  4. 编译源文件:进入 git-v2.8.0目录,执行

          # sudo make prefix=/usr/local/git all

          然后执行:

          # sudo make prefix=/usr/local/git install

          编译成功后,需要将git加到环境变量中:

export JAVA_HOME=/usr/java/jdk1.7.0_80
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CATALINA_HOME=/develop/apache-tomcat-7.0.63
export MAVEN_HOME=/develop/apache-maven-3.5.4

export PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$MAVEN_HOME/bin:/usr/local/git/bin:/usr/local/bin


export LC_ALL=en_US.UTF-8

重新加载环境变量:#source /etc/profile

此时,git就安装成功了,我们可以 # git --version查看git的版本。

接着,我们给git做一些必要的配置。

#配置账号

git config --global user.name "wujie"

git config --global user.email "705030268@qq.com"

#让git忽略wins和linux换行符的转换

git config --global core.autocrlf false

#配置编码,避免中文乱码

git config --global core.quotepath off

git config --global gui.encoding utf-8

#配置ssh(ssh-keygen中间是连着的)

ssh-keygen -t rsa -C "705030268@qq.com"

中间回车,什么都不输入。

eval `ssh-agent`

ssh-add ~/.ssh/id_rsa

#查看一下公钥

cat ~/.ssh/id_rsa.pub

将公钥复制到git代码托管服务器。

8. 防火墙的配置

  1. 进入防火墙的目录

      cd /etc/sysconfig

      查询一下是否有iptables文件: ll | grep ipt

 

没有找到,则需要初始化一下防火墙配置。

我们随意写一条规则:sudo iptables -P OUTPUT ACCEPT

保存一下: sudo service iptables save

再次查询,发现iptables出现了,查看其实是个空文件,备份一下iptables

sudo mv iptables iptables.bak

 iptables新的配置:这里我们把数据库3306, tomcat的8080,tomcat的远程端口5005都关掉。

  • 重启一下防火墙

9. 自动化发布脚本

1.创建发布脚本

在develop下创建 git-repository目录

sudo mkdir git-repository

cd git-repository/

sudo git clone " xxxxxxxx" (建议走ssh协议)

  • 编写shell自动化发布脚本deloy.sh
    echo "===========进入git项目luyuan-kms目录============="
    cd /develop/git-repository/luyuan-kms
    
    
    echo "==========git切换分支到master,这里业内一般分支提交,主干发布==============="
    #git checkout master
    
    echo "==================git fetch======================"
    git fetch
    
    echo "==================git pull======================"
    git pull
    
    
    echo "===========编译并跳过单元测试===================="
    mvn clean package -Dmaven.test.skip=true
    
    
    echo "============删除旧的ROOT.war==================="
    rm /develop/apache-tomcat-7.0.63/webapps/ROOT.war
    
    
    echo "======拷贝编译出来的luyuan-kms-wcp-web的war包到tomcat webapps下-ROOT.war======="
    cp /develop/git-repository/luyuan-kms/luyuan-kms-wcp-web/target/luyuanKMS.war  /develop/apache-tomcat-7.0.63/webapps/ROOT.war
    
    echo "======拷贝编译出来的luyuan-kms-wda-web的war包到tomcat webapps下-wda.war======="
    cp /develop/git-repository/luyuan-kms/luyuan-kms-wda-web/target/wda.war  /develop/apache-tomcat-7.0.63/webapps/wda.war
    
    echo "============删除tomcat下旧的ROOT文件夹============="
    rm -rf /develop/apache-tomcat-7.0.63/webapps/ROOT
    
    echo "============删除tomcat下旧的wda文件夹============="
    rm -rf /develop/apache-tomcat-7.0.63/webapps/wda
    
    echo "====================关闭tomcat====================="
    /develop/apache-tomcat-7.0.63/bin/shutdown.sh
    
    
    echo "================sleep 30s========================="
    for i in {1..30}
    do
        echo $i"s"
        sleep 1s
    done
    
    
    echo "====================启动tomcat====================="
    /develop/apache-tomcat-7.0.63/bin/startup.sh

    编译成功:

10.权限

最后一定要将/develo/p这个目录及其子目录的权限给wujie这个账号,不然会出现tomcat等没有创建文件夹等权限。

sudo chown -R wujie /develop/

#递归将develop的子目录所有权限也给wujie

sudo chmod u+r  -R /develop/

sudo chmod u+w -R /develop/

sudo chmod u+x -R /develop/

最后测试调试线上环境。

几个重要的配置文件 http://learn.wjxxr.com/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值