Linux 守护进程(Daemon)

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

首先,守护进程最重要的特性是后台运行。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符、控制终端、会话和进程组、工作目录以及文件创建掩码等。这些环境通常是守护进程从执行它的父进程(特别是shell)继承下来的。最后,守护进程的启动方式有其特殊之处。它可以在Linux系统启动时从启动脚本/etc/rc.d中启动,也可以由作业控制进程crond启动,还可以由用户终端(通常是shell)执行。

除这些,守护进程与普通进程基本上没有什么区别。因此,编写守护进样实际上是把一个普通进程按照上述的守护进程的特性改造成为守护进程

按照服务类型分为如下几个。

系统守护进程:syslogd、login、crond、at等。
网络守护进程:sendmail、httpd、xinetd、等。
独立启动的守护进程:httpd、named、xinetd等。
被动守护进程(由xinetd启动):telnet、finger、ktalk等

在正常条件下,我们将程序运行产生的信息打印到控制台实时显示,如果我们想讲一个程序以守护进程的方式进行运行,就需要改变信息的输出方向,将其导向到配置文件里设置的日志文件。

  将一个进程转换为守护进程需要进行几个步骤:

 1) 调用fork( )。
2) 在父进程中,调用exit( )。
3) 调用setsid( ),给守护进程一个新的进程组和会话。
4) 通过将工作目录更改为根目录chdir( )。这是因为继承的工作目录可以位于文件系统的任何位置。守护进程倾向于在系统正常运行时间内运行,并且你不希望保持某个随机目录处于打开状态,从而阻止管理员卸载包含该目录的文件系统。
5) 关闭所有文件描述符。
6) 打开文件描述符0,1和2(标准输入,标准输出和标准错误)并将它们重定向到/dev/null。

apache2.4 运行cgi的几种方式

我这边的服务器的web server基本上都是nginx的,但是今天在配置smokeping的时候,发现还得是使用apache做为后端来跑cgi,nginx对于cgi以及fastcgi的支持不是太好,google了一整天才发现原来apache的官方文档才是最好的资料. 本文以下内容均以apache2.4 为标准

如果我们想让apache来运行cgi程序,我们首先需要配置apache来允许cgi 程序. 主要有以下几种方式:

首先我们需要注意的是,无论是以哪种方式运行,我们都需要保证在http.conf中,LoadModule命令中要有cgi或者fcgi的模块:

LoadModule cgid_module modules/mod_cgid.so

or

LoadModule fcgid_module modules/mod_fcgid.so

因为fastcgi要比cgi要快很多,因此建议这里都使用fastcgi的module

在通过yum安装完apache 以后,我们可以直接用

yum install mod_fcgid

来安装apache fastcgi module

方式一: ScriptAlias

ScriptAlias 告诉apache有一个目录被专门设定来跑cgi程序, apache也会因此默认这个目录里面都是cgi程序,进而用cgi的handler来执行

ScriptAlias 命令:

ScriptAlias "/cgi-bin/" "/usr/local/apache2/cgi-bin/"

这里需要注意的是, ScriptAlias和Alias不同, ScriptAlias被专门用cgi程序的alias, Alias则是普通意义上的一个目录的map命令

方式二: CGI outside of ScriptAlias directories

我们经常会遇到把cgi程序放在/cgi-bin/外面的情况,我们只需要两步就可以完成这个任务: 1)  用AddHandler或者SetHandler 来设置cgi-script的handler 2) 在Options命令中,必须指定ExecCGI

以下是用options的方式来设定CGI运行:

<Directory "/usr/local/apache2/htdocs/somedir">
Options +ExecCGI

AddHanlder  cgi-script .cgi
</Directory>

以上命令告诉apache 在这个目录下,以.cgi结尾的都是cgi文件

当然了,如果你没有编辑httpd.conf的权利,也是可以在.htaccess中设定的

另外你可以设定某个目录下都是cgi文件,可以使用下面的配置方式:

<Directory "/home/*/public_html/cgi-bin">
Options ExecCGI
SetHandler cgi-script
</Directory>

 

wordpress 使用cloudflare flexible SSL

这两天帮朋友做一个外贸站点,准备直接挂上cloudflare flexible SSL 就完事了

可是事情没有想象的那么简单,在站点使用普通的http的情况下,在外面加一层cloudflare flexible的情况下,会造成wordpress的 infinite loop.

