备忘录
Linux
常用命令
# systemclt命令启动的日志
journalctl -u logstash.service
# 端口号、进程号、服务查询
netstat -nap | grep 80
netstat -tunlp | grep 80
lsof -i:80
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' # 查看tcp各状态连接数
ls -l /proc/22205/cwd # 查看安装目录
find /var -name test.file # 查找文件位置
# 内存、磁盘大小查看
du -h -x --max-depth=1 # 查看当前目录下其他目录文件占用大小
ls -lh
free -m -h
du -h
# 日志、其他文件查看
less catalina.out # G:跳转到日志尾部 空格:下一页 B:上一页 F:搜索 ?关键字:通配符 n:上一个关键字 N:下一个关键字
tail -f catalina.out | grep -C 30 '关键字' --color
tail -300f catalina.out
# 防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent # 添加端口80到白名单中
firewall-cmd --reload # 重载防火墙(白名单)配置
firewall-cmd --zone=public --list-ports # 查看防火墙开放端口
# vim
:%s/a/b/g # 将整个文件的所有a替换为b
# 抓包
tcpdump -i eth0 dst host 121.37.234.98 # 监听 eth0网卡的往指定ip发送的请求
tcpdump -i eth0 dst port 1883 # 监听 eth0网卡的往指定port发送的请求
# 其他
rz # 上传文件
sz # 下载文件
history > 111.txt # 覆盖重定向
history >> 111.txt # 追加重定向
unzip -O CP936 dist.zip # 解压(-O是指定字符集解决压缩包乱码问题)
scp -r orderdispatch@130.81.9.129:/orderdispatch/fis/ordercollect/ordercollect-server-module-0.0.1-SNAPSHOT.jar /orderdispatch/fis/ordercollect # 复制文件 从远程复制目录到本地
tar -zxvf xxx.tar.gz ./ # 将xxx.tar.gz 解压到指定目录 z: 打包 c: 压缩 x: 解压 v:过程 f:代表指定文件名
tar -zcvf xxx.tar.gz ./xxx/ # 将指定文件或目录下文件压缩到xxx.tar.gz
启动命令
# showdoc
docker run -d --name showdoc --user=root --privileged=true -p 4999:80 \
-v /usr/local/showdoc/showdoc_data/html:/var/www/html/ star7th/showdoc
# kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties
启动脚本
start.sh
#!/bin/bash
#虚拟机启动参数
JAVA_OPTS="-Xms512m -Xmx1024m"
#应用jar包名称
APPLICATION_NAME=xxxx-1.0.0-SNAPSHOT.jar
#应用路径
APPLICATION_HOME=`pwd`
#pid文件路径
APPLICATION_PID="${APPLICATION_HOME}/xxxx.pid"
if [ -f "$APPLICATION_PID" ]; then
PID=`cat "$APPLICATION_PID"`
ps -p $PID >/dev/null 2>&1
if [ $? -eq 0 ] ; then
echo " ****** $APPLICATION_NAME already running! ****** "
exit 1
fi
fi
#springboot 外部配置文件必须先获取jar的当前路径,在执行才能生效
cd $APPLICATION_HOME
nohup java $JAVA_OPTS -jar $APPLICATION_HOME/$APPLICATION_NAME >/dev/null 2>&1 &
# nohup java $JAVA_OPTS -jar $APPLICATION_HOME/$APPLICATION_NAME &
echo $! > $APPLICATION_PID
stop.sh
#!/bin/bash
#应用jar包名称
APPLICATION_NAME=xxxx-1.0.0-SNAPSHOT.jar
#应用路径
APPLICATION_HOME=`pwd`
#pid文件路径
APPLICATION_PID="${APPLICATION_HOME}/xxxx.pid"
if [ -f "$APPLICATION_PID" ] && kill -0 $(cat "$APPLICATION_PID"); then
PID=`cat "$APPLICATION_PID"`
kill -9 $PID
rm -f "$APPLICATION_PID"
else
echo " ****** $APPLICATION_NAME already stoped! ****** "
fi
restart.sh
#!/bin/bash
echo stop application
sh stop.sh
echo start application
sleep 10
sh start.sh
常见问题
cpu过高
top
找出占用cpu、内存较高的进程(pid:27291)
ps -mp 27291 -o THREAD,tid,time
找出占用较高的线程(tid:27909 线程id是10进制的)
printf "%x\n"
将10进制的tid转换为16进制(tid:6d05 jvm的线程id是16进制的)
jstack 27291 | grep 6d05 -A 30
追踪线程的栈信息,从而根据栈信息找到对应业务代码
gc垃圾回收
jstat -gcutil 73883
S0 | S1 | E | O | M | CCS | YGC | YGCT | FGC | FGCT | GCT |
---|---|---|---|---|---|---|---|---|---|---|
0.00 | 0.00 | 38.13 | 99.30 | 92.59 | 90.31 | 8 | 0.878 | 124 | 41.237 | 42.115 |
survival区-0 | survival区-1 | eden区 | old区 | youngGc次数 | youngGc时间 | fullGC次数 | fullGc时间 |
too many open files
lsof -p pid | wc -l #查看某个进程的链接数量 lsof: list openfiles
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more #按照句柄数数量倒序打印出pid
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr| head -n 10 #按照句柄数数量倒序前10个打印出pid
lsof | grep pid #打印出pid的句柄详情
ss -lntup |grep 9092
ulimit -n #查看句柄限制
Mysql
# 复制表
insert into sys_menu_0305 SELECT * FROM sys_menu;
# 备份表到sql文件
mysqldump -uroot -p123 db1 table1 table2 > db1-table1-table2.sql
mysqldump -u root -p -h databaseUrl dbName tableName > bakName.sql
# 恢复备份sql文件
mysql -uroot -p123 # 登录mysql
use dbName # 指明使用数据库
source /root/bakName.sql # 执行备份文件
Nginx
配置示例
nginx.conf
user root;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid /usr/local/nginx/logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#开启或关闭gzip on off
gzip on;
#不使用gzip IE6
gzip_disable "msie6";
#是否开启gzip静态资源
gzip_static on;
#gzip压缩最小文件大小,超出进行压缩(自行调节)
gzip_min_length 100k;
#buffer 不用修改
gzip_buffers 4 16k;
#压缩级别:1-10,数字越大压缩的越好,时间也越长
gzip_comp_level 3;
# 压缩文件类型
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
gzip_vary off;
include /usr/local/nginx/conf.d/*.conf;
server {
listen 8094;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root /opt/src/platform-xxxx/web/;
index index.html index.htm;
#访问静态文件
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$) {
add_header Content-Disposition: 'attachment;';
add_header Content-Type: 'APPLICATION/OCTET-STREAM';
}
#proxy_pass http://app.time-weekly.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
}
location /v1/ {
proxy_pass http://127.0.0.1:8941;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}
location ~ /. {
deny all;
access_log off;
log_not_found off;
}
location /file/ {
alias /opt/src/upload/;
expires 7d;
}
}
upstream socket{
ip_hash;
server 192.168.2.22:6005;
}
}
minio配置
# 上传
location /upload/ {
proxy_pass http://192.168.2.47:9000/;
client_max_body_size 100m;
}
# 下载
location /v1/minio/download/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
proxy_pass http://127.0.0.1:18051/minio/download;
client_max_body_size 100m;
}
oss配置
location /oos/ {
proxy_pass http://xxx.oss-cn-hangzhou.aliyuncs.com/oos/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
client_max_body_size 100m;
}
h5配置
# 多个vue页面,访问形式 http://ip:port/xxxVueWeb/question/list
# http://ip:port/xxxVueWeb/question/detail?id=1524237369920716821
location ^~/xxxVueWeb {
alias /xx/xx/xxx/h5/xxxVueWeb;
try_files $uri $uri/ /index.html last;
index index.html;
}
# 单个h5页面,访问形式 http://ip:port/privacyPolicy.html
location /privacyPolicy {
root /home/project/xxx/h5/;
index privacyPolicy.html ;
#访问静态文件
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$) {
add_header Content-Disposition: 'attachment;';
add_header Content-Type: 'APPLICATION/OCTET-STREAM';
}
#proxy_pass http://app.time-weekly.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
}
前端配置
location / {
root /home/project/xxx/xx-web/;
index index.html index.htm;
#访问静态文件
if ($request_filename ~* ^.*?.(txt|doc|pdf|rar|gz|zip|docx|exe|xlsx|ppt|pptx)$) {
add_header Content-Disposition: 'attachment;';
add_header Content-Type: 'APPLICATION/OCTET-STREAM';
}
#proxy_pass http://app.time-weekly.com;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
}
地图配置
# 高德地图
location /areas_v3/ {
proxy_pass http://geo.datav.aliyun.com/areas_v3/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REQUEST_HOST $host;
charset UTF-8;
client_max_body_size 100m;
}
socketio配置
# server内
server {
location /socket.io {
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_pass http://socket;
}
}
# server外 负载均衡
upstream socket{
ip_hash;
server 192.168.2.22:6005;
}
server {
listen 5000;
server_name localhost;
location / {
proxy_pass http://socketio/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
charset UTF-8;
client_max_body_size 100m;
}
}
upstream socketio {
ip_hash;
server 127.0.0.1:7002 weight=10 max_fails=3 fail_timeout=30s;
}
Kafka
常见问题
启动异常:InconsistentClusterIdException
现象
kafka集群一般都是部署在zookeeper集群之上的,当Kafka出现异常时,强行关闭kafka集群或zookeeper集群时,重新启动时经常会出现异常InconsistentClusterIdException。 (未实际验证)
原因分析及解决方案
kafka配置日志路径,用来保存执行过程中的各种信息,当kafka异常关闭时,日志记录就会出现异常,会把当时的情况记录到meta.properties文件中,重新启动时此文件会对启动造成影响,kafka重启报错的原因就在这里。 (未实际验证)
修改server.properties中listeners=PLAINTEXT://0.0.0.0:9092;日志目录log.dirs不要放在tmp目录下,具体配置如下图: (已实际操作、但是可能碰巧)
或 (未实际验证)
- 清空日志目录【日志不重要或可以容忍日志丢失】。
- 调整日志目录【需要修改配置】。
- 删除日志目录下的meta.properties文件。
Netty
常见问题
nginx健康检查
现象
原因分析及解决方案
关闭nginx对于netty监听端口的安全检查
TSDB数据库
常见问题
数据类型错误
现象
原因分析及解决方案
TSDB多值模型的field 值只支持 String,Number,Boolean、且不可存在null值
若有集合数据可以转化为JSON字符串、对于数据做判空等
\