Rootop 服务器运维与web架构

2021-04-01
发表者 Venus
nginx配置webdav做为网盘已关闭评论

nginx配置webdav做为网盘

# github 上下载额外的模块才能完整支持webdav的客户端
https://github.com/arut/nginx-dav-ext-module
此模块增加 PROPFIND,OPTIONS,LOCK,UNLOCK 这几个请求方法的支持。
在nginx官方提到了”WebDAV clients that require additional WebDAV methods to operate will not work with this module.”,所以需要此三方模块。

# nginx 自带的 ngx_http_dav_module 支持 PUT, DELETE, MKCOL, COPY, MOVE 请求方法。
http://nginx.org/en/docs/http/ngx_http_dav_module.html

[root@MiWiFi-RA69-srv tar.gz]# git clone https://github.com/arut/nginx-dav-ext-module.git
[root@MiWiFi-RA69-srv nginx-1.19.9]# yum install -y libxml2-devel libxslt-devel
[root@MiWiFi-RA69-srv nginx-1.19.9]# ./configure --prefix=/home/software/nginx --with-http_ssl_module --with-http_dav_module --add-module=../nginx-dav-ext-module/
[root@MiWiFi-RA69-srv nginx-1.19.9]# make && make install
[root@MiWiFi-RA69-srv ~]# mkdir  /home/dav
[root@MiWiFi-RA69-srv ~]# chmod -R 777  /home/dav

# nginx配置

server {
	listen       80;
	server_name  localhost;

	location /dav
	{
		client_max_body_size 5G;
		alias /home/dav;
		index index.html index.htm;
		autoindex on;
		client_body_temp_path /tmp;
		
		# ngx_http_dav_module 模块支持
		dav_methods PUT DELETE MKCOL COPY MOVE;
		create_full_put_path on;
		
		# nginx-dav-ext-module 模块支持
		dav_ext_methods PROPFIND OPTIONS LOCK UNLOCK;	
	}
}

启动nginx

客户端用 Cyberduck 软件,官网:https://cyberduck.io/

另外也可以添加nginx的auth_basic认证实现用户登陆验证。

2021-03-31
发表者 Venus
python3 requests配置socks5代理访问已关闭评论

python3 requests配置socks5代理访问

采集数据时,访问次数过多会被封IP,所以加上socks5代理去请求。

#!/usr/bin/python
# coding=utf-8

import requests

headers = {
    'Host': 'www.rootop.org',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36',
}

# socks5无认证
#proxies = {'https': 'socks5://61.97.x.x:20115','http': 'socks5://61.97.x.x:20115'}

# socks5带密码认证
proxies = {'https': 'socks5://user111:pass111@61.97.x.x:20115','http': 'socks5://user111:pass111@61.97.x.x:20115'}
page = requests.get("https://www.rootop.org/pages/4927.html", headers=headers, proxies=proxies)
print(page.text)

nginx日志可以看到来源ip变成代理服务器的ip。

{
"remote_addr":"61.97.x.x",
"time_local":"31/Mar/2021:09:54:02 +0800",
"method":"GET","uri":"/index.php",
"server_protocol":"HTTP/1.1",
"request":"GET /pages/4927.html HTTP/1.1",
"user_agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36"
}

2021-01-27
发表者 Venus
rocketmq主从已关闭评论

rocketmq主从

rocketmq下载页面:http://rocketmq.apache.org/dowloading/releases/
本次搭建用的版本:https://archive.apache.org/dist/rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip

2台机器centos7.x
node2 192.168.0.15 主
node3 192.168.0.10 从

各解压到 /home/software/rocketmq

# 2台机器各正常启动 mqnamesrv 服务(9876端口)

[root@node2 bin]# ./mqnamesrv &
[root@node3 bin]# ./mqnamesrv &

# broker master配置文件(192.168.0.15)

[root@node2 conf]# cat broker.conf 
namesrvAddr=192.168.0.15:9876;192.168.0.10:9876

# 多网卡时指定
brokerIP1=192.168.0.15

brokerClusterName = rootopCluster

# brokerName相同则表示broker开启master slave
brokerName = broker-a

# brokerId,0表示master,非0表示slave
brokerId = 0

deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH

# 修改 store 生成目录,否则会在用户家目录创建
storePathRootDir = /home/software/rocketmq/store
storePathCommitLog = /home/software/rocketmq/store/commitlog
diskMaxUsedSpaceRatio = 90

