关于NFS客户端挂载与mount的几点探讨

最近在学习网络文件系统(NFS),发现mount这个学问很多,在这里总结一下。

NFS客户端开机自动挂载的方法:

第一种方法:将挂载命令写入/etc/rc.local

缺点:偶尔开机挂载不上,工作中除了开机自动配置,还要对是否挂载做监控。

第二种方法:将挂载命令放在/etc/fatab里

单这种配置方法有个误区:fstab会先于网络被Linux系统加载。网络没启动时执行fstab会导致连接不上NFS服务器端,无法实现开机挂载。而且,即使是本地文件,也要注意,fstab最后两列要设置为 0 0.否则有可能会导致无法启动服务器的问题。因此NFS网络文件系统最好不要放在fstab里实现开机挂载。

PS:关于ubuntu系统每次开机都会有1分30秒的等待时间

fstab这个文件大家最好不要乱动,修改前先做备份,我之前就由于不小心删除了一个条目,导致无法开机。由于我电脑装了4个系统,三个linux系统(Ubuntu、Kali、Deeoin),都公用一个swap分区,每次重装或者更改系统时Linux会自动格式化swap分区,导致了这与ubuntu中/etc/fatab中记录的uuid不一样,然后就开机漫长的等待1分30秒才开机,出现:A start job is running for dev-disk-by/x2uuid-7ea*.device(**/1min30s )这样的提示,导致开机也未挂载上swap.解决方法如下:

[code lang=”bash”]
jian@N4010:~$ sudo blkid
[sudo] jian 的密码:
/dev/sda1: UUID="54DE803EDE801A7E" TYPE="ntfs" PARTUUID="ad078914-01"
/dev/sda5: UUID="46957b90-fc30-47ca-b256-049e267e7cf5" TYPE="ext4" PARTUUID="ad078914-05"
/dev/sdb1: UUID="2661b44d-6408-4b1c-b92c-2ab42deca270" TYPE="ext4" PARTUUID="000cf9af-01"
/dev/sdb5: UUID="120e4dc8-74a4-4573-bff0-1685412ca365" TYPE="swap" PARTUUID="000cf9af-05"
/dev/sdb6: LABEL="M-hM-=M-/M-dM-;M-6" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-06"
/dev/sdb7: LABEL="M-fM-^VM-^GM-fM-!M-#" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-07"
/dev/sdb8: LABEL="M-eM-(M-1M-dM-9M-^P" UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-08"
/dev/sdb9: LABEL="M-eM-^JM-^^M-eM-^EM-," UUID="0000678400004823" TYPE="ntfs" PARTUUID="000cf9af-09"
/dev/sdb10: UUID="43409185-fa0a-4e17-96f1-f666685aa81e" TYPE="ext4" PARTUUID="000cf9af-0a"
[/code]

使用sudo fdisk -l产看所有分区信息,找到swap对应的swap分区如下:

/dev/sdb5 156258304 167772159 11513856 5.5G 82 Linux 交换 / Solaris

将sbd5对应的UUID=”120e4dc8-74a4-4573-bff0-1685412ca365″,重新写入到fstab:

[code language=”bash”]

jian@N4010:~$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use ‘blkid’ to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type><options> <dump> <pass>
# / was on /dev/sda5 during installation
UUID=46957b90-fc30-47ca-b256-049e267e7cf5 / ext4 errors=remount-ro 0 1
# swap was on /dev/sdb5 during installation
UUID=120e4dc8-74a4-4573-bff0-1685412ca365 none swap sw 0 0

[/code]

从启发现再没有恼人的1分30秒等待了

二、关于fstab中的格式与参数说明,MAN给出的信息如下:

The first field (fs_spec).—->This field describes the block special device or remote filesystem to be mounted.

The second field (fs_file).—->This field describes the mount point for the filesystem. For swap partitions, this field
should be specified as `none’. If the name of the mount point contains spaces these can be
escaped as `\040′.

The third field (fs_vfstype).—->This field describes the type of the filesystem.

The fourth field (fs_mntops).T—->his field describes the mount options associated with the filesystem.

The fifth field (fs_freq).—->:This field is used by dump(8) to determine which filesystems need to be dumped. Defaults to
zero (don’t dump) if not present.(意思是是否要转储,应该是读写缓存的意思,实时读写就是0,防止因异常断电导致的数据丢失。)

The sixth field (fs_passno).—->This field is used by fsck(8) to determine the order in which filesystem checks are done at
boot time. The root filesystem should be specified with a fs_passno of 1. Other filesystems
should have a fs_passno of 2. Filesystems within a drive will be checked sequentially, but
filesystems on different drives will be checked at the same time to utilize parallelism
available in the hardware. Defaults to zero (don’t fsck) if not present.

(大概意思是:通过此字段来设置启动时检测文件系统的顺序应该 1 指定文件系统其他文件系统应该用  2。按顺序检查驱动器文件系统不同驱动器文件系统同时利用并行性检查硬件可用默认值零不检查)

所以不重要的文件系统可以设置为0 0,防止因为一些异常而无法开机。

三、fstab与mount的关系

通过mount -o指定挂载参数与在/etc/fstab里指定挂载参数的效果是一样的。

执行mount -a会自动执行/etc/fstab中的挂载参数。(mount  -a, –all  —-> mount all filesystems mentioned in fstab)

四、NfS客户端挂载优化(考虑安全与性能两个方面)

兼顾到安全与性能的挂载方式:

[code lang=”bash”]mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 10.0.100.128:/date/nfs  /mnt/share[/code]

如果是本地文件系统,使用如下命令:

[code lang=”bssh”]mount  /dev/sdb5 /mnt -o defaults,async,noatime,data=writeback,barrier=0[/code]

本地文件系统挂载时,如果加nodirtime会报错。

五、NFS内核优化建议#NFS内核优化建议

[code lang=”bash”]

vim /etc/sysctl.conf

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
ne.core.wmem_max = 16777216

执行sysctl -p生效 [/code]

注:如果卸载的时候提示:“umount:/mnt:device is busy”,注意需要退出挂载的目录在进行卸载,如果是NFS server宕机了,则需要强制卸载,可执行umount -lf /mnt
大型网站NFS网络文件系统的替代软件为分布式文件系统Moosefs(mfs)、GlusterFS、FastDFS.

 

Linux 系统启动过程

Linux 系统启动过程

linux启动时我们会看到许多启动信息。

Linux系统的启动过程并不是大家想象中的那么复杂,其过程可以分为5个阶段:

  • 内核的引导。
  • 运行init。
  • 系统初始化。
  • 建立终端 。
  • 用户登录系统。

内核引导

当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

bg2013081702


运行init

init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。

init 程序首先是需要读取配置文件 /etc/inittab。

 

运行级别

  • 许多程序需要开机启动。它们在Windows叫做”服务”(service),在Linux就叫做”守护进程”(daemon)。
  • init进程的一大任务,就是去运行这些开机启动的程序。
  • 但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
  • Linux允许为不同的场合,分配不同的开机启动程序,这就叫做”运行级别”(runlevel)。也就是说,启动时根据”运行级别”,确定要运行哪些程序。

bg2013081704

Linux系统有7个运行级别(runlevel):

  • 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 运行级别2:多用户状态(没有NFS)
  • 运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式
  • 运行级别4:系统未使用,保留
  • 运行级别5:X11控制台,登陆后进入图形GUI模式
  • 运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

系统初始化

在init的配置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 它调用执行了/etc/rc.d/rc.sysinit,而rc.sysinit是一个bash shell的脚本,它主要是完成一些系统初始化的工作,rc.sysinit是每一个运行级别都要首先运行的重要脚本。

它主要完成的工作有:激活交换分区,检查磁盘,加载硬件模块以及其它一些需要优先执行任务。

l5:5:wait:/etc/rc.d/rc 5

