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:unconfinedSeccomp 安全配置文件
  • -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函数不可被调用