Rootop 服务器运维与web架构

2023-11-14
发表者 Venus
centos7下pyenv安装测试已关闭评论

centos7下pyenv安装测试

# github仓库,下载zip包
https://github.com/pyenv/pyenv

[root@jenkins ~]# unzip pyenv-master.zip 
[root@jenkins ~]# mv pyenv-master .pyenv
[root@jenkins ~]# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
[root@jenkins ~]# echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
[root@jenkins ~]# echo 'eval "$(pyenv init -)"' >> ~/.bashrc
[root@jenkins ~]# source .bashrc

# 查看已安装版本
[root@jenkins ~]# pyenv versions
* system (set by /root/.pyenv/version)

# 手动下载py安装包放入到pyenv下的 cache(手动新建)目录中,防止某些情况下下载慢。
https://www.python.org/downloads/
https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz

需要下载 tar.xz 压缩格式的,不能是 tgz 的。这里用3.12.0版本测试。
[root@jenkins .pyenv]# mkdir cache

# 手动上传安装包

[root@jenkins cache]# ll
total 20096
-rw-r--r-- 1 root root 20575020 Oct  2 08:33 Python-3.12.0.tar.xz

# 安装会用到的依赖包,否则可能会提示ModuleNotFoundError: No module named 'xxx'的错误。

[root@jenkins cache]# yum install gcc make patch zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel tk-devel libffi-devel xz-devel

# 安装
[root@jenkins cache]# pyenv install 3.12.0
Installing Python-3.12.0...

可以看到是直接安装,没有下载步骤。

# 把上传的压缩包改个名,就会变为自动下载安装。
[root@jenkins cache]# mv Python-3.12.0.tar.xz Python-3.12.0.tar.xz.bak
[root@jenkins cache]# pyenv install 3.12.0
Downloading Python-3.12.0.tar.xz...
-> https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz

# 查看已安装的版本
[root@jenkins cache]# pyenv versions
* system (set by /root/.pyenv/version)
  3.8.18
  3.9.18

# 全局切换版本
[root@jenkins ~]# pyenv global 3.8.18
[root@jenkins ~]# python -V
Python 3.8.18

# 换回系统自带版本
[root@jenkins ~]# pyenv global system

这样pip下载的包都会在.pyenv目录下,方便将其传到别的服务器,无需再安装。

2023-11-01
发表者 Venus
linux中磁盘sda变成sdb,sdb变成sda,盘符混乱的问题已关闭评论

linux中磁盘sda变成sdb,sdb变成sda,盘符混乱的问题

esxi虚拟化安装的虚拟机,添加了500G数据盘,安装完系统后要创建分区,并格式化挂载数据盘发现盘符为sda。
系统盘盘符为sdb,当时并未在意这个问题。

安装完docker版的gitlab后,关闭selinux,关闭firewalld、update系统等操作后,重启系统,发现gitlab里创建的仓库不见了。

以为是docker的问题,没有做持久化,就又创建了个仓库,重启测试看看会不会丢失,发现之前的仓库又回来了。

无意间执行 df -h 看到数据盘(fstab里配置的为sda1)没有挂载。

fdisk -l 时发现数据盘已经变为sdb1,以为当时分区时记错了,实际并不是,是由于盘符混乱导致的。

原因是内核扫描硬盘分配盘符,顺序出了问题。
解决这个问题就是使用uuid的方式挂载,不再用传统的盘符方式(这么多年第一次遇到)。

# 查看硬盘uuid
[root@localhost ~]# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Nov  1 11:38 0b63526f-9f3d-4695-ae2c-a6e86e2195e9 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Nov  1 11:38 79271dc0-5c38-47b1-8c24-b546c04f917e -> ../../sda1
lrwxrwxrwx 1 root root 10 Nov  1 11:38 f14bc246-d1a7-4acb-af7c-c49df2074672 -> ../../sda2

# 或者执行 blkid 命令
[root@localhost ~]# blkid 
/dev/sdb1: UUID="0b63526f-9f3d-4695-ae2c-a6e86e2195e9" TYPE="ext4" PARTUUID="a6b8773b-01"
/dev/sda2: UUID="f14bc246-d1a7-4acb-af7c-c49df2074672" TYPE="ext4" PARTUUID="b118ae54-02"
/dev/sda1: UUID="79271dc0-5c38-47b1-8c24-b546c04f917e" TYPE="ext4" PARTUUID="b118ae54-01"

# 挂载
[root@localhost ~]# cat /etc/fstab 
UUID=0b63526f-9f3d-4695-ae2c-a6e86e2195e9	/home	ext4	defaults 0 0



# 验证重启会不会导致盘符发生变化。
[root@localhost ~]# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Nov  1 12:39 0b63526f-9f3d-4695-ae2c-a6e86e2195e9 -> ../../sda1
lrwxrwxrwx 1 root root 10 Nov  1 12:39 79271dc0-5c38-47b1-8c24-b546c04f917e -> ../../sdb1
lrwxrwxrwx 1 root root 10 Nov  1 12:39 f14bc246-d1a7-4acb-af7c-c49df2074672 -> ../../sdb2

# 重启 reboot
[root@localhost ~]# ll /dev/disk/by-uuid/
total 0
lrwxrwxrwx 1 root root 10 Nov  1 13:01 0b63526f-9f3d-4695-ae2c-a6e86e2195e9 -> ../../sdb1
lrwxrwxrwx 1 root root 10 Nov  1 13:01 79271dc0-5c38-47b1-8c24-b546c04f917e -> ../../sda1
lrwxrwxrwx 1 root root 10 Nov  1 13:01 f14bc246-d1a7-4acb-af7c-c49df2074672 -> ../../sda2