这一行表示以5为参数运行/etc/rc.d/rc,/etc/rc.d/rc是一个Shell脚本,它接受5作为参数,去执行/etc/rc.d/rc5.d/目录下的所有的rc启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些连接文件,而不是真正的rc启动脚本,真正的rc启动脚本实际上都是放在/etc/rc.d/init.d/目录下。

而这些rc启动脚本有着类似的用法,它们一般能接受start、stop、restart、status等参数。

/etc/rc.d/rc5.d/中的rc启动脚本通常是K或S开头的连接文件,对于以以S开头的启动脚本,将以start参数来运行。

而如果发现存在相应的脚本也存在K打头的连接,而且已经处于运行态了(以/var/lock/subsys/下的文件作为标志),则将首先以stop为参数停止这些已经启动了的守护进程,然后再重新运行。

这样做是为了保证是当init改变运行级别时,所有相关的守护进程都将重启。

至于在每个运行级中将运行哪些守护进程,用户可以通过chkconfig或setup中的”System Services”来自行设定。

bg2013081705


建立终端

rc执行完毕后,返回init。这时基本系统环境已经设置好了,各种守护进程也已经启动了。

init接下来会打开6个终端,以便用户登录系统。在inittab中的以下6行就是定义了6个终端:

1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

从上面可以看出在2、3、4、5的运行级别中都将以respawn方式运行mingetty程序,mingetty程序能打开终端、设置模式。

同时它会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给login程序来验证用户的身份。


用户登录系统

一般来说,用户的登录方式有三种:

  • (1)命令行登录
  • (2)ssh登录
  • (3)图形界面登录

 

  • 对于运行级别为5的图形方式用户来说,他们的登录是通过一个图形化的登录界面。登录成功后可以直接进入KDE、Gnome等窗口管理器。
  • 而本文主要讲的还是文本方式登录的情况:当我们看到mingetty的登录界面时,我们就可以输入用户名和密码来登录系统了。
  • Linux的账号验证程序是login,login会接收mingetty传来的用户名作为用户名参数。
  • 然后login会对用户名进行分析:如果用户名不是root,且存在/etc/nologin文件,login将输出nologin文件的内容,然后退出。
  • 这通常用来系统维护时防止非root用户登录。只有/etc/securetty中登记了的终端才允许root用户登录,如果不存在这个文件,则root可以在任何终端上登录。

/etc/usertty文件用于对用户作出附加访问限制,如果不存在这个文件,则没有其他限制。

<p在分析完用户名后,login将搜索 etc=”” passwd以及=”” shadow来验证密码以及设置账户的其它信息,比如:主目录是什么、使用何种shell。如果没有指定主目录,将默认为根目录;如果没有指定shell,将默认为=”” bin=”” bash。<=”” p=”” style=”color: rgb(51, 51, 51); font-family: ‘Open Sans’, ‘Helvetica Neue’, Helvetica, Arial, STHeiti, ‘Microsoft Yahei’, sans-serif; font-size: 12px; white-space: normal; background-color: rgb(255, 255, 255);”>


图形模式与文字模式的切换方式

Linux预设提供了六个命令窗口终端机让我们来登录。

默认我们登录的就是第一个窗口,也就是tty1,这个六个窗口分别为tty1,tty2 … tty6,你可以按下Ctrl + Alt + F1 ~ F6 来切换它们。

如果你安装了图形界面,默认情况下是进入图形界面的,此时你就可以按Ctrl + Alt + F1 ~ F6来进入其中一个命令窗口界面。

当你进入命令窗口界面后再返回图形界面只要按下Ctrl + Alt + F7 就回来了。

如果你用的vmware 虚拟机,命令窗口切换的快捷键为 Alt + Space + F1~F6. 如果你在图形界面下请按Alt + Shift + Ctrl + F1~F6 切换至命令窗口。

 


Linux 关机

在linux领域内大多用在服务器上,很少遇到关机的操作。毕竟服务器上跑一个服务是永无止境的,除非特殊情况下,不得已才会关机。

