JoyLau's Blog

JoyLau 的技术学习与思考

安装步骤

  1. 下载 rpm 包 : 官网: https://www.openoffice.org/download/

  2. 解压,进入 /zh-CN/RPMS/ , 安装 rpm 包: rpm -ivh *.rpm

  3. 安装完成后,生成 desktop-integration 目录,进入,因为我的系统是 centos 的 ,我选择安装 rpm -ivh openoffice4.1.5-redhat-menus-4.1.5-9789.noarch.rpm

  4. 安装完成后,目录在 /opt/openoffice4 下
    启动: /opt/openoffice4/program/soffice -headless -accept="socket,host=0.0.0.0,port=8100;urp;" -nofirststartwizard &

遇到的问题

  1. libXext.so.6: cannot open shared object file: No such file or directory
    解决 : yum install libXext.x86_64

  2. no suitable windowing system found, exiting.
    解决: yum groupinstall "X Window System"

之后再启动,查看监听端口 netstat -lnp |grep 8100
已经可以了。

  1. You would need to have WebStorm and JetBrains IDE Support Chrome extension installed.
    需要安装 JetBrains IDE Support 的 chrome 插件

  2. In the WebStorm menu Run select Edit Configurations…. Then click + and select JavaScript Debug. Paste http://localhost:3000 into the URL field and save the configuration.
    在 Edit Configurations 选项里添加一个 JavaScript Debug 的项目,并且地址写上 http://localhost:3000

Note: the URL may be different if you’ve made adjustments via the HOST or PORT environment variables.
地址根据配置环境而异

  1. Start your app by running npm start, then press ^D on macOS or F9 on Windows and Linux or click the green debug icon to start debugging in WebStorm.
    运行项目,点击 debug 按钮调试项目,注意在页面上开启插件的调试功能,此后就能像调式Java 一样调试 js 代码了。

公司的网络接入是需要 ip 地址和 mac 地址绑定在一起的,笔记接入的 WiFi 没绑定就无法上网,公司那么多电脑不用,就使用他们已经绑定好的 静态 IP 地址和 mac 地址来上网

  1. 随机生成一个全新的MAC网卡地址
1
openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'
  1. 断开airport无线网卡连接
1
sudo /System/Library/PrivateFrameworks/Apple80211.framework/Resources/airport -z
  1. 修改 mac 地址
1
sudo ifconfig en0 ether xx:xx:xx:xx:xx:xx

xx:xx:xx:xx:xx:xx =输入你想要修改成的MAC地址来代替。

en0 = 输入你想要修改成的网卡代替。一般 en0 就为无线网卡

  1. 重新打开网络
1
networksetup -detectnewhardware

前言

好久不用 mybatis 了,今天突然遇到了一个时间参数的格式化问题…..
mysql 后台取出的时间格式的字段,传到前台变成了时间戳
一下就想到有一个注解进行格式化
可是半天想不到那个注解怎么写的了,于是一顿查

记下来

以前经常使用的注解,现在都忘了,得记下来

  1. @JsonFormat(pattern=”yyyy-MM-dd HH:mm:ss”,timezone=”GMT+8”) : 后台 Date 类型转时间字符串,注意时区 (后台 -> 前台)
  2. @DateTimeFormat(pattern=”yyyy-MM-dd HH:mm:ss”) :前台时间格式参数转为 javabean 的 Date 类型 (前台 -> 后台)
  3. @JSONField(name=”end_time”, format=”yyyy-MM-dd HH:mm:ss”) : fastjson 专用,定义json 的 key,还有时间的格式化,也可以分别在 get set 方法上注解

前言

一般我们搭建起来的 es 集群都可以通过默认的 9200 端口来进行 API 访问,这在局域网上没有什么大问题,如果说搭建的环境在公网上,这将埋下巨大的隐患,因为任何人都可以操作 API 来进行增删改查,这是多么的恐怖!!

说明

  1. 集群环境: elasticsearch 5.3.0;centos 7.2
  2. 集群公网环境

解决方案

elasticsearch 集群搭建完成后,通过制定的端口都可以访问,但是实际情况中,我们并不想这样。我们可能想只有固定的ip地址才能访问,或者需要用户名、密码才能访问
对于如何控制 Elasticsearch 的安全性,我详细查了下资料,现有如下解决方式

  1. 官方的 x-pack 插件,收费的,一下子就觉得用不了了,截止现在(2018年5月21日16:23:19),有最新消息,在 ElasticON 2018 的开幕主题演讲中,x-pack 负责人在博客宣布将开放 X-Pack的代码,但是现在为止只是第一阶段完成,
    最后在博客中宣布在6.3版本,其中免费的X-Pack功能将包含在Elastic Stack的默认发行版中,所以说现在没戏

  2. 官方推荐的shield插件,再5.x的版本后已经集成到 x-pack里了,版本不适合,不用

  3. elasticsearch-http-basic 插件, 已经不支持 5.x的版本了,没法用

  4. ReadonlyREST : 官网地址: https://readonlyrest.com/download/ elasticsearch 版的插件,是免费的, kibana 的插件是收费的,此法可用

  5. 使用 nginx 的 http-basic,可用