2023-10-12
发表者 Venus
aws DMS 数据库迁移服务已关闭评论

aws DMS 数据库迁移服务

目的:将云服务器中的mysql数据库迁移到aws的RDS(mysql)数据库中

例如将腾讯云cvm中自建的mysql数据库挪到aws 的rds中,先设置端点,一个源(腾讯云),一个目标(需要先创建aws的RDS数据库)。
1、创建 复制实例
注意先创建 子网组

2、配置端点

注意要在源端点中刷新架构。
刷新架构需要时间,重复刷新会提示:
Schema refresh is already in progress
3、迁移任务中选择源数据库(此处叫 架构)

# 官方资料:
https://repost.aws/zh-Hans/knowledge-center/migrate-mysql-rds-dms
https://docs.aws.amazon.com/zh_cn/dms/latest/userguide/Welcome.html

2023-10-07
发表者 Venus
docker挂载宿主机文件修改后容器内不同步问题已关闭评论

docker挂载宿主机文件修改后容器内不同步问题

通过docker -v 参数挂载了配置文件到容器内。
发现在宿主机上改完后,进入容器内查看此文件并没有同步过来。

实际是因为-v 挂载文件(包括文件夹)是挂载的inode号,通过vi修改文件后inode号发生变化,但容器内还是旧的inode号。

参考:https://blog.csdn.net/biao0309/article/details/105186106 文章内容。
当使用vim之类的编辑器进行保存时,它不是直接保存文件,而是采用了备份、替换的策略,
就是编辑时,是创建一个新的文件,在保存的时候,把备份文件替换源文件,这个时候文件的 inode 就发生了变化,
而原来 inode 对应的文件其实并没有修改,也就是容器内的文件没有变化。
当重启容器的时候,会挂载新的 inode

# 测试,查看当前配置文件inode号为 4068031
root@server:/data/www/rgs/conf# stat www.conf 
  File: www.conf
  Size: 810       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 4068031     Links: 1
Access: (0644/-rw-r--r--)  Uid: (   33/www-data)   Gid: (   33/www-data)
Access: 2023-10-07 05:50:30.326634010 +0000
Modify: 2023-10-07 05:50:30.326634010 +0000
Change: 2023-10-07 05:50:30.326634010 +0000
 Birth: -

# 随便改点东西,添加个空行都可以。
root@server:/data/www/rgs/conf# vi www.conf 

# 再次查看inode号变为 4068032
root@server:/data/www/rgs/conf# stat www.conf 
  File: www.conf
  Size: 811       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 4068032     Links: 1
Access: (0644/-rw-r--r--)  Uid: (   33/www-data)   Gid: (   33/www-data)
Access: 2023-10-07 05:58:27.874527154 +0000
Modify: 2023-10-07 05:58:27.874527154 +0000
Change: 2023-10-07 05:58:27.874527154 +0000
 Birth: -


# 在容器内查看,还是4068031
root@404b0ceb1aea:/var/www/html# cd /usr/local/etc/php-fpm.d/
root@404b0ceb1aea:/usr/local/etc/php-fpm.d# stat www.conf
  File: www.conf
  Size: 810       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 4068031     Links: 0
Access: (0644/-rw-r--r--)  Uid: (   33/www-data)   Gid: (   33/www-data)
Access: 2023-10-07 05:58:22.458398126 +0000
Modify: 2023-10-07 05:50:30.326634010 +0000
Change: 2023-10-07 05:58:27.874527154 +0000
 Birth: 2023-10-07 05:50:30.326634010 +0000
root@404b0ceb1aea:/usr/local/etc/php-fpm.d# 

2023-09-28
发表者 Venus
sftp 限制目录及禁止ssh登录已关闭评论

sftp 限制目录及禁止ssh登录

需求:通过sftp拉取服务器某个目录下的文件,并禁止此用户切换目录及ssh登录。

# 创建目录,将用户锁定到此目录下。
[root@localhost ~]# mkdir -p /data/www/sftp

# ssh配置文件
[root@localhost ~]# cat /etc/ssh/sshd_config|grep -vE "^#|^$"
Include /etc/ssh/sshd_config.d/*.conf
AuthorizedKeysFile	.ssh/authorized_keys

### 最后追加下面配置 ###
Subsystem       sftp    internal-sftp
Match User sftp
ChrootDirectory /data/www/sftp
AllowTcpForwarding no
X11Forwarding no

注意把原先的 Subsystem 开头那行注释掉。
如果想配置多个账号,就再添加一段配置。

Match User user2
ChrootDirectory /data/www/user2
AllowTcpForwarding no
X11Forwarding no

Match User为要匹配的用户,也就就是针对哪个用户做限制。一定要设置,否则root账号就无法ssh登录系统了。
这里创建一个用户为sftp并设置shell为nologin

[root@localhost ~]# useradd -s /sbin/nologin sftp

这样就禁止了用户通过ssh登录服务器,但sftp可以用。

注意这个路径 /data/www/sftp 属主属组必须为root,父级目录也一样,直到/目录。
否则secure日志会报下面错误

fatal: bad ownership or modes for chroot directory component "/data/www/sftp" [postauth]

在此目录下创建一个文件夹,使php运行用户有权限写入文件。

mkdir daily_critical_file_reports
chown www-data:www-data daily_critical_file_reports

这样sftp用户就被锁定在 /data/www/sftp 目录下,且无法创建、删除文件夹及文件。