正确的关机流程为:sysnc > shutdown > reboot > halt

关机指令为:shutdown ,你可以man shutdown 来看一下帮助文档。

例如你可以运行如下命令关机:

sync 将数据由内存同步到硬盘中。

shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机:

shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。

Shutdown –h now 立马关机

Shutdown –h 20:25 系统会在今天20:25关机

Shutdown –h +10 十分钟后关机

Shutdown –r now 系统立马重启

Shutdown –r +10 系统十分钟后重启

reboot 就是重启,等同于 shutdown –r now

halt 关闭系统,等同于shutdown –h now 和 poweroff

最后总结一下,不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中。

关机的命令有 shutdown –h now halt poweroff 和 init 0 , 重启系统的命令有 shutdown –r now reboot init 6.


Linux 系统启动过程>>转载自:http://www.imooc.com/wiki/detail/id/1230

iptables 企业场景应用–实例

#!/bin/bash
#2016-06-17 zhixiang from immoc
#iptables rules
##################################################
#ftp 内核模块
modprobe ipt_MASQUERADE
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
#清除所有规则
iptables -F
iptables -t nat -F
iptables -X
iptables -t nat -X

#################################################
# -p 默认规则设置
iptables -P INPUT DROP
iptables -A INPUT -m state –state ESTABLISH,RELATED -j ACCEPT

iptables -A INPUT -i lo ACCEPT

iptables -A INPUT -p tcp -m multiport –dport 110,80,25 -j ACCEPT
#允许内网只能访问文件共享
iptables -A INPUT -p tcp -s 10.0.100.0/24 –dport 139 -j ACCEPT

iptables -A INPUT -i eth1 -p udp -m multiport –dport 53 -j ACCEPT

#开放vpn(pptp),gre隧道
iptables -A INPUT -p tcp –dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT

#限速
iptables -A INPUT -s 192.168.100.0/24 -p tcp -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp –syn -m connlimit –connlimit-above 15 -j DROP

#禁止ping
iptables -A INPUT -p icmp -j DROP

# NAT转发:内网访问外网通过ppp0
iptables -t nat -A POSTROUTING -O PPPO -S 10.0.100.0/24 -j MASQUERADE

#########################################################
#防攻击策略
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -I syn-flood -p tcp -m limit –limit 3/s –limit-burst -j RETURN
iptables -A syn-flood -j REJECT

###########################################################
#转发规则
iptables -P FORWARD DROP
iptables -A FORWARD -p tcp -s 10.0.100.0/24 -m multiport –dport 80,110,21,25,1723 -j ACCEPT
iptables -A FORWARD -p udp -s 10.0.100.0/24 –dport 53 -j ACCEPT
iptables -A FORWARD -p gre -s 10.0.100.0/24 -j ACCEPT
iptables -A FORWARD -p icmp -s 10.0.100.0/24 -j ACCEPT

#########################################################
#访问控制
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -p udp –dport -m string –string “tencent” -m time –timestart 8:00 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “TENCENT” -m time –timestart 8:00 –timestop 12:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “tencent” -m time –timestart 14:00 –timestop 17:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

iptables -I FORWARD -p udp –dport -m string –string “TENCENT” -m time –timestart 14:00 –timestop 17:30 –days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#限制访问web QQ
iptables -I FORWARD -s 10.0.100.0/24 -m string “qq.com” -m time –timestart 8:00 –timestop 18:00 –days Mon,Tus,Wed,Tus,Fri,Sat -j DROP
#禁止访问关键词网址
iptables -I FORWARD -s 10.0.100.0/24 -m string –string “av1024.net” -j DROP
iptables -I FORWARD -D 10.0.100.0/24 -m string –string “eroticism” -j DROP
#禁止bt下载
iptables -A FORWARD -m ipp2p –edk –kazaa –bit -J DROP

#内核相关模块
#开启数据包转发,防止syn攻击
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null

