Nginx 功能说明与配置说明.
理论基础
Nginx服务安装启动
- 官网下载Nginx直接解压
wget http://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.20.2.tar.gz
cd nginx
./configure --prefix=/usr/local/nginx
- make
- make install
安装软件安全考虑尽量不安装在root用户下。比如数据库mysql建立mysql用户,oracle建立oracle账号,MongoDB建立MongoDB账号,数据比较重要所以都独立一个账号,对于不存储数据的中间件可以在需要用的普通站号里面安装,还可能存在不同程序需要不同版本的中间件。
docker比较特别,默认不能使用非root用户,可以给普通用户加入到docker组。在普通用户下安装的话得有sudo权限,docker的目录得这样分配root:docker权限。
非root用户安装软件一般都是采用源码安装。
bash 在每次启动时都会加载 .bashrc
文件的内容。每个用户的 home 目录都有这个 shell 脚本。它用来存储并加载你的终端配置和环境变量。也就是可以设置命令别名,配置命令的环境变量路径。
使修改生效:source ~/.bashrc
类似于一个管理员的组,还可以进一步控制,只允许wheel组的用户su到root
1 | # 相关配置 |
Linux 命名空间为运行中的进程提供了隔离,限制他们对系统资源的访问,而进程没有意识到这些限制。
防止容器内的特权升级攻击的最佳方法是将容器的应用程序配置为作为非特权用户运行。对于其进程必须作为容器中的 root 用户运行的容器,可以将此用户重新映射到 Docker 主机上权限较低的用户。映射的用户被分配了一系列 UID,这些 UID 在命名空间内作为从 0 到 65536 的普通 UID 运行,但在主机上没有特权。
docker:100300:65536
这意味着 docker将从 100300开始,在后面的 65536 个整数中按顺序为用户分配一个 ID。例如,命名空间中的 UID 100300映射到容器中的 UID 0(root),UID 100301映射为 UID 1,依此类推。如果某个进程尝试提升特权到命名空间外部,则该进程将作为主机上无特权的高数字 UID 运行,该 UID 甚至不映射到真实用户。这意味着该进程完全没有主机系统的权限。
Docker 19.03中发布了一个重要的特性 “Rootless Container”,支持非root用户,稳定性待验证。
1 | # 1.创建用户 |
卸载:
1 | sudo yum remove docker-ce docker-ce-cli containerd.io |
比如用RPM包安装的MySQL,启用的时候也是会用MySQL用户的。其他信息参考MySQL章节
在MySQL启动的时候,单进程mysqld,该进程的就是mysql用户启动的。
这样就保证了mysql服务的独立性,即使mysql服务被黑掉,得到了mysql用户权限,也不会影响整个系统的安全。
mysqld_safe与mysqld区别,直接运行mysqld程序来启动MySQL服务的方法很少见,mysqld_safe脚本会在启动MySQL服务器后继续监控其运行情况,并在其死机时重新启动它。所以mysqld的pid是mysqld_safe。mysqld_safe相当于多了一个守护进程。
用mysqld_safe脚本来启动MySQL服务器的做法在BSD风格的unix系统上很常见,非BSD风格的UNIX系统中的 mysql.server脚本其实也是调用mysqld_safe脚本去启动MySQL服务器的。
1 | [root@test lib]# ps -ef|grep mysql |
大概有10几万行代码量,官方提供非常全的软件使用教程。
学习步骤:
docker 安装简单执行:
1 | mkdir -p ~/.mytb-data && sudo chown -R 799:799 ~/.mytb-data |
访问:http://localhost:8080
进行登录tenant@thingsboard.org
/tenant
sysadmin@thingsboard.org
/sysadmin
1 | curl -v -X POST -d "{\"temperature\": 10}" http://192.168.33.123:8080/api/v1/ABC123/telemetry --header "Content-Type:application/json" |
1 | docker run \ |
1 | docker run -d -p9042:9042 --name cassandra --restart always cassandra |
主要步骤:
...Executor.submit(()...
,或者根据某个事件比如@EventListener(ApplicationReadyEvent.class)
等需要重点关注,而且还可能再创建子线程来执行。一些调试技巧:
对于没有非常详细代码架构流程说明文档的代码,只能通过调试推算出各个模块功能与流程。当然对于简单的系统都是类似的你学会一个基本可以推算出所有类似系统。也就是学习一遍就可以打遍天下。
重点关注:
线程、进程启动入口、数据库入口、请求入口。还可以关注算法、设计模式等
介绍Linux 调试内核,调试应用程序
man gdb
查看命令帮助信息,q退出r
运行调试n
下一步c
继续运行ctrl+c
中断后续运行s
进入一个函数finish
退出函数l
列出代码行 比如 l main l xxx.go:1b
断点info b
显示断点列表delete number
删除断点clear
清除断点until 2
跳转至行号p
打印 p/x 按十六进制显示变量bt/backtrace <-n>
显示所有栈帧,栈 -n 表一个负整数,表示只打印栈底下n层的栈信息bt full
显示栈帧以及局部变量info frame <栈帧编号>
查看帧详细信息f/frame <number>
进入指定堆栈层thread apply all bt
显示线程所以堆栈attach <-p pid>
绑定进程调试detach
取消绑定调试disassemble <func>
查看二进制数据x
查看内存focus
显示源码界面display *entry
显示变量display <num>
取消显示info registers
查看寄存器gdb -p xxx
调试根据进程号ctrl + c
中断程序ptype xxx
查看对象类型disable <断点编号>
当前断点设置为无效enable <断点编号>
当前断点设置为有效x $pc
显示程序指针指向位置的内容x/i $pc
显示程序当前位置的汇编指令x/10i $pc
显示程序当前位置开始往后的10条汇编指令disassem $pc
反汇编当前函数。简写为:disas $pc
gcore
生产dump文件关系型数据库。
结构化数据,也是最常用的数据库。比如用户账号、权限
key-value型,根据key查询速度快
NoSQL适合存储非结构化数据,如网络文章、评论
key-value型,根据key查询速度快
内存数据库,也可以存储到磁盘。
适用于热点数据缓存以及共享,比如token权限信息、系统字典信息等。
非关系型数据库
ELK
使用倒排索引,每个字段都被索引且可用于搜索,在海量数据下近实时实现近秒级的响应,基于Lucene的开源搜索引擎,为搜索引擎(全文检索,高亮,搜索推荐等)提供了检索的能力。
适用于日志等的数据分析,关键词查询。
GitHub(开源代码管理),搜索上千亿行代码
电商网站,检索商品
ES可以作为检索层与MYSQL作为基础存储层进行组合使用。
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)文本定向消息协议,它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。STOMP在WebSocket之上提供了一个基于帧的线路格式层,用来定义消息的语义。STOMP帧由命令、一个或多个头信息以及负载所组成。对于stomp协议来说, client分为消费者client与生产者client两种. server是指broker, 也就是消息队列的管理者。
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
持久化非持久化
订阅发布模式,给每个客户端单独分配一个队列,数据通过交换机分发到对应队列。
如果你碰巧使用的是 RabbitMQ 或者 kafka ,而且同样也是在使用 Spring Cloud ,那可以考虑下用 Spring Cloud Stream
默认端口:5672
控制台页面:http://xxx.xxx.xxx.xxx:15672/
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
docker run -d -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
后台运行
客户端必须得到用户的授权(authorization grant),才能获得令牌(access token)。OAuth 2.0定义了四种授权方式: