部署运维
将项目运行部署在阿里云服务器上面运行
Cfeng之前分享打包部署的时候,只是介绍了几种部署方式,比如jar、war、yum、docker等,现代化打包方式当然还是docker,docker部署需要编写dockerFile,进行镜像的构建;
接下来为了内容的完整性,补充云服务器的运维部署
阿里云服务器
Cfeng使用的是阿里云服务器,所以这里就使用阿里云进行介绍: 首先就是购买服务器,这个看个人选择不同的价位的服务器, 购买之后, 一般就会阿里就会发短信提示购买成功,并且会给出公网的IP,之后we可以进入修改信息:
云服务器管理控制台 (aliyun.com) : 次要的可以修改服务器实例ECS的实例的名称或者密码, 可以选择修改一下host名称, Cfeng还是选择的Centos系统,所以host名称会显示在控制台上面
其余的部署情况和之前是相同的,但是为了能够成功的访问,需要配置安全组规则; 在控制台中选择手动新增安全组规则,选择新增一个所有的, 或者固定port的规则
配置完成之后,就可以使用Xshell进行远程连接, 默认的端口就是22,连接的IP就是公网IP, 输入登录名称和密码即可建立连接远程操作
Connecting to 8.130.34.133:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last failed login: Thu Sep 8 14:30:10 CST 2022 from 3.82.192.156 on ssh:notty
There was 1 failed login attempt since the last successful login.
Last login: Thu Sep 8 13:49:09 2022 from 61.185.207.95
Welcome to Alibaba Cloud Elastic Compute Service !
[root@cfengAli ~]#
之后就进入了云服务器的LInux系统, 按照之前的步骤进行打包部署即可
参照Cfeng之前的文章 配置mysql、java、 redis、docker的环境
环境配置
因为之前linux部分和之后的博客均给出了配置的过程,下面就直接列出简单的命令,装配redis、java、mysql、docker等环境
-
redis环境
-
mkdir cfeng/software -p
-
xftp 上传redis安装包
-
tar -zxvf redis-6.2.6.tar.gz -C /usr/local/
-
yum install wget
-
/etc/yum.repos.d目录下 cp CentOS-Base.repo CentOs-Base.repo.backup
-
wget http://mirrors.aliyun.com/repo/Centos-7.repo
-
mv Centos-7.repo CentOS-Base.repo
-
yum clean all
-
yum makecache
-
yum -y install gcc
-
cd /usr/local/redis-6.2.6
-
make install
-
touch /usr/lib/systemd/system/redis.service
-
vim 中 ctrl + ins
[Unit]
Description=The redis-server Process Manager
After=syslog.target network.target[Service]
Type=simple
PIDFile=/var/run/redis_6379.pid
ExecStart=/usr/local/redis-6.2.6/src/redis-server /usr/local/redis-6.2.6/redis.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID[Install]
WantedBy=multi-user.target-
systemctl enable redis
-
vim /usr/local/redis-6.2.6/redis.conf
修改bind 为 bind 0.0.0.0 指定的ip为统一网段或者localhost监听ip, 配置内网其他网段或者公网ip重启都会失败 【直接使用firewalld进行处理】
daemonize 改为yes
protected-mode 改为 yes
requirepass 设置为强密码
logfile 为 /var/log/redis/redis-server.log
- 【systemctl stop firewalld】 不安全
- systemctl enable firewalld /start 开启防火墙
- firewall-cmd --add-port=8083/tcp --permanent 开放8083端口
- firewall-cmd --reload
- firewall-cmd --permanent --add-rich-rule=“rule family=“ipv4” source address=“61.185.207.9X” port protocol=“tcp” port=“22” accept” 22、6379、3306、9001等端口开放给指定ip
- systemctl restart firewalld
- systemctl restart redis
-
##### 防火墙设置firewalld firewall-cmd
systemctl status/stop/start/enable XX
firewall-cmd 【选项】
-h , --help 帮助信息
-v , --version 显示版本信息 【不组合】
-q, --quiet 不打印状态
--state 显示firewalld状态
--reload 不中断服务重新加载
--conmplete-reload 终端服务重新加载
--runtime-to-permanent 防火墙规则永久保存
--check-config 检查配置正确性
rich rule是对于开放端口更加详细的设置,一般直接无限制开放端口使用add-port, 设置情况下使用rich rule
firewall-cmd --get-active-zones 查看区域 【默认接口都在public区域】
firewall-cmd --add-port=6379/tcp --permanent 开放端口永久
firewall-cmd --zone=public --remove-port=6379/tcp --permanent
firewall-cmd --zone=public --query-port=6379/tcp
firewall-cmd --zone=public --list-ports 查看所有的add-ports
firewall-cmd --zone=public --list-all 查看所有的规则(port、rich rule等)
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="61.185.207.95" port protocol="tcp" port="22" accept"
firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="11300" accept"
systemctl restart firewalld rich rule生效
- firewall-cmd --state 查看状态
- firewall-cmd --add-port=6379/tcp --permanent 【bind绑定只是本机访问】
- firewall-cmd --query-port=6379/tcp
- firewall-cmd --reload 之后查询yes
进入/etc/selinux/config 查看selinux的状态,一般都是disabled
-
Docker环境
- wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
- yum clean all yum makecache iptables -F getenfore(disabled) 【本机没有iptables防火墙,使用的firewalld】
- 网卡配置发放
cat < /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.ip_forward = 1
EOF-
modprobe br_netfilter
-
sysctl -p /etc/sysctl.d/docker.conf
-
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
curl -o /etc/yum.repos.d/CentOS-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
-
yum list docker-ce --showduplicates | sort -r
-
yum install docker-ce-20.10.6 -y (卸载remove)
-
mkdir -p /etc/docker
-
touch /etc/docker/daemon.json (vim)
{
“registry-mirrors”: [“https://registry.docker-cn.com”,“http://hub-mirror.c.163.com”,“https://docker.mirrors.ustc.edu.cn”,“https://pee6w651.mirror.aliyuncs.com”],
“live-restore”: true
}- systemctl daemon-reload
- systemctl enable docker
- systemctl restart docker
-
Docker中 MinIO
- docker search minio
- docker pull minio/minio
公网IP的拉取可能会报错:Error response from daemon: Head https://registry-1.docker.io/v2/minio/minio/manifests/latest: TLS handshake timeout
解析ip不可用,可以使用dig工具
-
yum install bind-utils
-
dig @114.114.114.114 registry-1.docker.io
-
vi /etc/hosts 找到上面的一组IP
54.83.42.45 registry-1.docker.io
-
同时修改一下镜像加速源,可以同时配置多个(上面)
-
systemctl restart docker
-
docker images
-
mkdir /data
-
docker run -p 9000:9000 -p 9001:9001 -v /data/minio/data:/data -e “MINIO_ROOT_USER=cfeng” -e “MINIO_ROOT_PASSWORD=fjVEALXufI23H2aOrZTC” 7f4aefb1a8d6 server /data --console-address “:9001”
-
docker ps -a 【docker start XXX】 开放给本机端口9001【安全组】,本机可可视化操作
-
JAVA 环境
-
java -version 【查看】
-
cd /usr/local
-
mkdir java
-
cd java
-
xftp 传输java安装包 到java文件夹
-
tar -zxvf jdk-17.0.2_linux-x64_bin.tar.gz
-
rm -f jdk-17.0.2_linux-x64_bin.tar.gz
-
vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk-17.0.2 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:/usr/local/mysql/mysql8/bin
-
source /etc/profile
-
java -version
-
-
MySQL
- rpm -qa | grep mariadb
- rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64
- Xftp 传输到 software中
- 【cd /usr/local】 mkdir mysql
- mv mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz /usr/local/mysql/
- tar -Jxvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz
- rm -f mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz
- mv mysql-8.0.27-linux-glibc2.12-x86_64 mysql8
配置环境变量 vim /etc/profile source /etc/profile export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:/usr/local/mysql/mysql8/bin 直接以冒号结尾,添加新的 linux中使用$XXX引用 环境变量, windows中也可以echo输出
-
【cd /usr/local/mysql/mysql8/】 mkdir data
-
groupadd mysql
-
useradd -g mysql cfeng
-
chown -R cfeng /usr/local/mysql/mysql8
-
chgrp mysql /usr/local/mysql/mysql8
-
vim /usr/local/etc/myMysql.conf
[mysql] default-character-set=utf8mb4 [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 server-id = 3306 user = cfeng socket = /tmp/mysql.sock # 安装目录 basedir = /usr/local/mysql/mysql8 # 数据存放目录 datadir = /usr/local/mysql/mysql8/data log-bin = /usr/local/mysql/mysql8/data/mysql-bin innodb_data_home_dir =/usr/local/mysql/mysql8/data innodb_log_group_home_dir =/usr/local/mysql/mysql8/data # 日志及进程数据的存放目录 log-error =/usr/local/mysql/mysql8/data/mysql.log pid-file =/usr/local/mysql/mysql8/data/mysql.pid # 服务端字符集 character-set-server=utf8mb4 lower_case_table_names=1 autocommit =1 ##### 配置相关的数据量 skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 1024 sort_buffer_size = 4M net_buffer_length = 8K read_buffer_size = 4M read_rnd_buffer_size = 512K myisam_sort_buffer_size = 64M thread_cache_size = 128 #query_cache_size = 128M tmp_table_size = 128M explicit_defaults_for_timestamp = true max_connections = 500 max_connect_errors = 100 open_files_limit = 65535 binlog_format=mixed binlog_expire_logs_seconds =864000 # 创建表时使用的默认存储引擎 default_storage_engine = InnoDB innodb_data_file_path = ibdata1:10M:autoextend innodb_buffer_pool_size = 1024M innodb_log_file_size = 256M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 transaction-isolation=READ-COMMITTED [mysqldump] quick max_allowed_packet = 16M [myisamchk] key_buffer_size = 256M sort_buffer_size = 4M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
- mysqld --defaults-file=/usr/local/etc/myMysql.conf --basedir=/usr/local/mysql/mysql8 --datadir=/usr/local/mysql/mysql8/data --user=cfeng --initialize-insecure
云服务器操作系统很干净,里面很多依赖都没有, 这里可能报错缺少libaio.so.1 使用yum安装即可 yum install -y libaio
-
mysqld_safe --defaults-file=/usr/local/etc/myMysql.conf &
-
mysql -u root --skip-password
-
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘GZmCfk6fkKkMA5I6IDgs’;
-
FLUSH PRIVILEGES;
-
CREATE user ‘cfeng’@‘%’;
-
ALTER USER ‘cfeng’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘y84PbgfwzC1to2DiJqie’;
-
GRANT ALL PRIVILEGES ON . TO ‘cfeng’@‘%’;
-
FLUSH PRIVILEGES;
-
touch /usr/lib/systemd/system/mysql.service
vim [Unit] Description=MySQL Server Documentation=man:mysqld(8) Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html After=network.target After=syslog.target [Install] WantedBy=multi-user.target [Service] User=cfeng Group=mysql ExecStart=/usr/local/mysql/mysql8/bin/mysqld_safe --defaults-file=/usr/local/etc/myMysql.conf LimitNOFILE = 5000 #Restart=on-failure #RestartPreventExitStatus=1 #PrivateTmp=false
- systemctl enable mysql
- systemctl restart mysql
-
MongoDB依赖 【本地运行,不开放外部连接】
- docker search mongo
- docker pull mongo
- 【minio的data在/data/minio/data cd /data】 mkdir -p mongo/db
- docker run -itd -p 27017:27017 -v /data/mongo/db:/data/db mongo 【需要密码就可以设置】 这里直接运行了,不需要密码
若需要密码,uri方式yml
uri: mongodb://cfeng:a1234567890b@localhost:27017/XiaohuanChat
- jar 部署
- xftp传输jar
- java -jar XXX 运行
- yum install fontconfig 【验证码解析kaptcha Linux】
- cd /usr/share/fonts
- fc-cache
- nohup java -jar XXX & 一直运行,不随着窗口关闭影响
阿里云被攻击CPU爆满
现实果然残酷,刚把服务器的安全组开放了redis和jar的端口,马上就被美国内华达的IP攻击了, CPU一下子就爆满了; 首先直观的感受: 远程的连接一下子就非常慢,卡住了, 云服务器端观察CPU从攻击时刻开始高居不下 【 不要随便开放端口, 数据库的密码设置强密码, 并且开放的IP不要让任何IP都访问,现在的黑客技术 ~ 】
首先检查占用情况
- top 结果没有查看任何的情况,CPU看不到占用很多的,伪装技术好啊
- ps -ux 也没有看到占用巨量CPU的
- pstree -p 查看进程树终于看到一个进程pncan 一次性开了几百个进程,直接从8087一直到后面…
- kill -9 XXX 删除危险进程
- rm -f XXX 删除脚本文件
- crontab -r 删除定时任务
杀了进程,查看定时任务,结果没有【又被伪装了emmm…】
将写入的相关的sh文件删除, 如果没有权限就设置权限
如果和Cfeng一样后面因为卡爆了,命令执行不了,只能 — 重装初始化系统 ---- 血泪教训,不要开放端口了,只给自己开了…
需要注意ipconfig得到的是在自己无线网络中的ip地址,内网,不是公网的IP,安全组的授权对象是公网IP,61.185.207.95
阿里云密钥对配置
进入网络与安全 --> 密钥对 【创建密钥对】 设置密钥对名称、创建密钥,下载.pem文件到指定位置
将生成的.pem文件复制到本地的 C盘下面的.ssh文件夹
再在页面中选择密钥绑定,就与本地建立联系,这里就不能使用Xshell凭密码登录,必须通过密钥
- 有时出现重启之后Xshell连接不了,就在实例中选择远程命令: 之后执行
chmod 400 /etc/ssh/*
使用cpolar进行内网穿透
不是所有的应用都需要上云的,作为个人开发者,很多小的测试Demo是没有必要专门买一台服务器进行部署的,这里Cfeng简单分享cpolar的内网穿透的解决方案,平时的小demo可以使用 【防火墙等安全防护措施做好,不然直接压垮】
进入cpolar的官方网站免费注册: cpolar - 安全的内网穿透工具
注册之后选择普通的0元免费套餐就OK了呀💙, 只是分配的域名地址是随机的,但是只要不关闭应用,那么就可以一直访问
这里先下载Windows版本进行客户端进行介绍
- Linux版本, 下载客户端压缩包之后,使用xftp传输到虚拟机上面,解压安装:
- unzip cpolar-stable-linux-386.zip -d /usr/local/cpolar
- 跳转到安装目录
- cd /usr/local/cpolar
- 进行远程链接,使用注册后cpolar分配的authToken进行链接
- ./cpolar authtoken ZGU5ZTJmMDUtNGRkNS00MjYzLThhOGYtNGJkNjMxYTY4ZDU2
这里Cfeng执行后Authtoken saved to configuration file: /root/.cpolar/cpolar.yml,在这里面就是令牌
解压之后的文件夹里就是命令cpolar, 直接通过./cpolar version可以查看版本
还可以直接下载
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
installed: /usr/local/bin/cpolar
installed link: /usr/bin/cpolar
installed: /usr/local/etc/cpolar/cpolar.yml
installed: /var/log/cpolar/
installed: /var/log/cpolar/access.log
installed: /var/log/cpolar/error.log
installed: /etc/systemd/system/cpolar.service
installed: /etc/systemd/system/cpolar@.service
removed: /tmp/tmp.rSr29Zsun2
下载之后就可以直接使用cpolar命令
- cpolar version
- cpolar authtoken ZGU5ZTJmMDUtNGRkNS00MjYzLThhOGYtNGJkNjMxYTY4ZDU2
- systemctl enable cpolar
- systemctl start cpolar
Authtoken saved to configuration file: /usr/local/etc/cpolar/cpolar.yml
- 使用cpolar进行内网穿透
coplar会默认安装两个样例通道,一个website通道,指向8080端口,一个ssh指向22端口, 在本地浏览器访问: http://localhost:9200/ 使用用户名密码访问即可
访问之后就可以点击隧道管理,新建隧道,这里默认的两个隧道其实可以关了,避免网络攻击
创建隧道之后,点击状态 —> 在线隧道列表列表,就可以看到映射,这里Cfeng的映射为:
http://6bc22e18.r2.cpolar.cn http://localhost:8083
后面Cfeng会继续更新关于ICP备案和 云服务器故障处理的内容(本篇文章)