#发送消息的最大线程数
sendMessageThreadPoolNums: 200

#发送消息是否使用可重入锁
useReentrantLockWhenPutMessage: true

# 修改生成的 logs 目录,否则会在用户家目录创建

[root@node2 conf]# sed -i 's#\${user.home}#/home/software/rocketmq#g' logback_broker.xml 
[root@node2 conf]# sed -i 's#\${user.home}#/home/software/rocketmq#g' logback_tools.xml
[root@node2 conf]# sed -i 's#\${user.home}#/home/software/rocketmq#g' logback_namesrv.xml

# 修改 runserver.sh、runbroker.sh 启动脚本默认内存参数,否则启动可能提示无法分配内存(机器内存大的话忽略)

[root@node2 bin]# sed -i 's/-Xms4g -Xmx4g -Xmn2g/-Xms2g -Xmx2g -Xmn1g/g' runserver.sh
[root@node2 bin]# sed -i 's/-Xms8g -Xmx8g -Xmn4g/-Xms2g -Xmx2g -Xmn1g/g' runbroker.sh

# 启动broker

[root@node2 bin]# ./mqbroker -c /home/software/rocketmq/conf/broker.conf &

# 查看端口状态,mqnamesrv占用9876端口

[root@node2 bin]# netstat -tnlp | grep java
tcp6       0      0 :::10909                :::*                    LISTEN      20372/java          
tcp6       0      0 :::10911                :::*                    LISTEN      20372/java          
tcp6       0      0 :::10912                :::*                    LISTEN      20372/java          
tcp6       0      0 :::9876                 :::*                    LISTEN      20335/java 

10909 监听端口值 listenPort – 2,即默认为10909
10911 监听 listenPort 配置项指定的监听端口,默认10911
10912 监听端口为值为listenPort+1,即10912,该端口用于Broker的主从同步

# node3配置,broker slave配置文件(192.168.0.10)

[root@node3 conf]# cat broker.conf 
namesrvAddr=192.168.0.15:9876;192.168.0.10:9876
brokerIP1=192.168.0.10
brokerClusterName = rootopCluster
brokerName = broker-a
brokerId = 1
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE
flushDiskType = ASYNC_FLUSH

# 启动从broker

[root@node3 bin]# ./mqbroker -c /home/software/rocketmq/conf/broker.conf &

# mq web控制台管理服务,并解决 rocketmq-console-ng报错:exception.ServiceException: This date have’t data!,原因是时区不对

[root@node3 ~]# docker run -dit --name mqconsole -e "JAVA_OPTS=-Drocketmq.namesrv.addr=192.168.0.10:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false -Duser.timezone='Asia/Shanghai'" -p 8080:8080 -v /etc/localtime:/etc/localtime styletang/rocketmq-console-ng

# 关闭服务

[root@node2 bin]# ./mqshutdown namesrv
[root@node2 bin]# ./mqshutdown broker

# 百度的资料
https://blog.csdn.net/ever223/java/article/details/100547232

在开发中,经常使用到各种消息中间件,用于系统间的数据交换与异步解耦。常用的消息中间件有Kafka、RabbitMQ、RocketMQ。
不同的消息中间件在原理及使用上都有着自身的特点,比如Kafka和RocketMQ在协调点选择上就存在着很大的差异,Kafka是通过Zookeeper来进行协调,而RocketMQ通过自身的NameServer进行协调。
Kafka使用Zookeeper作为协调服务,故具备选举功能。选举主要分为两步:
1. Kafka先通过Zookeeper选举出Controller;
2. 再通过选举出的Controller,选出每个Partition的Leader副本和Follower副本。由于Kafka具备选举功能,所以某个Partition的Leader挂了,该Partition对应的某个Follower就会升级为Leader对外提供服务。
RocketMQ不具备选举
NameServer,很多时候称为命名发现服务,其在RocketMQ中起着中转承接的作用,是一个无状态的服务,多个NameServer之间不通信。
任何Producer、Consumer、Broker与所有NameServer通信,向NameServer请求或者发送数据。而且都是单向的,Producer和Consumer请求数据,Broker发送数据。正是因为这种单向的通信,RocketMQ水平扩容变得很容易。

NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。MetaQ 1.x和MetaQ 2.x是依赖ZooKeeper的,由于ZooKeeper功能过重,RocketMQ(即MetaQ 3.x)去掉了对ZooKeeper依赖,采用自己的NameServer。
Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。
Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。

2021-01-26
发表者 Venus
mongodb二进制版本命令行参数启动加身份认证已关闭评论

mongodb二进制版本命令行参数启动加身份认证

下载地址:https://www.mongodb.com/download-center/community
这里下载的版本:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.6.tgz

这里解压到 /home/software/mongodb 目录。
然后创建2个目录用于存放日志和数据。

[root@db-mongo ~]# mkdir /home/software/mongodb/log
[root@db-mongo ~]# mkdir /home/software/mongodb/data

# 先用不带身份认证参数启动(–auth)

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --fork

# 命令行关闭服务,需要指定db数据目录

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --shutdown --dbpath /home/software/mongodb/data/

# mongo控制台关闭

[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> db.shutdownServer()

或者用kill 15 发送停止信号。

# 查看库

[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

# 切换库,如果库不存在,则会创建。

> use test
switched to db test

但此时数据库为空,show dbs看不到。

# 为admin库设置用户名密码,角色为超级管理员

> use admin
switched to db admin
> db.createUser({user:'root',pwd:'111111',roles:['root']})  #只有admin数据库才有root角色

Successfully added user: { "user" : "root", "roles" : [ "root" ] }

# 修改为带认证参数启动mongodb

[root@db-mongo ~]# /home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --fork --auth
[root@db-mongo ~]# /home/software/mongodb/bin/mongo
> show dbs
> 

发现看不到前面3个库了,因为需要认证后才能看。

# 控制台认证admin库的账号密码

> use admin
switched to db admin
> db.auth("root","111111")
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

# 新建一个库,并设置密码,注意密码中不要带@艾特符号,mongodb是一个库一个账号。

> use rootop
> db.createUser({
user:"aaa",
pwd:"aaa###bbb",
roles:[
{"role":"readWrite","db":"rootop"},
{"role":"dbAdmin","db":"rootop"}
]})

# 插入数据

> db.rootop.insert({"user":"aaa"})
WriteResult({ "nInserted" : 1 })

# 启动关闭脚本保存为 mon.sh

#!/bin/bash
need_pass="--auth"
if [ "$2" == "false" ];then
	need_pass=""
fi

case $1 in
 start)
	/home/software/mongodb/bin/mongod --logpath /home/software/mongodb/log/log.log --dbpath /home/software/mongodb/data --maxConns 65535 --bind_ip_all --port 27017 --journal --fork $need_pass --wiredTigerCacheSizeGB=1
	;;
 stop)
	/home/software/mongodb/bin/mongod --shutdown --dbpath /home/software/mongodb/data/
	;;
	*)
	echo sh mon.sh start [false]/stop
	;;
esac

在测试环境发现mongo内存占用挺大,限制下内存。
# 限制内存参数,加到启动参数里。
比如限制为1G

--wiredTigerCacheSizeGB=1

# mongodb官方客户端
https://www.mongodb.com/download-center/compass

# 导出指定库,注意用库所对应的账密

[root@db-mongo ~]# /home/software/mongodb/bin/mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 -d xxx -o /root/backup/xxx # -o 保存备份的目录

# 导入指定库,注意用库所对应的账密

[root@db-mongo ~]# /home/software/mongodb/bin/mongorestore -h 127.0.0.1 --port 27017 -u root -p 123456 -d xxx --drop /root/backup/xxx

# 备份脚本,注意备份哪个库,就用哪个库的账号

#!/bin/bash
mongodump=/home/software/mongodb/bin/mongodump 
host=127.0.0.1
port=27017
user=root
pass=123456
db=xxx
path=/home/mongobak
dir_name=$(date +%Y-%m-%d-%H-%M-%S)
$mongodump -h $host --port $port -u $user -p $pass -d $db -o $path/$db-$dir_name

2021-01-05
发表者 Venus
xshell4或者xftp连接报 找不到匹配的outgoing encryption算法已关闭评论

xshell4或者xftp连接报 找不到匹配的outgoing encryption算法

我这里用的是xmanager4版本。

解决方法一般都是修改连接配置文件,把加密里面的算法勾上。这个百度出来的大都是这个方法。

另一种方法在 https://access.redhat.com/es/solutions/895853
注释掉ssh指定的加密算法

[root@centos ~]# cat /etc/ssh/sshd_config | grep Ciphers
# Ciphers and keying
Ciphers aes128-ctr,aes192-ctr,aes256-ctr

把上面指定的加密方式参数注释掉,重启ssh服务。

最靠谱的还是升级xshell,4版本挺旧了。