这是因为虽然用户是用的ssl 来进行访问的,但是cloudflare 会用http 来和后端进行通话,但是后端,也就是wordpress 所在的服务器,已经强制使用SSL 了,这样就会造成http 和 https的不断跳转,以至于造成infinite loop

网上虽然有很多的解决办法,但是最好的办法,还是用cloudflare 来获取一个免费的有cloudflare签名的original certificate,并且把这个ca和key 传到你的wordpress服务器上并且打开443端口,就解决了这个问题

需要注意的一个问题,这个免费的original certificate,只有cloudflare 承认,也就是说这个ssl 只有在你把website 放在 cloudflare后面,并且打开FULL SSL 或者FULL(strict) SSL (推荐)的时候才有用

直接使用这个SSL,会被浏览器显示错误, untrusted CA

最后需要注意的是,一旦在wordpress的后台开启https, 那么cloudflare的 SSL的选项中必须要选择Full 或者 Full(strict)

AWS Lightsail IO 大坑

这两天帮朋友的企业网站迁移到aws amazon lightsail, 选用的环境是军哥的LNMP,php 7.2 和mysql 5.7.22, 用的是2GB的 RAM版本

这个环境在linode上编译只需要67分钟左右,但是在lightsail上竟然需要106分钟。。十分不可思议。。用bench.sh bash script测试了一下才发现IO只有40多。。于此同时linode上的IO有400多。。

哎,lightsail 的IO 真是坑王啊。。如果不运行数据库,只是简单的nginx 还是非常不错的

01/25/2019 更新:

今天测了一个4vCPU 16GB的lightsail, I/O的平均速度到了130,还是马马虎虎可以接受的

———————————————————————-
CPU model : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz
Number of cores : 4
CPU frequency : 2400.035 MHz
Total size of Disk : 320.0 GB (0.9 GB Used)
Total amount of Mem : 15884 MB (162 MB Used)
Total amount of Swap : 0 MB (0 MB Used)
System uptime : 0 days, 0 hour 2 min
Load average : 0.18, 0.11, 0.05
OS : CentOS 7.5.1804
Arch : x86_64 (64 Bit)
Kernel : 3.10.0-862.3.2.el7.x86_64
———————————————————————-
I/O speed(1st run) : 134 MB/s
I/O speed(2nd run) : 131 MB/s
I/O speed(3rd run) : 125 MB/s
Average I/O speed : 130.0 MB/s

Centos7 一张网卡上添加多个IP

centos 7 出来了这么长的时间了,应该很稳定了,是时候把服务器们的系统升级到centos7了. 我现在都有点不太乐意用centos6了

但是在centos7 中,添加多个IP以及IP range的办法与centos 6 有了很大的不同. 我今天搜索了半天,才找到一个行之有效的解决办法.

首先,在centos 7中,添加IP段,已经不能用ifcfg-eth-range0之类的方式了,你会发现这样使用根本添加不上IP.  

Centos7已经把networking的设置完全交给了NetworkManager,也就是nmcli和nmtui的方式。顾名思义,nmcli是 command line,nmcli 是 GUI。但是作为从centos5就开始用ifcfg的人来说,更喜欢ifcfg的方式.

幸好centos7 仍然保留了ifcfg (interface configure)的方式,但是所有的IP都要写入ifcfg-ethx当中.

更多

Xenserver 安装CentOS7 的坑以及安装LNMP的问题

一直在通过xenserver来安装centos6,可是centos6 确实够老了,安装mysql 5.7,其实在编译的时候总会出现各种warning,尤其是使用boost了以后,geometry这里出现的warning更多,但是用centos 7自带的gcc 4.8.5编译就没有这种问题,这让有强迫症的我感觉很不爽,于是心里盘算着在xenserver上安装centos7.

出现的问题,在xenserver 6.5以上安装centos7,配置好以后,在启动的时候就会黑屏,这个应该是xencenter的驱动问题,一个简单的解决办法就是关闭xencenter,然后重新打开xencenter,连上这个server,在打开console,就看到安装画面了。另外一个解决办法就是在启动的时候,选择“install centos 7”,然后按tab来编辑启动选项,可以在启动选项的最后面加上 inst.vnc,这个就会启动VNC服务,我们就可以使用各种VNC的客户端连上来安装centos 7 了. 同理我们也可以使用text模式来装centos 7,只需要在启动选项后面加上text就可以了

在使用netinstallation的时候,我们可以使用下面的URL:

http://mirror.centos.org/centos/7/os/x86_64/

http://repos.lax.quadranet.com/centos/7/os/x86_64/

