Haohao Notes

DREAM OF TECHNICAL ACHIEVEMENT

0%

Linux

Linux 目录结构图

目录简介

目录 介绍
/ 根目录,位于Linux文件系统目录结构的顶层,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中。
/bin,/usr/bin 该目录为命令文件目录,也称为二进制目录。包含了供系统管理员及普通用户使用的重要的linux命令和二进制(可执行)文件,包含shell解释器等。
/boot 该目录中存放系统的内核文件和引导装载程序文件,/boot/vmlinuz为linux的内核文件,以及/boot/gurb。建议单独分区,分区大小100M即可。
/dev 设备(device)文件目录,存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,存放连接到计算机上的设备(终端、磁盘驱动器、光驱及网卡等)的对应文件,包括字符设备和块设备等,常用的是挂载光驱mount /dev/cdrom/mnt。
/etc 系统配置文件存放的目录,该目录存放系统的大部分配置文件和子目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11(X Window系统有关)、/etc/sysconfig(与网络有关)、/etc/xinetd.d修改配置文件之前记得备份。该目录下的文件由系统管理员来使用,普通用户对大部分文件有只读权限。
/home 系统默认的用户宿主目录,新增用户账号时,用户的宿主目录都存放在此目录下,~表示当前用户的宿主目录,~test表示用户test的宿主目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据。
/lib,/usr/lib,/usr/local/lib 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,该目录下存放了各种编程语言库。典型的linux系统包含了C、C++和FORTRAN语言的库文件。/lib目录下的库映像文件可以用来启动系统并执行一些命令,目录/lib/modules包含了可加载的内核模块,/lib目录存放了所有重要的库文件,其他的库文件则大部分存放在/usr/lib目录下。
/lost+fount 在EXT2或EXT3文件系统中,当系统意外崩溃或机器意外关机,产生的一些文件碎片放在这里。在系统启动的过程中fsck工具会检查这里,并修复已经损坏的文件系统。有时系统发生问题,有很多的文件被移到这个目录中,可能会用手工的方法来修复,或者移动文件到运来的位置上
/mnt,/media mnt目录主要用来临时挂载文件系统,为某些设备提供默认挂载点,如floppy,cdrom。这样当挂载了一个设备如光驱时,就可以通过访问目录/mnt/cdrom下的文件来访问相应的光驱上的文件了。
/opt 给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下。
/proc 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等。
/root 系统管理员root的宿主目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。
/sbin,/usr/sbin,/usr/local/sbin 放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能”查看”而不能设置和使用。
/tmp 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/srv 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内。
/usr 应用程序存放目录,/usr/bin 存放应用程序, /usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件,/usr/local 存放软件升级包,/usr/share/doc 系统说明文件存放目录。
/usr/share/man 程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间。
/var 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log。/var/log/message: 所有的登录文件存放目录。/var/spool/mail: 邮件存放的目录。 /var/run: 程序或服务启动后。建议单独分区,设置较大的磁盘空间。
/tmp 存放临时文件目录,一些命令和应用程序会用的到这个目录。该目录下的所有文件会被定时删除,以避免临时文件占满整个磁盘。

dev目录

目录 描述
/dev目录 dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。
Linux沿袭Unix的风格,将所有设备认成是一个文件。
设备文件分为两种:块设备文件(b)和字符设备文件(c),设备文件一般存放在/dev目录下,对常见设备文件作如下说明:
/dev/hd[a-t] IDE设备
/dev/sd[a-z] SCSI设备
/dev/fd[0-7] 标准软驱
/dev/md[0-31] 软raid设备
/dev/loop[0-7] 本地回环设备
/dev/ram[0-15] 内存
/dev/null 无限数据接收设备,相当于黑洞
/dev/zero 无限零资源
/dev/tty[0-63] 虚拟终端
/dev/ttyS[0-3] 串口
/dev/lp[0-3] 并口
/dev/console 控制台
/dev/fb[0-31] framebuffer
/dev/cdrom /dev/hdc
/dev/modem /dev/ttyS[0-9]
/dev/pilot /dev/ttyS[0-9]
/dev/random 随机数设备
/dev/urandom 随机数设备

etc目录

