Apache文件列表服务器美化 index of /

目录 原创

· 示例站点:下一朵云开源软件镜像站 http://download.orcy.net:8027/

· index of / 和 站点ico图标美化在本文末尾部分

在Apache中有目录索引是由mod_autoindex模块负责完成的。它把当前目录结果转换成html页面。在默认情况下,有很多地方让人感觉不爽,比如文件名宽度太窄只有可怜的23字节,图标太大,有点傻傻的,好多文件类型没有关联。幸好Apache开发人员早就想到这一点,提供了让用户定制的命令。

索引风格控制命令:

IndexOptions Directive //Dirctive 是命令选项,见下面实例

下面介绍常用的设置(都写在httpd.conf文件中):

1.修改自动目录索引的宽度
缺省设置下,Apache默认每栏宽度是23字节,对于文件名来说,实在是太短了。一般要求60字节

IndexOptions NameWidth=60

2.修改图标尺寸
系统默认好像是24,经过试验,发现16的效果比较好。

IndexOptions IconHeight=16
IndexOptions IconWidth=16

3.目录优先
系统默认是文件优先,和我们平时的习惯不一致。改过来。

IndexOptions FoldersFirst

4.版本排序
无须多说,加上吧。对于中文来说,是按照拼音顺序排序的。

IndexOptions VersionSort

5.图标优化
默认的图标有不少比较难看,而且还有很多文件类型就没有图标,由于Solaris不支持Microsoft定义的各种文档类型,显示这些文件时都用问号图标表达,或许代表Sun对Microsoft的态度,不过我可不这么认为,凡事还是清楚点好。

定制文件图标分两步,先用图标工具抓取常用图标,象Word,Excel,Powerpint,Rar,Pdf。另外,默认的目录图标看上去也不爽,干脆把 Window的那套东西都搬过来。完成后,把这些图标(格式为gif或png)全部存到/usr/local/apache2/icons目录下。对于目录图标,我直接用微软的图标替换了那个名字叫folder.gif的文件。

接下来,用AddIcon命令把图标和文件类型关联起来。

AddIcon /icons/word.gif .doc .DOC
AddIcon /icons/excel.gif .xls .XLS
AddIcon /icons/rar.gif .rar .RAR
AddIcon /icons/srm.gif .srm .SRM
AddIcon /icons/powerpoint.gif .ppt .PPT
AddIcon /icons/access.gif .mdb .MDB

完成后,重新启动apache,成功显示。可是,有几个类型还是没有显示出来,它们是:rar,srm,mdb。
又仔细分析了一下配置文件,发现可能和文件类型有关。
Apache有一个专门负责文件类型的文件:mime.types,里面为每个文件进行了详细分类。比如有:application,image,audio,video。在里面狂搜了一遍,没有上面的那三个类型,于是在前面增加如下定义:

# MIME type Extensions
application/winrar rar
application/srm srm
application/access mdb

6.Apache目录索引的简易配置

使用Apache配置简易的目录索引,登录者可以方便浏览、下载目录之下的内容。

过程:(以下均为有root权限时的操作)

配置apache:vi /etc/httpd/conf/httpd.conf

管理员的E-mail,出错时发送错误的邮件地址
ServerAdmin [email]HeirJoe@gmail.com[/email]

服务器名,没有域名就写IP
ServerName My IP:80

主目录地址
DocumentRoot “/path/to/server”

设置默认主目录的权限,下面需要用到
Order deny,allow
Allow from all

使用别名,将系统绝对路径转换为相对于DocumentRoot的相对路径
Alias /home “/home/httpd”

配置浏览目录的选项

选项为索引方式
Options Indexes

索引选项,目录优先
IndexOptions FancyIndexing FoldersFirst

索引排除选项
IndexIgnore header.html footer.html

索引头部嵌入文件(只可使用相对http主目录的相对路径,而不是系统的绝对路径)
HeaderName /home/html/header.html
索引底部嵌入的文件(同上,”/home”使用了别名,同时要为那个目录设置权限)
ReadmeName /home/html/footer.html

关闭服务器标志
ServerSignature Off

使用.htaccess文件可以得到的控制水平
AllowOverride None

控制访问权限
Order allow,deny
Allow from all

· 上边所有的美化都做完以后,你会发现浏览器标签页的<title>和网站的ico图标还是默认的丑陋状态,该如何处理呢?

IndexOptions +SuppressHTMLPreamble

来自Apache mod_autoindex docs
If the file specified by HeaderName contains the beginnings of an HTML document (<html>, <head>, etc.) then you will probably want to set IndexOptions +SuppressHTMLPreamble, so that these tags are not repeated.

需要在配置文件添加IndexOptions +SuppressHTMLPreamble,然后在header.html和footer.html文件中填写完整的<html>、<head>标签即可。

用Python监控Linux系统

目录 原创

Python的基础是非常重要的。基础是处理一切问题的基石。

1. 负载情况

如果查看Linux操作系统的负载情况,我们用Python实现的原理是通过查看文件/proc/loadavg 的内容去实现。

我们先来看看这个文件的内容是什么:

$cat /proc/loadavg
0.00 0.01 0.05 1/187 11193

具体代码实现如下:

#!/usr/bin/env python3
loadavg = {}
def load_stat():
    f = open("/proc/loadavg")
    con = f.read().split()
    f.close()
    loadavg['lavg_1']=con[0]  # 1分钟负载
    loadavg['lavg_5']=con[1]  # 5分钟负载
    loadavg['lavg_15']=con[2] #15分钟负载
    return loadavg
load_stat()
print(loadavg)
#输出load1的值
print("load1:"+loadavg["lavg_1"])

解题思路:

为了能够读取 /proc/loadavg 里的文件,我们可以定义一个函数 load_stat()函数 用来打开文件和关闭。然后读取里面的文件存到一个数据结构里,当然数据结构你可以采用List,也可以采用Dict,本文用Dict去存放这些内容。

#!/usr/bin/env python3
f = open("/proc/loadavg")
con = f.read()
#con = f.read().split()  # 调试代码
print(con)
f.close()

我们使用split函数用于对字符串数据进行切片然后放到一个列表里面去。最后我们把列表对应的索引的值又存放到一个新的字典里去。如果要存放在字典。所以我们必须在开头定义好一个空的字典结构。

最后执行的结果如下:

$ python3 load.py 
{'lavg_1': '0.00', 'lavg_5': '0.01', 'lavg_15': '0.05'}
load1:0.00

最后我们输出的是一个字典,那么我们要取负载情况就方便多了

2.内存使用情况

计算内存的利用率原理是需要读取的是/proc/meminfo文件,该文件的结构比较清晰,不需要额外的介绍,需要知道的是内存的使用总量为used = total – free – buffers – cached。

with open("/proc/meminfo") as meminfo:
    for i in meminfo:
        if i.startswith("MemTotal"):
            total_mem = i.split()
            # print(total_mem)
            total_mem = total_mem[1]
            continue
        elif i.startswith("MemAvailable"):
            free_mem = i.split()
            free_mem = free_mem[1]
            continue
        elif i.startswith("Buffers"):
            buff_mem = i.split()
            buff_mem= buff_mem[1]
        elif i.startswith("Cached"):
            cache_mem = i.split()
            cache_mem = cache_mem[1]
            break
        else:
            pass
print("total_mem:"+total_mem)、
# 输出可用内存
# print("free_mem:"+free_mem)
# 输出buffer内存
# print("buff_mem:"+buff_mem)
# print("cache_mem"+cache_mem)
# print(type(free_mem))
# used_mem = total_mem-free_mem-buff_mem-cache_mem
used_mem = float(total_mem)-float(free_mem)-float(buff_mem)-float(cache_mem)
print(used_mem)
# 使用内存
print(used_mem)
#计算内存使用率
res = used_mem/float(total_mem)
# 输出内存使用率值
print(res)

思路解析:

上面的代码首先是去打开 文件/proc/meminfo,然后使用for循环遍历文件里的内容。使用的是字符串的startswith 方法。得到的内容使用字符串的split 方法切割形成一个列表。

Python startswith() 方法用于检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。

其中的列表内容如下:

['MemTotal:', '1863224', 'kB']

从列表内容来看,索引为1的值1863224,就是MemTotal(总内存的数值)。

然后一系列的多条件的if else 语句来分别得到,total_mem,buff_mem,free_mem,cache_mem的值并赋值给变量。当把所有的值取到之后使用break 语句退出循环。

代码used_mem = float(total_mem)-float(free_mem)-float(buff_mem)-float(cache_mem),因为我们得到的total_mem 等内存是字符串没办法进行数学运算,所以需要转成浮点数进行数学运算。

最后使用除法res = used_mem/float(total_mem) 来计算内存使用率。

3.获取网卡信息

为了能获取网卡的流量我们使用 psutil 会更加方便,官方文档:https://psutil.readthedocs.io/en/latest

psutil是个跨平台库,能够轻松实现获取系统运行的进程和系统利用率,包括CPU、内存、磁盘、网络等信息。之前的查看Linux系统的负载和内存使用情况实现都可以用psutil 库去实现。

#获取网卡eth0的IP地址
>>> psutil.net_if_addrs()['eth0'][0].address
'192.168.137.16'
#子网掩码
>>> psutil.net_if_addrs()['eth0'][0].netmask
'255.255.255.0'
#查看网卡是否开启
>>> psutil.net_if_stats()['eth0'].isup
True
#查看网卡的速率,命令有ifconfig,ethtool
>>> psutil.net_if_stats()['eth0'].speed
 #单位 Mb/s

4.CPU使用情况

查看cpu的使用情况我们使用psutil 更加方便。

#!/usr/bin/env python3
# @Author : knight
import psutil
#检测cpu的使用率
#psutil获取系统cpu使用率的方法是cpu_percent(),其有两个参数,分别是interval和percpu,interval指定的是计算cpu使用率的时间间隔,percpu则指定是选择总的使用率还是每个cpu的使用率
print(psutil.cpu_percent(interval=20,percpu=False))
#查看物理cpu的个数
print(psutil.cpu_count(logical=False))
#查看cpu的总使用情况
print(psutil.cpu_times_percent())
# #每个cpu的使用情况
print(psutil.cpu_times_percent(percpu=True))
#cpu的使用率
psutil.cpu_percent() 
```
我们执行上面的脚本,执行结果如下:
```
$python3  test.py 
2.8
4
scputimes(user=1.0, nice=0.0, system=1.8, idle=97.2, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)
[scputimes(user=0.0, nice=0.0, system=1.0, idle=98.0, iowait=1.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=1.0, nice=0.0, system=2.0, idle=97.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=0.0, nice=0.0, system=2.0, idle=97.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=0.0, nice=0.0, system=2.0, idle=97.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=2.0, nice=0.0, system=1.0, idle=97.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=0.0, nice=0.0, system=2.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=1.0, nice=0.0, system=1.0, idle=98.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0), scputimes(user=3.0, nice=0.0, system=3.0, idle=93.0, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)]

以上的代码能正常的去获取cpu的负载情况,cpu状态和信息,内存信息,网络信息和流量等。

1)我们再拓展一下使用psutil 库去实现 之前的cpu是使用情况。具体的实现如下:

使用psutil获取物理内存和交换内存信息,分别使用:

>>> psutil.virtual_memory()
svmem(total=8589934592, available=2866520064, percent=66.6, used=7201386496, free=216178688, active=3342192640, inactive=2650341376, wired=1208852480)
>>> psutil.swap_memory()
sswap(total=1073741824, used=150732800, free=923009024, percent=14.0, sin=10705981440, sout=40353792)

返回的是字节为单位的整数,可以看到,总内存大小是8589934592 = 8 GB,已用7201386496 = 6.7 GB,使用了66.6%。而交换区大小是1073741824 = 1 GB

2)我们要获取系统的负载情况,我们还可以使用os模块去实现具体代码如下, 下面的代码我们是通过ipython进行交互的,在linux命令行交互式调试过程中。具体的Ipython的安装方法为pip3 install ipython

In [12]: import os                                                                                                                                                 
In [13]: os.getloadavg()                                                                                                                                           
Out[13]: (0.09, 0.27, 0.29)

Linux启动提示Kernel panic – not syncing: Attempted to kill init解决办法

目录 原创

Linux启动提示Kernel panic – not syncing: Attempted to kill init解决办法

系统类型:CentOS 6.5(x64)

启动提示:Kernel panic – not syncing: Attempted to kill init

解决办法:

系统启动的时候,按下”e”键进入grub编辑界面,编辑grub菜单,选择”kernel /vmlinuz-XXXXro root=/dev/vogroup00/logvol00 rhgb quiet” 一栏,按”e”键进入编辑,在末尾增加enforcing=0,即:

kernel /vmlinuz-XXXXro root=/dev/vogroup00/logvol00 rhgb quiet enforcing=0(其中enforcing=0是需要加上去的,其他不动)

按”b”键继续引导,OK顺利前进。(备注这里的XXX与你具体的系统版本有关)