ReadonlyREST 插件的使用

  1. 官网选择 elasticsearch 的版本,填写邮箱地址,收到邮件后下载插件文件
    注意:只能通过官网填写邮箱的方式来进行下载,注意看的话,下载的地址后面有校验参数
  2. 运行 bin/elasticsearch-plugin install file:///tmp/readonlyrest-1.16.19_es5.3.0.zip 安装插件,注意是 file:// 再加上绝对路径
    卸载插件 bin/elasticsearch-plugin remove readonlyrest
  3. 配置文件 readonlyrest.yml,这个比较坑,插件生成好之后,居然不生成 readonlyrest.yml,还需要我们自己配置,还不知道需要配置什么东西,没办法,只能去 github 上查看文档,
    文档地址: https://github.com/beshu-tech/readonlyrest-docs/blob/master/elasticsearch.md
  4. 文档说了很多,我找了半天才找到我需要的配置:
1
2
3
4
5
6
7
readonlyrest:
prompt_for_basic_auth: true

access_control_rules:

- name: "::ADMIN::"
auth_key: admin:12333

此时启动 elasticsearch, 再次访问 localhost:9200 就会弹出输入用户名和密码的窗口,此时输入 admin/12333 即可看到接口信息,请求成功后,在日志里会看到 ALLOWED by { name: ‘::PERSONAL_GRP::’, p。。。 的日志信息。
想要屏蔽这样的日志信息,只需再 auth_key 下面加上配置 verbosity: error 即可。默认为 info

这里吐槽一下,ReadonlyREST 插件的文档是真的难读,可能是国外人和我们的思维方式不一样吧。

至此 ReadonlyREST 插件的使用就完毕了。

nginx http-basic 的使用

利用 nginx 的反向代理,分配一个二级域名来进行使用

  1. 一个二级域名,比如xxxx.joylau.cn
  2. 添加 nginx 的配置文件:/etc/nginx/conf.d/elasticsearch.conf, nginx 会默认读取 /etc/nginx/conf.d/ 目录下的 *.conf的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
upstream JoyElasticSearch {
server localhost:port weight=1;
}


server {
listen 80;
server_name xxxxx.joylau.cn;

location / {
# 提示信息
auth_basic "请输入账号密码";
# 密码文件,最好写绝对路径
auth_basic_user_file /etc/nginx/conf.d/es-password;
autoindex on;
proxy_pass http://JoyElasticSearch;
}
}

在这里访问 xxxxx.joylau.cn 会被定向到 elasticsearch 的http端口
auth_basic_user_file :指的是密码文件,注意这里写绝对路径,防止出错

  1. 用户名,密码文件 es-password
1
2
# root:123
root:Hx53TyjMWNmLo

这里假设 用户名是root,密码是123(实际上不是123),该加密方式为 httpd 加密,怎么获取明文加密后的密文,这个在网上有很多的在线工具可以直接使用,这里不再赘述

  1. 保存并重新加载配置
1
nginx -s reload

访问 xxxxx.joylau.cn 就会提示输入用户名密码,输入正确即可。

至此,nginx http-basic 就结束了

但是还有一个问题,就是直接访问 host + elasticsearch的端口也是可以访问的,解决这个问题,需要使用 iptables 来进行端口的限制访问。

iptables 限制端口的访问

  1. 禁用防火墙 systemctl stop firewalld

  2. 禁用firewalld服务 systemctl mask firewalld

  3. 安装iptables yum install -y iptables

  4. 开机自启 systemctl enable iptables

  5. 启动 iptables systemctl start iptables

  6. 查看现在的所有规则 iptables -L -n

  7. 清空所有默认规则 iptables -F

  8. 清空所有自定义规则 iptables -X

  9. 添加限制规则 iptables -A INPUT -p tcp --dport 9200 ! -s 127.0.0.1 -j DROP
    这句规则的意思是,除了本机,其他的地址都不允许 访问 9200 端口

  10. 保存:service iptables save

注: 后续想要删除这条规则的话
直接修改 iptables.conf 文件后 service iptables save
或者 iptables -L INPUT --line-numbers 查看所有规则
iptables -D INPUT 1 (注意,这个1是行号,num下面的数字)
保存:service iptables save

这样的话,其他机器就不能访问 elasticsearch 的http 服务的端口了,这能通过 配置好的二级域名来访问

至此配置结束

集群环境下的配置

在多个 elasticsearch 集群环境下,可配置一台机器作为负载均衡的机器,配置

1
2
node.master: false
node.data: false

即可,其他机器的配置 http.enabled: false ,即对外不提供 http 服务
访问的时候只需访问那台负载均衡的节点。

至此,文章结束。

说明

  1. 系统 centos 7
  2. 能够开机启动
  3. 能够一键开启,关闭,重启

文件

注意文件编码的问题

  • service 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Unit]