目录 描述
/etc/rc,/etc/rc.d,/etc/rc*.d 启动、或改变运行级时运行的scripts或scripts的目录。
/etc/passwd 用户数据库,其中的域给出了用户名、真实姓名、家目录、加密的口令和用户的其他信息。
/etc/fstab 启动时mount -a命令(在/etc/rc 或等效的启动文件中)自动mount的文件系统列表。Linux下,也包括用swapon -a启用的swap区的信息。
/etc/group 类似/etc/passwd ,但说明的不是用户而是用户组。
/etc/inittab init的配置文件,设定系统启动时init进程将把系统设置成什么样的runlevel 。
/etc/issue getty 在登录提示符前的输出信息.通常包括系统的一段短说明或欢迎信息内容由系统管理员确定。
/etc/motd Message Of The Day,成功登录后自动输出内容由系统管理员确定,经常用于通告信息,如计划关机时间的警告。
/etc/mtab 当前安装的文件系统列表.由scripts初始化,并由mount 命令自动更新,需要一个当前安装的文件系统的列表时使用,例如df 命令。
/etc/shadow 在安装了影子口令软件的系统上的影子口令文件.影子口令文件将/etc/passwd 文件中的加密口令移动到/etc/shadow 中,而后者只对root可读这使破译口令更困难.
/etc/login.defs login 命令的配置文件。
/etc/printcap 类似/etc/termcap ,但针对打印机语法不同。
/etc/profile , /etc/csh.login , /etc/csh.cshrc 登录或启动时Bourne或C shells执行的文件,这允许系统管理员为所有用户建立全局缺省环境。
/etc/securetty 确认安全终端,即哪个终端允许root登录.一般只列出虚拟控制台,这样就不可能(至少很困难)通过modem或网络闯入系统并得到超级用户特权。
/etc/shells 列出可信任的shell.chsh 命令允许用户在本文件指定范围内改变登录shell.提供一台机器FTP服务的服务进程ftpd 检查用户shell是否列在 /etc/shells 文件中,如果不是将不允许该用户登录.
/etc/sysconfig 网络配置相关目录
/etc/DIR_COLORS 设定颜色
/etc/HOSTNAME 设定用户的节点名
/etc/NETWORKING 只有YES标明网络存在
/etc/host.conf 文件说明用户的系统如何查询节点名
/etc/hosts 设定用户自已的IP与名字的对应表
/etc/hosts.allow 设置允许使用inetd的机器使用
/etc/hosts.deny 设置不允许使用inetd的机器使用
/etc/hosts.equiv 设置远端机不用密码
/etc/inetd.conf 设定系统网络守护进程inetd的配置
/etc/inetd.pid inetd这个进程的进程id
/etc/hosts.lpd 设定远端有哪些节点可以使用本机的打印机
/etc/gateways 设定路由器
/etc/protocols 设定系统支持的协议
/etc/named.boot 设定本机为名字服务器的配置文件
/etc/named.pid 本机上运行的名字服务器的进程id
/etc/networks 设定网络的配置文件
/etc/resolv.conf 设定系统的名字服务器
/etc/services 设定系统的端品与协议类型和提供的服务
/etc/exports 设定NFS系统用的
/etc/NNTP_INEWS_DOMAIN 设置新闻服务器的配置文件
/etc/nntpserver 设置用户使用的新闻服务器的地址
/etc/XF86Config X Window的配置文件
/etc/hostid 系统独有的一个硬件id
/etc/at.deny 设置哪些用户不能使用at命令
/etc/bootptab 给MAKEDEV程序设定各种不同的设备驱动文件的格式
/etc/makedev.cfg 同DEVINFO一样给MAKEDEV使用的设置文件
/etc/diphosts 设置拔号服务器的用户名和口令
/etc/slip.hosts,/etc/slip.login 设定SLIP的配置文件
/etc/fastboot 使用shutdown -f产生的,重启系统要查这个文件
/etc/fstab 记录开机要mount的文件系统
/etc/ftpaccess FTP服务器的一些配置
/etc/ftpconversions 设定在FTP时使用的过滤器的位置
/etc/ftpusers 设定不能使用FTP服务的用户
/etc/ld.so.cache 查找系统动态链接库的缓存
/etc/ld.so.conf 系统动态链接库的路径
/etc/lilo.conf lilo的配置文件
/etc/magic 给file命令使用的
/etc/aliases 给sendmail使用的设置别名的文件
/etc/mail.rc,/etc/mailcap,/etc/sendmail.cf,/etc/sendmail.st 设置sendmail的
/etc/motd 超级用户发布通知的地方
/etc/organization 存放用户的名字和组织
/etc/pnpdevices 列出支持的Plug&Play设备
/etc/snooptad 监控用户的屏幕,监听的终端列表
/etc/sudoers 可以sudo命令的配置文件
/etc/syslog.conf 系统记录程序syslogd的配置文件
/etc/utmp 目前在用系统的用户信息
/etc/wtmp 同utmp差不多,只是它累加
/etc/nologin 系统在shutdown时不希望用户登录就产生这个文件
/etc/termcap 设置系统终端信息的
/etc/ttys 设定系统的终端类型
/etc/gettydefs getty_ps的定义文件
/etc/yp.conf NIS的配置文件
/etc/mtools.conf 设定mtools程序的参数
/etc/fdprm 设定格式化软盘的参数
/etc/login.access 控制用户登录权限的文件

