web后端搭建记录
目录
- web后端搭建记录
- 禁止部分用户使用ssh连接
- 宿主机管理
- 部署并使用docker
- 容器创建后需要修改启动命令
- 创建镜像,再重新创建容器
- 向容器安装ssh
- 配置nginx转发
- 向web目录添加静态文件
- 向web目录增加js、css等脚本
- 增加后端应用输出基本打印
- 创建mysql数据库容器,与后端应用连接
- 本机容器应用与容器数据库连接
- 数据库容器连通测试
- 创建kafka并实现应用间消息交互
- 创建redis作为应用请求数据缓存
- 安装golang环境
- go包调用
- 参考链接
禁止部分用户使用ssh连接
- 避免别人使用非法工具连接上默认账号,如admin等
- 允许或禁止指定用户进行ssh连接:/etc/ssh/sshd_confing配置文件,对DenyUsers, AllowUsers, DenyGroups, AllowGroups关键字进行配置,例如AllowUsers root user1 user2 #表示服务器只允许root user1 user2登录
宿主机管理
- 使用free命令检查swap空间是否开启,没有开的话需要手动开启,避免宿主机内存不够,导致docker中无法运行mysql之类耗内存的程序
部署并使用docker
- 机器环境:阿里云轻量应用服务器,预装docker19.03应用镜像
- 下载镜像、创建容器教程:
- docker创建时会自定义一个ip,与宿主机同网段,需要在/etc/docker/daemon.json中设置ip,如192.168.0.1/24
- 记得重启容器
- 使用服务器ip+docker映射到宿主机的端口可访问容器中的应用
- 进入容器内目录:
docker container exec -it 容器id /bin/bash
,退出容器目录:exit
容器创建后需要修改启动命令
- 容器创建后若要修改启动命令,进入/var/lib/docker/containers/容器id,修改config.v2.json,测试后发现无效,stop或start容器后会重置该文件
创建镜像,再重新创建容器
- 先停止现有容器
docker stop container-name
- 将容器commit成为一个镜像
docker commit container-name new-image-name
- 用新镜像运行容器
docker run -it -d --name container-name -m 500M --security-opt=seccomp:unconfined -p p1:p1 -p p2:p2 new-image-name
-
--security-opt=seccomp:unconfined
Seccomp 安全配置文件 -
-m 500M
申请500M内存
- 新容器别忘了连接到需要的本地docker网络,没有使用docker网络时可以忽略
向容器安装ssh
- 安装方式和普通操作环境一样
- 使用service命令启动ssh
- 设置随容器启动:
- 创建一个启动命令脚本
#!/bin/bash
LOGTIME=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$LOGTIME] startup run..." >> /root/start_ssh.log
service ssh start >> /root/start_ssh.log
- 在用户启动文件中添加调用之前写的脚本
vim /root/.bashrc
# startup run
if [ -f /root/start_ssh.sh ]; then
/root/start_ssh.sh
fi
- 别忘了放开云服务器防火墙的自定义ssh端口
- 必须使用白名单,只允许已知的活动账号连接,避免被黑客利用来挖矿
配置nginx转发
- nginx主配位文件可以通过
nginx -t
测试命令查看 - nginx默认配置文件在/etc/nginx/conf.d/目录下,可进入docker目录后修改
- 在主配置文件中使用include参数可以引入子配置文件,可以讲不同的服务器/监听端口内容放在单独文件中配置
- 只有在对应的server{}中配置,转发路由才会生效
向web目录添加静态文件
- 思考web应用部署方式:1.在本地docker中添加后端应用的运行环境,然后使用docker commit创建新镜像,把新镜像拷贝到服务器中并创建运行新容器
向web目录增加js、css等脚本
- 在nginx配置文件中添加对js、css等静态文件的请求root路径
- 要注意的是配置项中root /usr/share/nginx/static表示该路径为根目录,无法访问再上层的,所以可以再static目录中增加js、css等文件夹存放文件,并在html标签的src属性填写诸如
/xxxx.js
或/js/xxx.js
的文件路径
增加后端应用输出基本打印
- 记录一些运行日志
创建mysql数据库容器,与后端应用连接
- 查找docker镜像
docker search mysql
- 拉去mysql镜像到本地
docker pull mysql
- 在宿主机创建文件夹,用于映射到容器内的文件夹,确保数据存储在宿主机(持久化)
-
mkdir -p /root/mysql/data /root/mysql/logs /root/mysql/conf
,-p
可创建路径中不存在的文件夹
- 在宿主机创建一个配置文件
touch /root/mysql/conf/my.conf
- 创建容器并启动
docker run -p 3306:3306 --name mysql -v /root/mysql/conf:/etc/mysql/conf.d -v /root/mysql/logs:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.30
-
-d
后台运行容器,也可以使用镜像id -
-p
将容器的端口映射到本机的端口 -
-v
将主机目录挂载到容器的目录 -
-e
设置参数 MYSQL_ROOT_PASSWORD 指定登录密码
- 启动容器后查看宿主机mysql/data文件夹是否已映射
- 当宿主机内存有限时可以限制数据库的表加载数量和性能统计
- 修改
/etc/mysql/conf.d/
路径下的配制文件,内容如下(例子),改完要重启容器或mysqld
[mysqld]
performance_schema_max_table_instances=400
table_definition_cache=400
table_open_cache=256
performance_schema = off
本机容器应用与容器数据库连接
- 方式1:通过docker的-link连接(不推荐)
- 方式2:通过宿主机ip:port连接
- 方式3:通过docker创建容器网络(网桥等)连接(推荐)
-
docker network create -d bridge [网络名]
创建网络,-d
表示网络类型 -
docker network ls
查看当前容器网络 docker network connect 网络名 容器名
数据库容器连通测试
- 首先在app容器使用ping命令请求数据库容器,
- 如果ping通,可以尝试使用ip或域名(容器名)连接数据库
//func 函数名(入参) (返回值) {函数体}
func InitDB() (err error) {
//mysql, 用户名:密码@tcp(ip或容器名:端口)/数据库名字
dsn := "root:abcd1234@tcp(my_sql:3306)/user_info_db"
//connect
db, err = sql.Open("mysql", dsn)
if nil != err {
fmt.Printf("db open failed, dsn:%s, err:%v\n", dsn, err )
return err
}
err = db.Ping()
if nil != err {
fmt.Printf("db ping failed\n")
return err
} else {
fmt.Printf("db ping success\n")
}
//设置数据库连接池最大连接数
db.SetMaxIdleConns(10)
return err
}
创建kafka并实现应用间消息交互
- 未完待续
创建redis作为应用请求数据缓存
- 未完待续
安装golang环境
- 安装
sudo apt-get install golang
- 给go配置工作区,并添加到环境变量,作为go开发代码、保存二进制文件的目录
mkdir ~/workspace
echo 'export GOPATH="$HOME/workspace"' >> ~/.bashrc
source ~/.bashrc //执行一次该脚本
- 写个helloworld测试下
- go的常见目录结构包含主要三个子文件夹:src、bin、pkg
- 在工作区中新建一个文件夹hello作为项目路径,将源码文件放在其中
- 两种执行go文件的方式:
1.go run
命令直接运行.go源码文件
2.在任意路径下运行go install hello
或在项目路径下运行go install
,编译程序会自动在GOROOT和GOPATH环境变量指定的路径下寻找src文件夹,在项目路径中自动找main包的main函数作为入口函数,在bin下会生成结果文件
go包调用
- 一个目录下的go文件只能有main和一个包名,其中main可以没有
- 执行没有main包的go文件会报错
- main包不能被其他包引用
- init函数会先于main函数自动执行
- 一个包下每个go文件都可拥有init函数(注意是小写),并且一个文件可以有多个同名init函数
- init函数不可被调用