上次总结过一些Java常用服务的安装和配置,隔了段时间重新配Linux又感觉啥也不会了,因此基于上次的经验和本次遇到的问题再做一次总结。
本文基于CentOS 7。
1. Linux 设置
1.1 IP地址自动变动
有时候Linux的IP地址会突然发生变化,这是由于默认网卡配置指定了IP地址获取方式为DHCP(动态主机配置协议,不了解所以在此不赘述),顾名思义IP会动态获取,因此我们需要将其改为静态获取。
首先ifconfig/ip addr看一下当前生效的网卡设置,以ifconfig为例显示的内容如下:
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.190.129 netmask 255.255.255.0 broadcast 192.168.190.255
inet6 fe80::690d:ca7f:7270:e28d prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:da:7c:dd txqueuelen 1000 (Ethernet)
RX packets 9204 bytes 815274 (796.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9703 bytes 15956071 (15.2 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 40550 bytes 19515218 (18.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 40550 bytes 19515218 (18.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到显示本机IP地址对应的网卡名称为“ens33”,因此要去修改对应的网卡配置,/etc/sysconfig/network-scripts目录下的“ifcfg-ens33”文件即为网卡配置文件,注意修改对应名称的配置信息。打开文件后有几个主要属性需要修改:
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" //默认设置为dhcp,需要修改为static
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="fcc1ea85-7169-4f30-b23d-943b2ef5d3e8"
DEVICE="ens33"
ONBOOT="yes" //需要修改为yes
IPADDR=192.168.190.129 //需要修改为固定IP
NETMASK=255.255.255.0
GATEWAY=192.168.190.2
DNS1=8.8.8.8
DNS2=8.8.4.4
修改完后重启网卡服务“service network restart”即可。
1.2 域名解析错误
用wget下载东西时提示“Name or service not known”,即域名或服务解析错误。试着ping了一下百度,一直没有响应。问题突然就出现了,可能是什么操作影响了网络。Linux使用的是NAT模式共享本机的网络,那么这个问题就有两个解决方向。
方向1从问题本身入手,既然提示域名解析错误,那就显式地指定DNS服务器,这俩DNS都是谷歌提供的,一主一备,设置完成后重启网卡服务,发现没啥用。
DNS1=8.8.8.8
DNS2=8.8.4.4
方向2从网络本身入手,有可能是Linux本身就已经连不上网了,所以搞什么设置都白搭。去VMware查看一下虚拟网络编辑器设置,发现其中有VMnet1和VMnet8,其中VMnet8对应着我使用的NAT模式,因此查看一下它的NAT设置详情。
几个关键的属性已经标了出来,由于Linux虚拟机是靠本机来转发网络请求,因此网关就成为重要的属性了。我们再去网卡配置里添加这几个对应的属性:
IPADDR=192.168.190.129 //需要修改为固定IP
NETMASK=255.255.255.0
GATEWAY=192.168.190.2
DNS1=8.8.8.8
DNS2=8.8.4.4
这次重启网卡后再ping百度就通了。如果没有解决的话,还有个终极方法,把Linux虚拟机的网卡移除再加入重置一下设置。
1.3 防火墙和SELinux关闭
部署服务肯定要给本机访问的,所以要把相关的安全措施关闭,更稳妥的方式其实是开放端口,但由于只是用于本机学习,就不整那么麻烦了,直接全给他关了。
先关闭防火墙,这个简单,调用以下命令:
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
//最后一步如果显示状态为“inactive(dead)”即为正常关闭
SELinux需要修改/etc/selinux/config中“SELINUX=disabled”,然后重启服务器后生效。
2. 服务安装
2.1 ElasticSearch
ES的安装流程就略显复杂些,我们需要解决几个问题。由于ES的安全策略不支持root账户直接启动,因此需要创建一个ES专用账户,且给予其最高权限。
之后要修改ES的配置文件,主要需要修改下面几个属性,值得注意的是“inital_master_nodes”一定要修改成当前节点的名称,否则启动会找不到初始化主节点。
cluster.name: myes //集群名称
node.name: esnode-1 //当前节点名称
path.data: /home/esuser/elasticsearch/data //数据存放路径
path.logs: /home/esuser/elasticsearch/logs //日志存放路径
network.host: 0.0.0.0 //允许访问IP地址,设置为0.0.0.0才能允许其他机器访问
cluster.initial_master_nodes: ["esnode-1"] //集群初始主节点,一定要配置成节点名称,否则无法启动
gateway.recover_after_nodes: 1 //设置为集群节点数
其次是ES依赖于较高版本的JDK,比如我用的7.5.0需要JDK11才能运行,而开发版本一般都是JDK1.8.0。不过这个问题也很好解决,ES一般都会自带JDK,我们只需要在启动程序中指定优先使用它的JDK即可:
# 将jdk修改为es中自带jdk的配置目录
export JAVA_HOME=/home/elasticsearch-7.5.0/jdk
export PATH=$JAVA_HOME/bin:$PATH
if [ -x "$JAVA_HOME/bin/java" ]; then
JAVA="/home/elasticsearch-7.5.0/jdk/bin/java"
else
JAVA=`which java`
fi
最后需要配置几个参数,第一个是内存参数,因为ES依赖于Java环境启动,且非常消耗内存空间,因此要先修改ES目录下jvm的内存参数,且需要给用户指定足够的内存权限。
//修改ES对应Java内存大小
-Xms2g //初始内存
-Xmx2g //最大内存
//指定用户内存权限
cd /etc/sysctl.conf
vm.max_map_count=655360
至此ElasticSearch就可以正常启动了。
2.2 Kibana
Kibana也需要一个专用用户和权限,流程和ES差不多。需要修改一下配置文件:
server.port: 5601
#ip地址,0.0.0.0表示可远程访问
server.host: "0.0.0.0"
# 服务名
server.name: "kibana-service"
# elasticsearch地址
elasticsearch.hosts: ["http://127.0.0.1:9200"]
# 请求elasticsearch超时时间,默认为30000
elasticsearch.requestTimeout: 100000
2.3 RabbitMQ
RabbitMQ依赖于Erlang,因此需要先安装Erlang,且要使用对应的版本,具体可以自行搜索。本文基于RabbitMQ 3.8.1 + Erlang 23.2.7。
将两个服务rpm安装包下载好拉到服务器去,执行以下语句即可。
//安装erlang
rpm -ivh erlang-23.2.7-2.el7.x86_64.rpm
yum -y install erlang
//安装RabbitMQ
//RabbitMQ依赖于Erlang和socat,需要事先安装好
yum -y install socat
rpm -ivh rabbitmq-server-3.8.14-1.el7.noarch.rpm
yum install -y rabbitmq-server
//启动RabbitMQ可视化界面
rabbitmq-plugins enable rabbitmq_management
安装好后,RabbitMQ会自动生成systemctl服务,因此可以直接调用“systemctl start rabbitmq-server”来启动。 启动后在本机访问一下15672端口,如果能正常显示管理登录界面即为安装成功。
RabbitMQ自带一个Guest用户,但此用户只能服务所在的机器登录,因此我们还要为本机创建一个登录账户,并给予他权限:
//添加用户
rabbitmqctl add_user 用户名 密码
eg:
rabbitmqctl add_user root 123456
//设置权限
rabbitmqctl set_user_tags 用户名 角色
eg:
rabbitmqctl set_user_tags root administrator
//设置资源权限(授予访问虚拟机根节点的所有权限)
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
eg:
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
权限分为6类:Administrator、Monitoring、Policymaker、Management、Impersonator、None。我们直接拉满Admin即可,就能正常登录了。
3. 开机自启动
开机自启主要靠systemctl注册服务并设置自启动,或是chkconfig + service设置启动服务这两种方式。
systemctl相关的所有初始化系统服务都会放在/usr/lib/systemd/system下,用户可以新建***.service并设置自启动。相关指令如下:
systemctl enable ***.service //自启动
systemctl start ***.service //启动服务
systemctl status ***.service //查看服务状态
而chkconfig相关的系统服务脚本会放在/etc/init.d下,再通过chkconfig --add加入开机启动脚本。下面再具体介绍。
3.1 MySQL
MySQL在安装完毕后,会自动生成mysqld.service服务,直接调用“systemctl enable mysqld.service”就可以设为开机自启,“systemctl start mysqld.service”启动服务再看一下status,如果为“active”即为启动成功。
3.2 Redis
修改redis.conf中“daemonize yes”将其设为守护进程,这样才能在后台启动。创建service系统服务并启动,需要指定redis-server启动的客户端,以及对应的配置文件。记得创建好后调用下“systemctl daemon-reload”重置服务。
[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /home/redis-5.0.8/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3.3 Nacos
创建service系统服务,需要指定nacos启动脚本的地址,以及单机启动的参数。
[Unit]
Description=nacos
After=network.target
[Service]
Type=forking
User=root
ExecStart=/home/nacos/bin/startup.sh -m standalone
ExecReload=/home/nacos/bin/shutdown.sh
ExecStop=/home/nacos/bin/shutdown.sh
Restart=on-failure
PrivateTmp=true
[Install]
WantedBy=multi-user.target
3.4 ElasticSearch
创建service,指定ES启动脚本目录。需要注意的是,由于ES启动需要非root账户,因此要在文件中显式指定User为我们创建的用户,否则启动会报错。且由于非root账户的文件权限不足,启动也有可能报相关的错误,因此最好是给予ES相关目录最高权限,使用“chmod -R 777”即可。
[Unit]
Description=elasticsearch
After=network.target
[Service]
Type=forking
User=esuser
ExecStart=/home/elasticsearch-7.5.0/bin/elasticsearch -d
PrivateTmp=true
# 指定此进程可以打开的最大文件数
LimitNOFILE=65535
# 指定此进程可以打开的最大进程数
LimitNPROC=65535
# 最大虚拟内存
LimitAS=infinity
# 最大文件大小
LimitFSIZE=infinity
# 超时设置 0-永不超时
TimeoutStopSec=0
# SIGTERM是停止java进程的信号
KillSignal=SIGTERM
# 信号只发送给给JVM
KillMode=process
# java进程不会被杀掉
SendSIGKILL=no
# 正常退出状态
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
3.5 Kibana
Kibana通过创建自启动脚本的方式来实现,所有自启动脚本都会放在/etc/init.d目录下,并调用“chkconfig --add kibana”将脚本加入自启动服务中。与ES启动相同,Kibana也需要指定特殊的用户,以及给予权限,因此启动脚本如下:
#chkconfig: 345 63 37
#description: kibana
#processname:kibana-7.6.2
export KIBANA_HOME=/home/kibana-7.5.0-linux-x86_64
case $1 in
start)
su esuser<<!
cd $KIBANA_HOME
./bin/kibana -p pid &
exit
!
echo "kibana is started"
;;
stop)
pid=`cat $KIBANA_HOME/pid`
kill -9 $pid
echo "kibana is stopped"
;;
restart)
pid=`cat $KIBANA_HOME/pid`
kill -9 $pid
echo "kibana is stopped"
sleep 5
su esuser<<!
cd $KIBANA_HOME
./bin/kibana -p pid &
exit
!
echo "kibana is started"
;;
*)
echo "start|stop|restart"
;;
esac
exit 0
su esuser便是切换用户的指令,需要格外注意。
3.6 RabbitMQ
安装好后会自动生成systemctl服务,直接调用“systemctl enable rabbitmq-server”即可。