云服务器笔记
阿里云地址
创建工作用户并赋予sudo权限
登录到新服务器。打开Terminal,然后:
1
|
ssh user@hostname // 例如:ssh lx@66.166.166.166
|
user: 用户名(如root)
hostname: IP地址或域名(如xxx.xxx.xxx.xxx)
第一次登录时会提示:
1
2
3
4
|
The authenticity of host '66.188.185.66 (66.188.185.66)' can't be established.
ED25519 key fingerprint is SHA256:SZfhynS8auEJWvEIyecTGm8m8VeflY1g+s8gzJ88PRI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
|
输入yes,然后回车即可。
这样会将该服务器的信息记录在~/.ssh/known_hosts文件中。
然后输入密码即可登录到远程服务器中。
默认登录端口号为22。如果想登录某一特定端口:
1
|
ssh user@hostname -p 22
|
登录成功后,创建lx用户:
1
2
|
adduser lx # 创建用户lx
usermod -aG sudo lx # 给用户lx分配sudo权限
|
切换到lx用户:
下次就可以直接ssh到新用户 lx 来登录到您的云服务器(实现多用户使用同一云服务器)
配置别名和免密登录方式
按Ctrl+d或者输入exit退回本地的Terminal,在自己电脑端配置lx用户的别名和免密登录
别名
创建文件 ~/.ssh/config。
然后在文件中输入:
1
2
3
4
5
6
7
|
Host myserver1
HostName xxx.xxx.xxx.xxx # IP地址或域名
User lx # 用户名
# Port 20000 这里我们没有修改端口号,所以不用加,但是后面的docker连接就需要加了
Host myserver2
HostName xxx.xxx.xxx.xxx # IP地址或域名
User root # 用户名
|
之后再使用服务器时,可以直接使用别名myserver1、myserver2。
免密登录
本地主机创建密钥:
然后一直回车即可。
执行结束后,~/.ssh/目录下会多两个文件:
之后想免密码登录哪个服务器,就将公钥传给哪个服务器即可。
例如,想免密登录myserver1服务器。则将公钥中的内容,复制到myserver1中的~/.ssh/authorized_keys文件里即可。
也可以使用如下命令一键添加公钥到服务器端:
简易安全配置
查看登录日志文件
1
|
sudo vim /var/log/auth.log
|
不出意外会看到很多类似如下的日志
1
2
3
4
5
|
Failed password for root from 183.146.30.163 port 22537 ssh2
Failed password for invalid user admin from 183.146.30.163 port 22545 ssh2
Invalid user tester from 101.254.217.219 port 56540
pam_unix(sshd:auth): check pass; user unknown
pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=103.61.8.34
|
然后可以统计有多少人在暴力破解root密码错误登录,展示错误次数和ip
1
|
sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
|
统计有多少暴力猜用户名的
1
|
sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more
|
禁止SSH的root用户登录
修改 /etc/ssh/sshd_config文件
首先创建一下文件的备份
1
|
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
|
禁止以root用户身份通过 SSH 登录
设置SSH单次登录限制
1
2
3
|
LogLevel INFO #将LogLevel设置为INFO,记录登录和注销活动
MaxAuthTries 3 #限制单次登录会话的最大身份验证尝试次数
LoginGraceTime 20 #缩短单次的登录宽限期,即ssh登录必须完成身份验证的时间 单位是秒
|
重启ssh服务 sudo service ssh restart
禁用密码登陆,使用RSA私钥登录
1
2
|
ssh-keygen #在客户端生成密钥
ssh-copy-id myserver1 #将公钥添加至服务端
|
还需要配置服务端
我们向/etc/ssh/sshd_config写入以下内容:
1
2
|
PasswordAuthentication no #禁止密码认证
PermitEmptyPasswords no #禁止空密码用户登录
|
重启ssh服务 sudo service ssh restart
docker配置和语法教程
安装tmux和docker
登录自己的服务器,然后安装tmux:
1
2
|
sudo apt-get update
sudo apt-get install tmux
|
将本地配置通过scp传到新服务器上:
1
|
scp .vimrc .tmux.conf .bashrc server_name: # server_name需要换成自己配置的别名(!!!注意目的地址后面要有冒号:)
|
打开tmux。(养成好习惯,所有工作都在tmux里进行,防止意外关闭终端后,工作进度丢失)
tmux操作小tips:按住shift就可以选择文本,然后Ctrl-insert进行复制,Shift-insert进行粘贴
然后在tmux中根据docker安装教程安装docker即可。
将当前用户添加到docker用户组
为了避免每次使用docker命令都需要加上sudo权限,可以将当前用户加入安装中自动创建的docker用户组(可以参考[官方文档](Post-installation steps | Docker Docs)):
1
|
sudo usermod -aG docker $USER # 这里USER不用改成lx,因为$USER会自动修改成当前的用户名
|
执行完此操作后,需要退出服务器,再重新登录回来,才可以省去sudo权限。
镜像(images)
docker pull ubuntu:20.04:拉取一个镜像
docker images:列出本地所有镜像
docker image rm ubuntu:20.04 或 docker rmi ubuntu:20.04:删除镜像ubuntu:20.04
docker [container] commit CONTAINER IMAGE_NAME:TAG:创建某个container的镜像
docker save -o ubuntu_20_04.tar ubuntu:20.04:将镜像ubuntu:20.04导出到本地文件ubuntu_20_04.tar中
docker load -i ubuntu_20_04.tar:将镜像ubuntu:20.04从本地文件ubuntu_20_04.tar中加载出来
容器(container)
docker [container] create -it ubuntu:20.04:利用镜像ubuntu:20.04创建一个容器
docker ps -a:查看本地的所有容器
docker [container] start CONTAINER:启动容器
docker [container] stop CONTAINER:停止容器
docker [container] restart CONTAINER:重启容器
docker [contaienr] run -itd ubuntu:20.04:创建并启动一个容器
docker [container] attach CONTAINER:进入容器
docker [container] exec CONTAINER COMMAND:在容器中执行命令
docker [container] rm CONTAINER:删除容器
docker container prune:删除所有已停止的容器
docker export -o xxx.tar CONTAINER:将容器CONTAINER导出到本地文件xxx.tar中
docker import xxx.tar image_name:tag:将本地文件xxx.tar导入成镜像,并将镜像命名为image_name:tag
docker export/import与docker save/load的区别:
- export/import会丢弃历史记录和元数据信息,仅保存容器当时的快照状态
- save/load会保存完整记录,体积更大
docker top CONTAINER:查看某个容器内的所有进程
docker stats:查看所有容器的统计信息,包括CPU、内存、存储、网络等信息
docker cp xxx CONTAINER:xxx 或 docker cp CONTAINER:xxx xxx:在本地和容器间复制文件
docker rename CONTAINER1 CONTAINER2:重命名容器
docker update CONTAINER --memory 500MB:修改容器限制
实战
进入Terminal,然后:
1
2
3
4
5
6
7
8
|
scp /var/lib/acwing/docker/images/docker_lesson_1_0.tar server_name: # 将镜像上传到自己租的云端服务器
ssh server_name # 登录自己的云端服务器
docker load -i docker_lesson_1_0.tar # 将镜像加载到本地
docker run -p 20000:22 --name my_docker_server -itd docker_lesson:1.0 # 创建并运行镜像,将docker内的22(ssh)端口映射到外部的20000端口,docker_lesson:1.0是REPOSITORY:TAG
docker attach my_docker_server # 进入创建的docker容器
passwd # 设置root密码
|
去云平台控制台中修改安全组配置,放行端口20000。
返回Terminal,即可通过ssh登录自己的docker容器:
1
|
ssh root@xxx.xxx.xxx.xxx -p 20000 # 将xxx.xxx.xxx.xxx替换成自己租的服务器的IP地址
|
然后,可以仿照上面的创建工作用户并赋予权限,创建工作账户lx。
最后,可以参考上面的配置别名和免密登录方式配置docker容器的别名和免密登录。
SpringBoot项目部署上云
安装、配置mysql
安装:
1
|
sudo apt-get install mysql-server
|
启动:
1
|
sudo service mysql start
|
登录mysql:
设置root用户的密码:
1
|
ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd'; #yourpasswd需要改成你的密码
|
之后就得输入密码登录了:
安装Java 17
1
|
sudo apt install openjdk-17-jdk
|
打包后端
pom.xml中添加配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.backend.BackendApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
|
然后点击Maven中的clean和build,将代码打包成jar包,通过scp传输到服务器,再在服务器端使用命令行进行运行:
打包前端
前端所有的原来的url: "http://127.0.0.1:3000/api/xxxx",都得换成你的实际ip:http://47.116.187.43/api/xxxxx
然后直接在vue界面里build界面点运行,就会生成一个dist文件夹,将文件夹里面内容发送到服务器即可
另:这里可以让vue3将项目打包成只有一个js文件和一个css文件
往项目目录下的vue.config.js写入下面内容:
1
2
3
4
5
6
7
8
9
10
|
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
transpileDependencies: true,
configureWebpack: {
// No need for splitting
optimization: {
splitChunks: false
}
}
})
|
配置Nginx
!!!避雷:y总的那个docker镜像有毒,里面搭好的nginx有问题,需要卸载重新安装就好了,我三天一直在找这个问题,一直报错502,结果偶然看到acwing里一个交流贴提一嘴这个nginx有问题,总算大功告成
修改/etc/nginx/nginx.conf内容
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
|
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 1024;
}
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# 将 server 配置放在 http 块内
server {
listen 80;
server_name 47.116.187.43; # 需要修改成你的服务器ip地址
charset utf-8;
access_log /var/log/nginx/access.1og;
error_log /var/log/nginx/error.1og;
client_max_body_size 10M;
# 前端 Vue 项目的配置
location / {
root /home/lx/kob/web; # 指向你的前端文件根目录
index index.html;
try_files $uri $uri/ /index.html; # 处理 Vue 路由
}
location /api {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /websocket {
proxy_pass http://127.0.0.1:3000; # 后端端口号
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 36000s;
}
}
}
|
启动nginx:sudo /etc/init.d/nginx start
查看错误信息:sudo cat /var/log/nginx/error.log
更新nginx:sudo /etc/init.d/nginx reload
获取域名及Https证书
分别配置/etc/nginx/cert/acapp.key和/etc/nginx/cert/acapp.pem
第三方授权登录