#确保管理员的ip有绝对的访问权限
iptables -I INPUT -s 10.0.100.15 -j ACCEPT
iptables -I FORWARD -s 10.0.100.15 -j ACCEPT

iptables中NAT模式设置–SNAT

iptables防火墙nat表规则配置s数据包在规则表、链匹配流程

场景模拟:我在虚拟机中搭建了三台服务器,其中一台webserver:ip 10.0.100.128,另一台centos作为Nat sever,配置两块网卡(网卡1:10.0.100.129,网卡2:192.168.100.128),另一台Ubuntu server 作为Client,访问web server,其ip为:192.168.100.129,很显然他们ip不再同一网段内,所以无法互通,接下来我们通过Snat规则,使ubuntu server能访问到位于10.0.100.128上的web server。其网络拓扑结构如下:

SNAT场景模拟

其中10.0.100.128的iptables规则如下:
#!/bin/bash
#20160715 >> /etc/rc.local 开机启动
#清除所有规则
iptables -F
#开放ssh端口
iptables -I INPUT -p tcp –dport 52022 -j ACCEPT
#开放本地回环请求
iptables -I INPUT -i lo -j ACCEPT
#状态放行(本地请求)
iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
#开放网段
iptables -I INPUT -p tcp -s 10.0.100.0/24 -j ACCEPT
#开启开发服务端口
iptables -I INPUT -p tcp –dport 80 -j ACCEPT
#开放VPN端口
#iptables -I INPUT -p tcp –dport 1723 -j ACCEPT
#允许icmp数据包,允许ping
iptables -I INPUT -p icmp -j ACCEPT
#拒绝未被允许的数据包
iptables -A INPUT -j REJECT
#显示所有规则
iptables -nL
#保存所有规则到配置文件中
#/etc/init.d/iptables save

接下来需要配置Nat server:首先打开内核数据包转发功能。vim /etc/sysctl.conf修改net.ipv4.ip_forward = 1,
然后执行sysctl -p使参数立即生效。然后配置iptables 转发规则:iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -j SNAT –to 10.0.100.135,将所有流经网卡192.168.100.0/24网段的数据都由10.0.100.135这块网卡转发出去。
最后我们在Client上增加一块默认网关为192.168.100.128,将请求的数据有Nat server转发。命令为:sudo route add default gw 192.168.100.128,
测试结果如下:
QQ截图20160717134659

python3 tab键自动补全

bash 的一大特点就是tab自动补全功能,是否python中也有这个功能呢?别说还真有,哈哈。不过需要我们配置以下,先写一个脚本:

[code lang=”python”]
#!/usr/bin/python3
##########################################################
# File Name: tab.py
# Author:Zhixiang
# mail:zhixiang_uestc@126.com
# Created Time:2016年07月09日 星期六 14时15分35秒
##########################################################
# python startup file
import sys
import readline
import rlcompleter
import atexit
import os
# tab completion
readline.parse_and_bind(‘tab: complete’)
# history file
histfile = os.path.join(os.environ[‘HOME’], ‘.pythonhistory’)
try:
readline.read_history_file(histfile)
except IOError:
pass
atexit.register(readline.write_history_file, histfile)
del os, histfile, readline, rlcompleter
[/code]
然后在脚本的目录下运行python3,然后导入这个模块:(不加.py后缀)
[code lang=”python”]
import tab
ipmort sys
sys.(此时按tab键就可以自动出现sys下所有的模块了!)
[/code]
我发现python3真的很好用,而且只用导入一次,一劳永逸,不用像python2每次退出后必须重新导入。
PS:python3与python2的不同:python3使用print()进行输输出,输入用input(),并且好像废弃了raw_input()

ulimit命令(Shell内建命令)