http://mirror.sfo12.us.leaseweb.net/centos/7/os/x86_64/

http://mirrors.oit.uci.edu/centos/7/os/x86_64/

安装好centos 7以后,对我个人而言,简单省事就是安装军哥的LNMP,但是centos7 有另外一个坑,标准的netinstallation里面没有bzip2,我们需要使用下面命令来安装bzip2:

yum install bzip2

还有一个问题,就是network manager会接管/etc/resolv.conf, 造成你自己设置的resolver每次启动会被重写。解决办法:

编辑/etc/NetworkManager/NetworkManager.conf, 在[main]下面添加dns=none即可

简单理解Linux路由表

很多网络问题都跟路由有关,那么首先必须学会看懂路由表,本文将讲述如何读懂路由及如何决策.

在命令行下输入route -n 或 netstat -rn,就可以打印本机的路由表,我的如下:

Destination Gateway Netmask Flags Metric Ref Use Iface
192.168.161.0 192.168.161.1 255.255.255.0 UG 0 0 0 em1
192.168.161.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 em2
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 em2
192.168.0.0 192.168.61.1 255.255.0.0 UG 0 0 0 em2
0.0.0.0 192.168.61.1 0.0.0.0 UG 0 0 0 em2
0.0.0.0 192.168.161.1 0.0.0.0 UG 0 0 0 em1

PS:我的电脑是双网卡,分别在192.168.61.0和192.168.161.0两个网段

————————————————–

1 字段解释

Destination 目的网段,最长匹配192.168.161.0 > 192.168.0.0 > 0.0.0.0,0可匹配任意数值
Gateway 所走网关,0.0.0.0表示无网关,即与本机IP同一网段,不需要经过网关(同一个局域网内2台主机通信不需要经过网关)
Genmask 掩码
Flags 标志,U – Up表示有效
G – Gateway表示连接路由,若无这个字段表示直连目的地址
H – Host表示目标是具体主机,而不是网段

2 路由匹配

路由表的作用就是指定下一级网关,那么根据路由表怎么确定下一级网关,这里就有一个匹配过程,匹配规则

*(1)优先级匹配(暂不讨论)

*(2)最长匹配

3 实例讲解

还是针对上面的路由表,为了方便表述,加上条目号字段

条目号 Destination Gateway Genmask Flags Metric Ref Use Iface
1 192.168.161.0 192.168.161.1 255.255.255.0 UG 0 0 0 em1
2 192.168.161.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
3 192.168.61.0 0.0.0.0 255.255.255.0 U 0 0 0 em2
4 169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
5 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 em2
6 192.168.0.0 192.168.61.1 255.255.0.0 UG 0 0 0 em2
7 0.0.0.0 192.168.61.1 0.0.0.0 UG 0 0 0 em2
8 0.0.0.0 192.168.161.1 0.0.0.0 UG 0 0 0 em1

 

192.168.61.35 – 匹配条目3,即不需要经过网关
192.168.60.150 – 匹配条目6,需要经过网关192.168.60.1
www.baidu.com – 匹配条目7,这里需要说明下为何不匹配8?这是我实践的结果,后加的默认网关会在列表前面,即优先匹配。这个规则应该用于所有Destination一致的情况
192.168.161.113 – 匹配条目1,不是匹配条目2

KMS 基本命令

家里的Win 2016 Server datacenter KMS 激活马上就要到期了,这才想起来KMS 的命令早就忘的一干二净…哎。。。这里做个记录,以后也好查找

KMS 只适用于VL 版本,不适用于旗舰版

一般来说,只要确保的下载的是VL批量版本并且没有手动安装过任何key, 你只需要使用管理员权限运行cmd执行一句命令就足够:

slmgr /skms you.ip.address.or.domain

然后去计算机属性或者控制面板其他的什么的地方点一下激活就好了。

更多

monit 在 centos 7 和debian 8, debian 9下的使用

在老的centos 6 和 debian 7 中,monit 是通过对 pid 的监控来判断程序是否die 或者有问题的, 但是在 centos 7 和 debian 8 和debian 9下,只要service 不是以forking 的形式启动,systemd 就不会让service 创建 pid file,即使你在service 的配置文件中创建了 PidFile 的命令,这个命令是会被忽略的

因为在由systemd 控制的linux 系统中,monit 无法通过pid 的形式来监控程序,在这里我们就需要用到monit 的的match 命令,比如说nginx 来可以match ‘nginx’, 来完成对nginx 的监控