Description=frp server Service
After=network.target

[Service]
## 可以包含的值为simple、forking、oneshot、dbus、notify、idel其中之一。
## Type=forking

## 守护进程的PID文件,必须是绝对路径,强烈建议在Type=forking的情况下明确设置此选项
## PIDFile=/project/frp_0.19.0_linux_amd64

## 设置启动服务是要执行的命令(命令+参数)
ExecStart=/project/frp_0.19.0_linux_amd64/systemctl-frps start
## ExecStop=
## ExecReload=

## 当服务进程正常退出、异常退出、被杀死、超时的时候,是否重启系统该服务。进程通过正常操作被停止则不会被执行重启。可选值为:
## no:默认值,表示任何时候都不会被重启
## always:表示会被无条件重启
## no-success:表示仅在服务进程正常退出时重启
## on-failure:表示仅在服务进程异常退出时重启
## 所谓正常退出是指,退出码为“0”,或者到IGHUP, SIGINT, SIGTERM, SIGPIPE 信号之一,并且退出码符合 SuccessExitStatus= 的设置。
## 所谓异常退出时指,退出码不为“0”,或者被强杀或者因为超时被杀死。
Restart=on-abort


[Install]
WantedBy=multi-user.target

文件放到 /usr/lib/systemd/system/ 下

Service 部分的启动、重启、停止命令全部要求使用绝对路径

如果单独运行的是命令,这个就已经足够了,但是如果运行一些守护进程的话或者更复杂的情况的话,需要单独写一个脚本来运行

关于 service 里面的详细配置可以参考: http://blog.51cto.com/littledevil/1912570

  • 脚本文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/bin/bash

#set service name
SERVICE_NAME=frpServerService
BIN_FILE_NAME=frps

# set basic executable environment, do not modify those lines
BIN_HOME=$(dirname $0)
if [ "${BIN_HOME}" = "." ]; then
BIN_HOME=$(pwd)
fi

cd ${BIN_HOME}

#the service pid
pid=`ps -ef|grep $SERVICE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`

start() {
if [ -n "$pid" ]; then
echo "service ${SERVICE_NAME} already start with PID :$pid"
return 0
fi
nohup ./$BIN_FILE_NAME -c ./$BIN_FILE_NAME.ini >/dev/null 2>&1 &
echo "Starting $SERVICE_NAME : "
pid=`ps -ef|grep $SERVICE_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${pid} ]; then
echo "start ${SERVICE_NAME} successfully with PID: ${pid}"
else
echo "start ${SERIVCE_NAME} failed"
fi
}

debug() {
if [ ${pid} ]; then
kill -9 $pid
fi
./${BIN_FILE_NAME} -c ./${BIN_FILE_NAME}.ini
}

stop() {
if [ -z ${pid} ]; then
echo "service $SERVICE_NAME already stopped"
else
kill -9 $pid
echo -n "Shutting down $SERVICE_NAME : "
check_pid=`jps | grep ${SERVICE_NAME}|grep -v grep|awk '{print $1}'`
while [ -n "${check_pid}" ]
do
check_pid=`jps | grep ${SERVICE_NAME}|grep -v grep|awk '{print $1}'`
if [ -z "${check_pid}" ];then
break;
fi
done
echo "stop ${SERVICE_NAME} with PID: ${pid}"
fi
}


status() {
pid=`jps | grep ${SERVICE_NAME}|grep -v grep|awk '{print $1}'`
if [ -n "$pid" ] ;then
echo "service $SERVICE_NAME (pid $pid) is running ..."
else
echo "service $SERVICE_NAME is stopped"
fi
}

# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
debug)
debug
;;
*)
echo $"Usage: $0 {start|stop|status|restart|debug}"
exit 2
esac

上面这个脚本是一个模板,包括了start,stop,status,restart,debug各个命令,是可以直接传参执行的
在一个文件上的 ExecStart= 就可以运行脚本文件 并传入 start 参数

注意: 如果运行的是守护进程的话,Type=forking 要配置上,意指 ExecStart 命令里面运行进程才是主进程

使用命令

  1. 启动服务:systemctl start serviceName
  2. 停止服务:systemctl stop serviceName
  3. 服务状态:systemctl status serviceName
  4. 项目日志:journalctl -u serviceName
  5. 开机启动:systemctl enable serviceName
  6. 重新加载service文件:systemctl daemon-reload
0%