proc目录

目录 描述
/proc/cmdline 加载 kernel 时所下达的相关参数,查阅此文件,可了解系统是如何启动。
/proc/cpuinfo 本机的 CPU 的相关资讯,包含时脉、类型与运算功能等
/proc/devices 这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关。
/proc/filesystems 目前系统已经加载的文件系统。
/proc/interrupts 目前系统上面的 IRQ 分配状态。
/proc/ioports 目前系统上面各个装置所配置的 I/O 位址。
/proc/kcore 这个就是内存的大小,但是不要读他。
/proc/loadavg 还记得 top 以及 uptime 吧?没错,上头的三个平均数值就是记录在此。
/proc/meminfo 使用 free 列出的内存资讯,在这里也能够查阅到。
/proc/modules 目前我们的 Linux 已经加载的模块列表,也可以想成是驱动程序。
/proc/mounts 系统已经挂载的数据,就是用 mount 这个命令呼叫出来的数据。
/proc/swaps 到底系统挂加载的内存在哪里?使用掉的 partition 就记录在此啦。
/proc/partitions 使用 fdisk -l 会出现目前所有的 partition 吧?在这个文件当中也有纪录。
/proc/pci 在 PCI 汇流排上面,每个装置的详细情况,可用 lspci 来查阅。
/proc/uptime 就是用 uptime 的时候,会出现的资讯。
/proc/version 核心的版本,就是用 uname -a 显示的内容。
/proc/bus/* 一些汇流排的装置,还有 U盘 的装置也记录在此。
阅读全文 »

Kong

Kong可以说是API的得力助手。对需要从事API管理的广大开发员来说,它是最出色的工具之一。Kong是开源工具,具有可扩展性和模块性,可以在任何一种基础设施上运行。多年来,Kong一直在支持优秀的开发项目,比如Mashape(世界上规模最大的API市场)。最棒的是,Kong得到了强大的Nginx的支持。

主要功能

  • Kong可灵活扩展:只要增添更多的服务器实例,它就能横向扩展,毫无问题,那样你可以支持更多流量,同时确保网络延迟很短。

  • Kong可在任何地方运行:它可以部署在单个或多个数据中心环境的私有云或公有云上。它还支持大多数流行的操作系统,比如Linux、Mac和Windows。Kong包括许多实用技巧,以便针对大多数现代平台完成安装和配置工作。

  • Kong具有模块性:它可以与新的插件协同运行,扩展基本功能。可将你的API与许多不同的插件整合起来,以增强安全、分析、验证、日志及/或监测机制。最好的例子之一就是Nginx Plus插件(https://getkong.org/plugins/nginx-plus-monitoring/),该插件提供了服务器实时监测机制,以获得关于负载和请求的度量指标和统计数字。

  • 开源及企业:虽然Kong是开源工具,可供每个人免费使用,但你也能获得企业版,企业版通过电子邮件、电话和聊天提供了快速支持,此外还提供初始安装、从第三方API管理工具来迁移、紧急补丁、热修复程序及更多特性。
    Kong Api管理解决方案

工作原理

Kong可与两种不同的组件协同工作:

  • Nginx:Kong使用经过修改的Nginx web服务器作为代理服务器,该服务器负责处理API请求。
  • Apache Cassandra 或者 Postgresql:这用作数据存储(Datastore)服务器,负载存储来自Kong操作的数据。

Kong安装

参考Kong CentOS Installation

从下载Kong的配置

1
yum install https://bintray.com/kong/kong-community-edition-rpm/download_file?file_path=centos/7/kong-community-edition-0.14.0.el7.noarch.rpm

阅读全文 »

最近公司业务要构建一个高性能API网关,所以就整理了市场上的一些产品。

API网关简介

API网关 顾名思义,是出现在系统边界上的一个面向API的、串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,API网关的实体就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。移动应用、企业互联,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件。

API网关网关的价值:

  • 网关层对外部和内部进行了隔离,保障了后台服务的安全性。
  • 对外访问控制由网络层面转换成了运维层面,减少变更的流程和错误成本
  • 减少客户端与服务的耦合,服务可以独立发展。通过网关层来做映射。
  • 通过网关层聚合,减少外部访问的频次,提升访问效率。
  • 节约后端服务开发成本,减少上线风险。
  • 为服务熔断,灰度发布,线上测试提供简单方案。
  • 便于扩展。

API Gateway

常用的API网关方案

业界API网关解决方案有很多,包括商业的、开源的。例如

三种常见API网关方案

阅读全文 »

centos

今天在Docker中centos7镜像使用yum提示:Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfi
我使用ping www.huixing.org 发现网络是正常的。

遇到这种情况有两种做法:

查看网络是否畅通

ping www.huixing.org

如果显示没有连接的话,就说明没网,也就无法使用yum 命令。

网络畅通还是无法使用yum

在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度。国内比较快的有163源、sohu源、阿里云源,这里使用阿里云为例子。

作为运维人员任何修改文件最好都要备份

备份操作:
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

阅读全文 »

php

在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改。如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调用的文件,行数,参数等),这样就能很方便的定位到出问题的地方。

php的debug_backtrace方法可以对代码调用进行跟踪,方便调试代码。

1
2
3
4
5
6
7
8
9
10
$traces = debug_backtrace();
//Remove other keys other than file/function/line
for($i=0; $i<count($traces); $i++) {
$all_keys = array_keys($traces[$i]);
foreach($all_keys as $key){
if($key != "file" && $key != "line" && $key != "function")
unset($traces[$i][$key]);
}
}
file_put_contents("/tmp/call_trace.log", "\n\n##################\n" . print_r($traces, true), FILE_APPEND);

代码实例:

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
<?php 
class SchoolController{
public function schoolSay() {
$traces = debug_backtrace();

for($i=0; $i<count($traces); $i++) {
$all_keys = array_keys($traces[$i]);
foreach($all_keys as $key){
if($key != "file" && $key != "line" && $key != "function")
unset($traces[$i][$key]);
}
}
print_r($traces);
}
}

class ClassController{
function classSay(){
$a = new SchoolController();
$a->schoolSay();
}
}

class StudentController{
public function __construct(){
$b = new ClassController();
$b->classSay();
}
}

$stu = new StudentController();

调试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Array
(
[0] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 20
[function] => schoolSay
)

[1] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 27
[function] => classSay
)

[2] => Array
(
[file] => \u01\www\huixing.org\test.php
[line] => 31
[function] => __construct
)

)

Linux

Linux系统中的 find 命令在查找文件时非常有用而且方便。它可以根据不同的条件来查找文件,例如权限、拥有者、修改日期/时间、文件大小等等。在这篇文章中,我们将学习如何使用 find 命令以及它所提供的选项来查找文件。

在绝大多数Linux发行版中,你都可以直接使用 find 命令而无需进行任何安装操作。如果你想在linux系统的命令行中变得特别高效,那么 find 是你必须掌握的命令之一。

find 命令的基本语法如下:

$ find [path] [option] [expression]

基本用法

列出当前目录和子目录下的所有文件

这个命令会列出当前目录以及子目录下的所有文件。

1
2
3
4
5
6
$ find
.
./abc.txt
./subdir
./subdir/how.php
./cool.php

该命令与以下命令效果相同

1
2
$ find .
$ find . -print

查找特殊的目录或路径

阅读全文 »

RESETful API

关于「能愿动词」的使用

为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下:

  • 必须 (MUST):绝对,严格遵循,请照做,无条件遵守;
  • 一定不可 (MUST NOT):禁令,严令禁止;
  • 应该 (SHOULD) :强烈建议这样做,但是不强求;
  • 不该 (SHOULD NOT):强烈不建议这样做,但是不强求;
  • 可以 (MAY)可选 (OPTIONAL) :选择性高一点,在这个文档内,此词语使用较少;

参见:RFC 2119

Protocol

客户端在通过 API 与后端服务通信的过程中,应该 使用 HTTPS 协议。

API Root URL

API 的根入口点应尽可能保持足够简单,这里有两个常见的 URL 根例子:

  • api.example.com/*
  • example.com/api/*
阅读全文 »

docker
前面几篇文章介绍了Docker如何构建一个镜像以及如何运行一个容器,其实这个是在大家有Docker基础的前提下进行的,对于没有基础的同学,本文简单介绍一下Dockerfile中各个命令的用法是怎样的。

1. FROM

格式:FROM <image>或者FROM <image>:<tag>
第一条指令必须是FROM,而且,在同一个Dockerfile中创建多个镜像的时候,可以使用多个FROM指令(每个指令一次)。

2. MAINTAINER

格式:MAINTAINER <name>
指定维护者是谁。

3. RUN

格式:RUN <command>或者RUN ["executable", "param1", "param2"]
前者将在shell终端中运行,即/bin/sh -c。后者使用exec执行。指定使用其它终端执行可以用后一种方式实现。比如RUN ["/bin/bash", "-c", "echo hello"]
每一条RUN指令执行的时候都会在当前镜像的基础上创建新的镜像,如果你的命令实在是非常长的话可以使用\来分隔。

4. CMD

支持三种格式:

  • CMD ["executable", "param1", "param2"]使用exec执行,推荐方式。
  • CMD command param1 param2/bin/sh中执行,提供给需要交互的应用。
  • CMD ["param1", "param2"]提供给ENTRYPOINT的默认参数。
阅读全文 »