个人云服务器软件配置备忘录

创建非root用户

创建用户

useradd -m -s /bin/bash zxc

其中useradd是添加用户的命令,需要root权限,-m表示自动创建用户的家目录,-s /bin/bash指定用户登录后使用的shell。

设置密码

passwd zxc

重复输入密码,回车确定。

将用户加入sudoer

新建的用户默认是无法使用sudo命令的,需要修改/etc/sudoers文件,而这个文件默认是只读的,u+wu表示文件的拥有者,+w表示添加写权限,在这里也相当于chmod 600了。

chmod u+w /etc/sudoers

然后修改/etc/sudoers文件,添加一行

zxc ALL=(ALL:ALL) ALL

这里添加的语句可以有4种形式,分别是:

xxx ALL=(ALL:ALL) ALL
%xxx ALL=(ALL:ALL) ALL
xxx ALL=(ALL:ALL) NOPASSWD: ALL
%xxx ALL=(ALL:ALL) NOPASSWD: ALL

它们的含义分别是: 允许用户xxx执行sudo命令(需要输入密码); 允许用户组xxx里面的用户执行sudo命令(需要输入密码); 允许用户xxx执行sudo命令(不需要输入密码); 允许用户组xxx里面的用户执行sudo命令(不需要输入密码)。

其中这几个ALL的含义分别是:第一个ALL是主机限定,可以改为localhost,改成别的ip的情况,我猜测可能可以执行sudo但是只能执行另一台主机的命令,第二个ALL是限定可以以该用户的角色去执行命令,所以可以改成root,冒号后面的第三个ALL是表示用户组,含义同第二个,最后一个ALL表示可以执行的命令。

最后记得撤销文件的写权限

chmod u-w /etc/sudoers

配置ssh密钥登录

本地生成ssh密钥

ssh-keygen -t rsa

表示使用rsa生成密钥存放在~/.ssh目录下,在linux中~表示家目录,普通用户就是/home/xxx,root用户就是/root

  • 将公钥复制到远程主机
ssh-copy-id -i ~/.ssh/id_rsa.pub  zxc@xxx.xx.xx.xx

-i表示指定公钥文件位置,这个公钥会被复制到远程主机~/.ssh/下的authorized_keys文件,这个文件保存了被授权允许通过ssh登录的主机公钥。

  • 修改文件读写权限
chmod 600 ~/.ssh/authorized_keys
chmod 700 -R ~/.ssh

为了保证安全,其中600表示只有拥有者有读写权限,700表示只有拥有者有读、写、执行权限。

禁止密码登录(可选)

修改etc/ssh/sshd_conf文件

PasswordAuthentication no

解决客户端SSH连接服务器一段时间不操作之后卡死的问题

修改本地文件/etc/ssh/ssh_config,添加两个配置

ServerAliveInterval 50 #每隔50秒就向服务器发送一个请求
ServerAliveCountMax 3  #允许超时的次数

然后重启ssh服务

sudo /etc/init.d/ssh restart

环境变量

配置方法

在Linux系统中,环境变量是用来定义系统运行环境的一些参数。

export命令显示系统定义的所有环境变量,而echo $PATH命令可以显示PATH环境变量的值,也就是在命令行输入一个命令,默认查找的位置。

配置环境变量的方法有以下几种:

方法一 export

直接使用export命令修改环境变量,比如

export PGHOST=localhost

设置一个名为PGHOST的环境变量,值为localhost

比如

export PATH=/home/uusama/mysql/bin:$PATH
# 或者
export PATH=$PATH:/home/uusama/mysql/bin

添加PATH环境变量的值,其中$PATH表示原来的值,和新的值之间用冒号分隔。

注意:

key value
生效时间 立即生效
生效期限 当前终端有效,窗口关闭后失效
生效范围 仅对当前用户有效

方法二 ~/.bashrc

通过修改~/.bashrc文件进行配置。

注意:

key value
生效时间 使用相同用户重新打开终端生效,或者手动执行source ~/.bashrc生效
生效期限 永久有效
生效范围 仅对当前用户有效

方法三 ~/.bash_profile

通过修改~/.bash_profile文件进行配置。

注意:

key value
生效时间 使用相同用户重新打开终端生效,或者手动执行source ~/.bash_profile生效
生效期限 永久有效
生效范围 仅对当前用户有效

方法四 /etc/bashrc

通过修改/etc/bashrc文件进行配置,需要root权限以及该文件的写入权限。

注意:

key value
生效时间 重新打开终端生效,或者手动执行source /etc/bashrc生效
生效期限 永久有效
生效范围 对所有用户有效

方法五 /etc/profile

通过修改/etc/profile文件进行配置,需要root权限以及该文件的写入权限。

注意:

key value
生效时间 重新打开终端生效,或者手动执行source /etc/profile生效
生效期限 永久有效
生效范围 对所有用户有效

方法四 /etc/enviroment

通过修改/etc/enviroment文件进行配置,需要root权限以及该文件的写入权限。

注意:

key value
生效时间 重新打开终端生效,或者手动执行source /etc/enviroment生效
生效期限 永久有效
生效范围 对所有用户有效

加载顺序

基本上是从系统级到用户级,从profilebashrc的顺序

  • /etc/environment
  • /etc/profile
  • /etc/bashrc
  • ~/.profile
  • ~/.bashrc

PostgreSQL

安装

sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get -y install postgresql

sh -c的作用是将后面的字符串当做完整的命令来执行,这样就可以保证sudo的作用范围在整个命令,然后echo命令表示输出文本,后面加上重定向符号表示输出到文件/etc/apt/sources.list.d/pgdg.list,这个文件以.list为拓展名,表示是第三方源,统一放在sources.list.d这个文件夹下,而/etc/sources.list这个则是官方的软件源。

list文件的格式主要分为几部分,第一部分通常是deb或者deb-src,因为ubuntu是基于debian的,deb其实就是debian的前三个字母,在这里表示通过.deb文件安装或者通过源码安装;第二部分是安装文件的url,在这里是http://apt.postgresql.org/pub/repos/apt,第三部分是版本代号,这里是$(lsb_release -cs)-pgdg,其中$()可以理解为执行括号内的命令得到的输出,在服务器Ubuntu20.04系统上输出是focal,所以对应的可以在刚才的url里找到./dists/focal-pgdg这个文件夹里的安装文件,而在本地执行这个命令显示n/a,第四部分是限定词,这里是main

配置了软件源,就要通过apt-get update更新软件源(不是更新软件),通俗理解是把新的软件源中的软件列表更新到电脑上,而apt-get upgrade才是更新软件。

apt-get -y install中的-y表示跳过确认yes/no,通过这个命令,软件默认安装到了/usr/share下的对应文件夹。

配置

PostgreSQL安装后默认创建了一个名为postgres的用户,既是DMBS的用户,也是Linux用户,所以先切换到该用户进入psql。

sudo su - postgres
psql

此时进入PostgreSQL的交互式shell,修改默认用户密码,并添加一个刚刚创建的Linux用户所对应的数据库用户。

ALTER USER postgres WITH PASSWORD 'xxxxxx';

修改密码后,如果当前Linux用户就是数据库对应的用户,也无需密码即可进入,否则通过psql -U usernmae再输入密码进入。

此时如果用用户zxc执行命令psql -U postgres会报错,有两种解决方案,一个数需要指定-h localhost,或者将PGHOST=localhost写入环境变量里,另一个是修改配置文件pg_hba.conf

# 将这一行最后的peer改为md5(需要密码)或者trust(不需要密码)
local  all  postgres  md5

注意到下面还有一行,也是同样的用处,all表示不指定某一个用户,但是在这里单独修改是不生效的,相当于通用的规则会被上面特定用户的规则所覆盖。

local  all  all  md5

修改后通过service postgresql reload重启生效,或者在psql shell中执行SELECT pg_reload_conf()

MongoDB

安装

类似的,通过官网配置软件源的方式来安装。

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org

但是因为对Linux不熟悉,所以我觉得这种安装方法比较难以控制,所以采用tarball压缩包的安装方法。

现在官网 下载一个tgz压缩包并解压,这里我在~目录下创建了一个tgz文件夹用来放一些软件的压缩包,一个app文件夹放这些软件。

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-4.4.2.tgz
tar -zxvf mongodb-linux-*-4.4.2.tgz -C ../app/
mv mongodb-linux-aarch64-ubuntu2004-4.4.2/ mongodb/

下载的时候如果出现域名解析错误,就需要修改/etc/resolv.conf,添加googleDNS域名服务器。

nameserver 8.8.8.8
nameserver 8.8.4.4

然后注意下载的应该是x86_64版本,也就是不加(arm)的版本,可以通过命令arch来查询。