ulimit命令用来限制系统用户对shell资源的访问。如果不懂什么意思,下面一段内容可以帮助你理解: 假设有这样一种情况,当一台 Linux 主机上同时登陆了 10 个人,在系统资源无限制的情况下,这 10 个用户同时打开了 500 个文档,而假设每个文档的大小有 10M,这时系统的内存资源就会受到巨大的挑战。 而实际应用的环境要比这种假设复杂的多,例如在一个嵌入式开发环境中,各方面的资源都是非常紧缺的,对于开启文件描述符的数量,分配堆栈的大 小,CPU 时间,虚拟内存大小,等等,都有非常严格的要求。资源的合理限制和分配,不仅仅是保证系统可用性的必要条件,也与系统上软件运行的性能有着密不可分的联 系。这时,ulimit 可以起到很大的作用,它是一种简单并且有效的实现资源限制的方式。 ulimit 用于限制 shell 启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell 进程创建文件的大小、内存锁住的大小、常驻内存集的大小、打开文件描述符的数量、分配堆栈的最大大小、CPU 时间、单个用户的最大线程数、Shell 进程所能使用的最大虚拟内存。同时,它支持硬资源和软资源的限制。 作为临时限制,ulimit 可以作用于通过使用其命令登录的 shell 会话,在会话终止时便结束限制,并不影响于其他 shell 会话。而对于长期的固定限制,ulimit 命令语句又可以被添加到由登录 shell 读取的文件中,作用于特定的 shell 用户。

语法 ulimit      (选项) 选项

[code lang=”plain”]
-a:显示目前资源限制的设定;
-c :设定core文件的最大值,单位为区块;
-d <数据节区大小>:程序数据节区的最大值,单位为KB;
-f <文件大小>:shell所能建立的最大文件,单位为区块;
-H:设定资源的硬性限制,也就是管理员所设下的限制;
-m <内存大小>:指定可使用内存的上限,单位为KB;
-n <文件数目>:指定同一时间最多可开启的文件数;
-p <缓冲区大小>:指定管道缓冲区的大小,单位512字节;
-s <堆叠大小>:指定堆叠的上限,单位为KB;
-S:设定资源的弹性限制; -t :指定CPU使用时间的上限,单位为秒;
-u <程序数目>:用户最多可开启的程序数目;
-v <虚拟内存大小>:指定可使用的虚拟内存上限,单位为KB。
[/code]

实例:

[code lang=”bash”]
[root@localhost ~]# ulimit -a
core file size (blocks, -c) 0 #core文件的最大值为100 blocks。
data seg size (kbytes, -d) unlimited #进程的数据段可以任意大。
scheduling priority (-e) 0 file size (blocks, -f) unlimited #文件可以任意大。
pending signals (-i) 98304 #最多有98304个待处理的信号。
max locked memory (kbytes, -l) 32 #一个任务锁住的物理内存的最大值为32KB。
max memory size (kbytes, -m) unlimited #一个任务的常驻物理内存的最大值。
open files (-n) 1024 #一个任务最多可以同时打开1024的文件。
pipe size (512 bytes, -p) 8 #管道的最大空间为4096字节。
POSIX message queues (bytes, -q) 819200 #POSIX的消息队列的最大值为819200字节。
real-time priority (-r) 0 stack size (kbytes, -s) 10240 #进程的栈的最大值为10240字节。
cpu time (seconds, -t) unlimited #进程使用的CPU时间。
max user processes (-u) 98304 #当前用户同时打开的进程(包括线程)的最大个数为98304。
virtual memory (kbytes, -v) unlimited #没有限制进程的最大地址空间。
file locks (-x) unlimited #所能锁住的文件的最大个数没有限制。
[/code]

Linux中profile、bashrc、bash_profile之间的区别和联系

今天在学习iptables时突然想到用webbench做压力测试时,在服务器端可以使用命令查看并发访问量,但一时记不起命令了,就使用history |grep netstat 找到了以前的命令:netstat -te |grep -c :80,一时间就觉得history是个好东西,要怎么更改它记录的命令条数呢?(默认是1000条,好像。)于是我在.bashrc,.bash_profile,/etc/profile都找了下,一时间有点搞不清楚它们的作用了,于是google了下,下面做一些记录:

/etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.
并从/etc/profile.d目录的配置文件中搜集shell的设置.
/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该
文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该
该文件被读取.
~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

~/.bash_profile 是交互式、login 方式进入 bash 运行的
~/.bashrc 是交互式 non-login 方式进入 bash 运行的
通常二者设置大致相同,所以通常前者会调用后者。

设置生效:可以重启生效,也可以使用命令:source
alias php=/var/eyouim/pub/php/bin/php
source /etc/profile(立即生效)

在 /etc目录的bash.bashrc和profile是系统级(全局)的配置文件,当在用户主目录下找不到.bash_profile 和.bashrc\时,就会读取这两个文件。.bash_history是bash shell的历史记录文件,里面记录了你在bash shell中输入的所有命令。可通过HISSIZE环境变量设置在历史记录文件里保存记录的条数。

查看了下~/.bash_profile,~/.bashrc这两个文件,代码如下:

[code lang=”bash”]
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

[/code]

 

[code lang=”bash”]
# .bashrc

# User specific aliases and functions

alias rm=’rm -i’
alias cp=’cp -i’
alias mv=’mv -i’

# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export LANG="zh_CN.UTF-8"
[/code]

不难发现在~/.bash_profile中调用了~/.bashrc,然后又调用了/etc/bashrc。所以一般我们只需要更改~/.bashrc就可以了,如设置命令的别名。而修改历史命令记录条数,我想对所有用户生效,于是更改了/etc/profile,在末尾加入:

[code lang=”bash”]
设置默认中文
export LC_ALL="zh_CN.UTF-8"
#设置超时自动登出
export TMOUT=500
export HISTSIZE=5000
[/code]
所以:对于更改系统的环境变量,一般是修改/etc/profile。

使用CDN做网站内容加速

  1. 什么是CDN?

    1. CDN全称为Content Delivery Network,中文意思为内容分发网络。简单地讲,通过在现有的internet中增加一层新的网络架构,将网络的内容发布到最接近用户的Cache服务器内,通过智能DNS负载均衡技术,判断用户的来源,让用户就近使用与服务器相同线路的带宽访问Cache服务器,取得所需的内容。例如:成都电信用户访问成都电信Cache服务器上的内容。这样可以减少数据在网络上传输的时间,提高访问的速度。
    2. CDN是一套全国或全球的分布式缓存集群,其实质是通过智能DNS判断用户的来源地域及上网线路,为用户选择一个最接近用户地域,以及和用户上网线路相同的服务器节点,因为地域近,且线路相同,所以可以大幅度提升用户浏览网站的体验。
    3. CND的价值:
      • 为架设网站的企业省钱
      • 提升企业网站的用户访问体验
      • 可以阻挡大部分流量攻击,例如DDOS攻击
      • 一个良好的网站架构设计,访问量尽量都交给CDN
  2. CDN的特点

    1. CDN就是一个具备根据用户区域和线路智能调度的分布式缓存集群。其特点为:
      • 通过服务器内存缓存网站数据,提高了企业站点的访问速度,并大大提高企业站点的稳定性
      • 用户根据智能DNS技术自动选择最合适的Cache服务器,降低了不同运营商之间互联瓶颈造成的影响实现了跨运营商的网络加速,保证不同网络中用户都能得到良好的访问质量。
      • 加快了访问速度,减少了源站点的带宽
      • 用户访问时从服务器的内存中读取数据,分担了网络流量,同时减轻了源站点负载压力
      • 使用CDN可分担源站的网络流量,同时可以减轻源站点的负载压力,并降低黑客入侵及各种DDOS攻击对网站的影响,保证网站有较好的服务质量。
  3. 企业使用CDN的基本要求

    1. 并不是所有的网站都可以一上来就能用CDN的。要加速的业务数据应该存在独立的域名,例如:业务内容图片、附件、JS、CSS等静态元素,这样的静态网站域名才可以使用CDN
    2. 国内较大的CDN提供商有:网宿、蓝汛、快网、帝联及BAT

