史上最全Linux服务器程序规范

作者:且飙丶且珍惜 来源: http://blog.csdn.net/dextrad_ihacker/article/details/51930998
除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上都是模板式的 。———引
  • linux服务器程序一般以后台形式运行 。后台程序又称守护进程 。它没有控制终端,因而也不会意外接受用户输入 。守护进程的父进程一般是init进程(pid=1) 。
  • Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器 。大部分后台进程都在/var/log下有自己的日志目录 。
  • Linux服务器程序一般以某个专门的非root身份运行 。MySQLd, httpd, syslogd等后台进程,并分别有自己的运行账户mysql, Apache, syslog 。‘
  • Linux服务器通常时可配置的 。服务器程序通常处理很多命令选项,如果一次运行的选项太多,则克拉一用配置文件来管理 。绝大多数服务器程序都有配置文件并存放在/etc下
  • Linux服务器程序通常在启动时生成一个PID文件并存入/var/run目录中,以记录该后台进程的PID 。
  • Linux服务器程序通常需要考虑系统资源和限制,以预测自身能承受多大负荷,比如进程可用文件描述符总数和内存总量等 。
01
日志
1.Linux系统日志:
  • Linux提供一个守护进程来处理系统日志–syslogd, 升级版–rsyslogd 。
  • rsyslogd守护进程可以接收用户进程输出日志,可以接受内核日志 。
  • 用户进程时通过调用syslog函数生成系统日志的 。
  • 该函数将日志输出到一个unix本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以获取用户进程的输出 。
  • 内核日志在以前的系统上时通过另一个守护进程rklogd来管理的,rsyslogd利用额外的模块实现了相同的功能 。内核日志由printk等换树打印至内核环状缓存中 。环状缓存的内容直接映射到/proc/kmsg 。
  • rsyslogd通过读取该文件获得内核日志,默认调试信息保存在/var/log/debug,普通信息保存至/var/log/messages,内核信息:/var/log/kern.log 。配置文件:/etc/rsyslog.conf,主要设置内核日志输入路径,是否接受UDP日志,及其监听端口(默认514 /etc/services)是否接受TCP日志及其监听端口,日志文件权限,包含哪些配置文件 。

史上最全Linux服务器程序规范

文章插图
 
2.syslog()
应用程序使用syslog()与守护进程rsyslogd通信 。
史上最全Linux服务器程序规范

文章插图
 
该函数采用可变参数(第二个参数message和第三个参数 。。。)来结构化输出 。
priority:设施值 (按位异或) 日志级别 。设施值默认:LOG_USER,下面针对默认设施值,讨论日志级别 。
史上最全Linux服务器程序规范

文章插图
 
2.1下面这个函数可以改变syslog的默认输出方式,进一步结构化日志内容
史上最全Linux服务器程序规范

文章插图
 
(1)ident:指定字符串将被添加到日志消息的日期和时间之后,通常设为程序的名字 。
(2)logopt:对后续syslog调用的行为进行配置,它可取下列值的按位异或
史上最全Linux服务器程序规范

文章插图
 
(3)facility: 用来修改ysyslog默认设施值
此外,日志过滤也很重要,程序再开发阶段可能需要输出很多调试信息,而发布之后,我们又要将这些调试信息关闭,解决这个问题的方法并不是再程序发布之后,删除调试代码(日后可能还会用到),而是缉拿但地设置日志掩码,使日志级别大于日志掩码的日志被系统忽略 。
2.2下面这个函数用于设置syslog的日志掩码 。
史上最全Linux服务器程序规范

文章插图
 
maskpri:指定日志掩码值,该函数始终回成功,它返回调用进程先前的日志掩码值 。
2.3关闭日志功能:
史上最全Linux服务器程序规范

文章插图
 
02
用户信息
1.UID, EUID, GID, EGID
用户信息对于服务器安全很重要,大多说服务器以root启动, 非root运行
史上最全Linux服务器程序规范

文章插图
 
基础知识:
一个进程拥有两个用户ID, UID, EUID, EUID存在的目的是为了方便资源的访问, 它使得运行程序的用户拥有该程序的有效用户权限,比如,su用来更改账户信息,但修改账户时su程序的所有者是root,在普通用户运行su程序时,其有效用户就是该程序的所有者root, 有效用户为root的进程称为特权进程,EGID与EUID类似,下面演示uid, euid区别:


推荐阅读