解压时-C指定解压目录。

配置

然后需要配置环境变量,这里我们配置在~/.bashrc文件中。

export PATH=$PATH:/home/zxc/app/mongodb/bin/

创建数据目录和日志目录,这里我在~/app下创建了mongondb-data用来存放mongodb相关的所有数据,里面有一个data文件夹和一个log文件夹。

然后启动mongod,这里的d就是deamon的意思,守护进程,相当于启动了一个后台监控服务。

mongod --dbpath ~/app/mongodb-data/data --logpath ~/app/mongodb-data/log/mongod.log --fork

默认情况下,MongoDB没有启用访问控制,没有默认的用户名和密码,所以可以直接通过mongodb命令进入shell。为了实现用户角色的访问控制,我们需要自己创建用户。

首先创建一个管理员用户admin

use admin
db.createUser({
        user:"userAdmin",
        pwd:"xxxxxxxx",
        roles:[
            "clusterAdmin",
            "dbAdminAnyDatabase",
            "userAdminAnyDatabase",
            "readWriteAnyDatabase"
        ]
    }
)

分别给这个userAdmin的用户分配了集群管理权限,所有数据库管理权限,所有用户管理权限,所有数据库读写权限。

然后重启mongod,注意加上--auth参数。然后通过db.auth()方法进行授权验证,才可以进行其他操作。

注意正确的关闭mongod的方法是在mongo shell中使用db.shutdownServer()函数。

use admin
db.auth("userAdmin","xxxxxxxx")

然后注意,MongoDB启动之后,默认是只绑定本机ip,要想远程访问,还需要加上参数--bind_ip=0.0.0.0,我们可以把这些启动参数保存在一个配置文件

dbpath=/home/zxc/app/mongodb-data/data
logpath=/home/zxc/app/mongodb-data/log/mongod.log
logappend=true
port=27017
fork=true
auth=true
bind_ip=0.0.0.0 # 所有ip可访问,为了安全可以指定客户端ip

启动mongod指定配置文件即可。

mongod -f mongod.conf

注意nohttpinterface这个配置属性默认是关闭的,所以我们也可以通过浏览器访问ip:27017来判断mongod是否已经正确启动。

Docker

安装

按照官网文档,选择通过存储库(repository)来进行安装。

这是更新apt包索引以及安装允许使用HTTPS存储库的包。

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

添加官方密钥。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

其中curl是也是下载命令,-fsSL-f表示当出现HTTP错误时静默,-s也表示静默模式,因为这里的输出将作为下一条命令的输入,所以不需要其他的输出,-S表示即使开了-s,也会输出错误,-L表示服从重定向,|是管道符号,表示上一条命令的输出作为下一条命令的参数,apt-key add表示将软件包密钥添加到本地trusted数据库中,-表示stdin(标准输入),也正是上一条命令curl的输出通过管道变成这条命令的标准输入

设置稳定版本的存储库。

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

add-apt-repository命令其实是一个python脚本,自动在source.list里添加软件源。

安装docker稳定版。

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

最后通过运行hello world镜像来判断是否安装成功。

sudo docker run hello-world

配置

因为众所周知的原因,我们需要修改仓库镜像源,直接修改/etc/docker/daemon.json文件,加入中科大,网易,官方中国仓库三个。

{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com","https://registry.docker-cn.com"]}

然后顺便搭建一个nextcloud私有云盘。

sudo docker run -d -p 8080:80 nextcloud

-d表示detach,默认在后台运行容器,并且返回容器id,-p表示将容器的一个端口暴露给外层主机,这里8080:80表示访问外部主机8080端口就映射到该容器的80端口,也就是nextcloud的默认端口。

docker默认每次执行都需要root权限,并且docker守护进程启动的时候,会默认赋予名字为docker的用户组读写Unix socket的权限,因此只需要将当前用户加入到docker用户组即可。

sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker

groupadd docker是创建一个docker用户组,这里通常已经自动创建好了,gpasswd -a表示添加用户到用户组,newgrp是切换到指定用户组。

安装docker-compose,docker-compose是一个通过yml文件来管理多容器应用的工具,而不需要每次都去拉去image,再创建多个容器。

下载,如果速度太慢可以本地下载后再上传到服务器。

sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

添加执行权限。

sudo chmod +x /usr/local/bin/docker-compose

创建软链接。

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

测试是否安装成功。

docker-compose --version