图解原理:

cdn01 cdn03 CDN域名解析 cdn原理

企业级Nginx Web 服务优化实战

Nginx Web优化思想

  1. nginx基本安全优化
    1. 调整参数隐藏Nginx软件版本号信息
    2. 更改源代码隐藏Nginx软件名及版本号
    3. 更改Nginx服务的默认用户
  2. 根据参数优化Nginx服务性能
    1. 优化Nginx服务的worker进程个数
      1. Nginx官方建议设置为CPU的核数或CPU核数*2。
    2. 优化绑定不同的Nginx进程到不同的CPU上
    3. Nginx时间处理模型优化
    4. 调整Nginx单个进程允许的客户端最大的连接数
      1. Nginx总并发连接=worker数量*work_connections.
      2. 实际的并发连接数除了受worker_connections参数控制外,还和最大打开文件数worker_rlimit_nofile有关。
    5. 配置Nginx worker进程最大打开文件数
    6. 优化服务器域名的散列表大小
    7. 开启高效文件传输模式
    8. 优化Nginx连接参数,调整连接超时时间
    9. 上传文件大小的限制
    10. FastCGI相关参数优化
    11. 配置Nginx gzip压缩实现性能优化
    12. 配置Nginx expires实现性能优化
  3. Nginx日志相关优化与安全
    1. 编写脚本实现Nginx access 日志轮询
    2. 不记录不需要的访问日志
    3. 访问日志的权限设置
  4. Nginx站点目录及URL访问控制
    1. 根据扩展名限制程序和文件访问
    2. 禁止访问指定目录下的所有文件和目录
    3. 限制网站来源IP访问
    4. 配置Nginx,禁止非法域名解析访问企业网站
  5. Nginx图片及目录防盗链
  6. Nginx错误信息的优雅显示
  7. Nginx站点目录文件及目录权限优化
  8. Nginx防爬虫优化
  9. 利用Nginx限制HTTP的请求方法
  10. 使用CDN做网站加速
  11. Nginx程序架构优化
  12. 使用普通用户启动Nginx
  13. 控制Nginx并发连接数量
    • ngx_http_limit_conn_module
      • limit_conn_zone key zone=name:size;(limit_conn_zone $binary_remote_addr zone=addr:10m;)
      • limit_conn参数:limit_conn zone number;
        • limit_conn addr 1;(限制单IP的并发连接为1)
  14. 控制客户端请求Nginx的速率

第一章练习4:丰富程序可怕的诗歌(awfulpoetry)

这是上一个练习的升级,在命令行中指明需要打印的行数【1-10】行作为参数,若不输入则按照上一个程序打印5行,增加了程序的鲁棒性。
运行效果如图:
2016-07-06 15-00-37屏幕截图
源代码:
[code lang=”python”]
#!/usr/bin/python3
###########################################################
# File Name: awfulpoetry1_ans.py
# Author:Zhixiang
# mail:zhixiang_uestc@126.com
# Created Time:2016年07月06日 星期三 10时58分20秒
# Object:产生可怕诗歌代码的升级版,行数自定义
##########################################################

import random
import sys
lines = 5
#创建一些词汇:冠词、主题、动词、状语
if len(sys.argv) > 1:
try:
temp = int(sys.argv[1])
if 1 <= temp <= 10:
lines = temp
print("输出:",temp,"行")
else:
print("lines must be 1-10 inclusive")
except ValueError:
print("usage: badpoetry.py [lines]")

while lines:
x = random.choice(["the","a","another","his","her"])
y = random.choice(["cat","dog","man","womwn","boy","girl"])
z = random.choice(["sang","ran","jumped","laughed","hoped"])
u = random.choice(["loudly","quietly","well","badly","slowly"])
j = random.randint(1,2)
if j == 1:
print(x,y,z,u)
else:
print(x,y,z)
lines -= 1
[/code]