Linux基本应用篇
该文档适合新员工入职或者想了解Linux运维的初学者学习使用。
王斌
2020/5/18
nginx [engine x]是Igor Sysoev编写的一个HTTP和反向代理服务器,另外它也可以作为邮件代理服务器。 它已经在众多流量很大的俄罗斯网站上使用了很长时间,这些网站包括Yandex、Mail.Ru、VKontakte,以及Rambler。
据Netcraft统计,在2012年8月份,世界上最繁忙的网站中有11.48%使用Nginx作为其服务器或者代理服务器。目前互联网主流公司360、百度、新浪、腾讯、阿里等都在使用nginx作为自己的web服务器。
Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(location是Nginx配置中的一个指令,用于URL匹配),而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。
Nginx相对于Apache优点:
首先需要安装pcre库,然后再安装Nginx:
#安装pcre支持rewrite库,也可以安装源码,注*安装源码时,指定pcre路径为解压
源码的路径,而不是编译后的路径,否则会报错
(make[1]: *** [/usr/local/pcre/Makefile] Error 127 错误)
yum install pcre-devel pcre -y
#下载Nginx源码包
cd /usr/src ;wget -c http://nginx.org/download/nginx-1.4.2.tar.gz
#解压Nginx源码包
tar -xzf nginx-1.4.2.tar.gz
#进入解压目录,然后sed修改Nginx版本信息为WS
cd nginx-1.4.2 ; sed -i -e 's/1.4.2//g' -e 's/nginx\//WS/g' -e 's/"NGINX"/"WS"/g' src/core/nginx.h
#预编译Nginx
useradd www ;./configure --user=www --group=www --prefix=/usr/local/nginx --with-
http_stub_status_module --with-http_ssl_module
#.configure预编译成功后,执行make命令进行编译
make
#make执行成功后,执行make install 正式安装
make install
#自此Nginx安装完毕
/usr/local/nginx/sbin/nginx -t
检查nginx配置文件是否正确,返回OK即正确。
[root@localhost ~]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost ~]#
然后启动nginx,/usr/local/nginx/sbin/nginx
回车即可。查看进程是否已启动:
[root@localhost ~]# ps -ef |grep nginx
nobody 5381 30285 0 May16 ? 00:04:31 nginx: worker process
root 30285 1 0 2014 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx
root 32260 32220 0 12:34 pts/0 00:00:00 grep nginx
[root@localhost ~]#
在真实的服务器环境,为了充分利用服务器资源,一台nginx web服务器同时会配置N个虚拟域名主机,即多个域名对于同样一个80端口。然后服务器IP数量很多,也可以配置基于多个IP对应同一个端口。
vi修改nginx.conf server段配置内容如下:
#virtual hosts config 2014/5/18
server {
listen 80;
server_name www.a.com;
#access_log logs/host.access.log main;
location / {
root html/a;
index index.html index.htm;
}
server {
listen 80;
server_name www.b.com;
#access_log logs/host.access.log main;
location / {
root html/b;
index index.html index.htm;
}
创建两个不同的目录mkdir –p /usr/local/nginx/html/{a,b}
,然后分别在两个目录创建两个不同的index.html网站页面即可。通过客户端配置hosts指向两个域名,然后在IE浏览器访问测试效果。
随着访问量的不断增加,需要对Nginx和内核做相应的优化来满足高并发用户的访问,那下面在单台Nginx服务器来优化相关参数。
Nginx常用配置参数有upstream,主要用于均衡后端多个实例:
Nginx 的upstream目前支持5种算法分配方式:
upstream tdt_app {
server 10.10.1.11:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.10.1.12:8080 weight=1 max_fails=2 fail_timeout=30s;
}
Tdt_app均衡两台后端JAVA服务,在30秒内nginx会与后端的某个server通信检测,如果检测连接失败2次,则Nginx会认为该server已经失效,然后踢出转发列表,然后在接下来的30s内,nginx不再讲请求转发给失效的server。
另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用proxy_connect_timeout和proxy_read_timeout来控制的。
proxy_connect_timeout : Nginx与后端服务器连接的超时时间,发起握手等候响应超时时间。
proxy_read_timeout:连接成功后_等候后端服务器响应时间,其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)。
proxy_send_timeout :后端服务器数据回传时间,在规定时间之内后端服务器必须传完所有的数据。
keepalive_timout:一个http产生的tcp连接在传送完最后一个响应后,还需要等待多少秒后,才关闭这个连接。
Rewrite规则含义就是某个URL重写成特定的URL,从某种意义上说为了美观或者对搜索引擎友好,提高收录量及排名等。
Rewrite规则的最后一项参数为flag标记,支持的flag标记主要有以下几种:
a) 例如用户访问www.test.com,想直接跳转到网站下面的某个页面,www.test.com/new.index.html如何来实现呢?
我们可以使用Nginx Rewrite 来实现这个需求,具体如下:
在server中加入如下语句即可:
rewrite ^/$ http://www.wugk.com/index.html permanent;
*代表前面0或更多个字符
+代表前面1或更多个字符
?代表前面0或1个字符
^代表字符串的开始位置
$代表字符串结束的位置
。为通配符,代表任何字符
b) 例如多个域名跳转到同一个域名,nginx rewrite规则写法如下:
server
{
listen 80;
server_name www.wugk.com wugk.com;
if ($host != ‘www.wugk.com’ ) {
rewrite ^/(.*)$ http://www.wugk.com/$1 permanent;
}
更多深入的rewrite可以继续学习。
Rsync是Unix/Linux下的一款应用软件,利用它可以使多台服务器数据保持同步一致性,第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。
Rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。可以很容易做到保持原来文件的权限、时间、软硬链接等。
下面正式来配置Rsync服务器,模拟真实环境服务器数据同步。
A是源服务器,B、C为客户端服务器,因需求,B、C服务器需要从A某个同步某个目录到本地。
正式安装,官网下载rsync稳定版本,然后进行安装编译。
cd /usr/src ;wget http://rsync.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz
tar xzf rsync-3.0.7.tar.gz && cd rsync-3.0.7 && ./configure –
prefix=/usr/local/rsync &&make &&make install
安装完毕,配置rsync配置文件,默认/etc/不存在rsyncd.conf配置文件,需要手动创建,配置内容为如下:cat rsyncd.conf
#########[global] 全局配置
uid = nobody
gid = nobody
use chroot = no
max connections = 30
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[www]
read only = yes
path = /usr/local/webapps
comment = www
auth users =test
secrets file = /etc/rsync.pas
hosts allow = 192.168.0.11,192.168.0.12
[web]
read only = yes
path = /data/www/web
comment = web
auth users =test
secrets file = /etc/rsync.pas
hosts allow = 192.168.1.11,192.168.0.0/24
Rsync配置参数说明:
[www] #要同步的模块名
path = /usr/local/webapps #要同步的目录
comment = www #这个名名称无所谓,最后模块名一直)
read only = no # no客户端可上传文件,yes只读
write only = no # no客户端可下载文件,yes不能下载
list = yes #是否提供资源列表
auth users =test #登陆系统使用的用户名,没有默认为匿名。
hosts allow = 192.168.0.10,192.168.0.20 #本模块允许通过的IP地址
hosts deny = 192.168.1.4 #禁止主机IP
secrets file=/etc/rsync.pas #密码文件存放的位置
启动服务器端RSYNC主进程,/usr/local/rsync/bin/rsync --daemon
,监听端口TCP 873
设置rsync服务器端同步密钥:
vi /etc/rsync.pas
username:userpasswd (表示用户名:密码)
test:test999
保存完毕,chmod 600 /etc/rsync.pas
设置权限为宿主用户读写。
最后在客户端配置同步密钥和命令,如下设置即可同步。
vi /etc/rsync.pas 输入服务器端配置的密码:
test999
保存即可开始同步:执行如下语句
Rsync -aP --delete [email protected]::www /usr/local/webapps --password-file=/etc/rsync.pas
Rsync -aP --delete [email protected]::web /data/www/web --password-file=/etc/rsync.pas
注*/usr/local/webapps为客户端的目录,@前test是认证的用户名;IP后面www为rsync服务器端的模块名称。
Rsync 常用参数解析:
-a, ––archive 归档模式,表示以递归方式传输文件,并保持所有文件属性。
––exclude=PATTERN 指定排除一个不需要传输的文件匹配模式
––exclude-from=FILE 从 FILE 中读取排除规则
––include=PATTERN 指定需要传输的文件匹配模式
––delete 删除那些接收端还有而发送端已经不存在的文件
-P 等价于 ––partial ––progress
-v, ––verbose 详细输出模式
-q, ––quiet 精简输出模式
––rsyncpath=PROGRAM 指定远程服务器上的 rsync 命令所在路径
––password-file=FILE 从 FILE 中读取口令,以避免在终端上输入口令,
通常在 cron 中连接 rsync 服务器时使用
除了可以使用rsync密钥进行同步之外,还有一个比较简单的同步方法就是基于linux ssh来同步。具体方法如下:
rsync -aP --delete [email protected]:/data/www/webapps /data/www/webapps ,如果想每次同步不输入密码,需要做Linux主机之间免密码登录。
在企业日常web应用中,某些特殊的数据需要要求保持跟服务器端实时同步,那我们该如何来配置呢?如何来实现呢?这里可以采用rsync+inotify来实现需求。
Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。
Rsync安装完毕后,需要安装inotify文件检查软件。同时为了同步的时候不需要输入密码,这样可以使用ssh免密钥方式进行同步。
安装inotify-tools-3.14.tar.gz 软件,tar –xzf inotify-tools-3.14.tar.gz ;./configure ;make
;make install 即可。配置auto_inotify.sh同步脚本,内容如下:
#!/bin/sh
src=/data/webapps/www
des=/home/webapps/
ip=192.168.0.11
inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} | while read file
do
for i in $ip
do
/usr/local/rsync/bin/rsync -aP --delete $src root@$ip:$des
done
done
在服务器端后台启动该脚本,nohup sh auto_inotify.sh & ,在服务器端目录新建或者删除,客户端都会实时进行相关操作。
Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,Tomcat本身也是一个HTTP服务器,可以单独使用,apache是一个以C语言编写的HTTP服务器。Tomcat主要用来解析JSP语言。目前最新版本为8.0。
安装tomcat之前需要安装jdk (Java Development Kit) 是 Java 语言的软件开发工具包(SDK)),这里选择jdk-6u18-linux-x64-rpm.bin,bin文件安装跟sh文件方法一样,sh ./ jdk-6u18-linux-x64-rpm.bin,回车即可,默认安装到/usr/java/jdk1.6.0_18目录下。
配置java环境变量,vi /etc/profile 添加如下语句:
export JAVA_HOME=/usr/java/jdk1.6.0_18
export CLASSPATH= C L A S S P A T H : CLASSPATH: CLASSPATH:JAVA_HOME/lib: J A V A H O M E / j r e / l i b e x p o r t P A T H = JAVA_HOME/jre/lib export PATH= JAVAHOME/jre/libexportPATH=JAVA_HOME/bin: J A V A H O M E / j r e / b i n : JAVA_HOME/jre/bin: JAVAHOME/jre/bin:PATH:$HOMR/bin
source /etc/profile //使环境变量立刻生效。
java -version //查看java版本,显示版本为1.6.0_18,证明安装成功。
在官网下载tomcat相应版本,这里下载的版本为apache-tomcat-6.0.30.tar.gz,下载完后解压:
tar -xzf apache-tomcat-6.0.30.tar.gz ;mv apache-tomcat-6.0.30 /usr/local/tomcat即可。
启动tomcat,命令为:/usr/local/tomcat_test/bin/startup.sh
查看ps -ef |grep tomcat 进程及端口是否存在,通过页面访问可以看到tomcat默认测试页面:
这个画面是默认网站,怎么来创建一个自己的网站页面呢,定义自己的发布目录,方法如下:在server.xml配置文件末尾加入如下行:(附截图)
在/data/webapps/www目录下,创建自己的jsp代码,重启tomcat即可访问。
线上环境使用默认tomcat配置文件,性能很一般,为了满足大量用户的访问,需要对tomcat进行参数性能优化,具体优化的地方如下:
Linux内核的优化
服务器资源配置的优化
Tomcat参数优化
配置负载集群优化
这里着重讲解tomcat参数的优化:server.xml文件,关闭DNS查询、配置最大并发等参数。
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100
当然这些值都不是越大越好,需要根据实际情况来设定。可以基于测试的基础上来不断的调优分析。
"8080"
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443"
maxThreads="5000"
minSpareThreads="20"
acceptCount="1000"
disableUploadTimeout="true"
enableLookups="false"
URIEncoding="UTF-8" />
Catalina.sh JVM参数优化,添加如下内容:
CATALINA_OPTS="$CATALINA_OPTS –Xms4000M –Xmx4000M –Xmn1000M -XX:SurvivorRatio=4 -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=82 -DLOCALE=UTF-16LE -DRAMDISK=/ -DUSE_RAM_DISK=ture -DRAM_DISK=true"
配置多个tomcat实例,方法也很简单,只需要在服务器上cp多个tomcat,然后修改三个端口和发布目录即可,然后分别启动即可。
为了提升整个网站的性能,还需要在tomcat前面架设nginx web反向代理服务器,用以提高用户高速访问。
Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。
resin 普通版本和pro版本主要区别是 pro支持缓存和负载均衡。pro因为有强大的cache功能,独立作为web服务器处理静态页面性能都可以和apache有一比。但普通版本独立作为web服务器性能就要差一些。当然可以使用apache+resin的方案借助apache的缓存功能提高性能。
一般个人使用都使用开源免费版,如果想更高的性能,可以购买使用企业版resin,售后服务有保障。
wget http://www.caucho.com/download/resin-4.0.33.tar.gz
tar –xzvf resin-4.0.33.tar.gz
cd resin-4.0.33 &&./configure --prefix=/usr/local/resin
\--with-resin-log=/data/logs/resin/ --with-java-home=/usr/java/jdk1.6.0_18/
make &&make install
安装完毕后,修改/usr/local/resin/conf/resin.xml
配置文件发布目录,如图:
然后启动resin,/usr/local/resin/bin/resin.sh start
测试成功访问如下图(发布目录未修改之前resin默认测试页面):
Resin同tomcat一样,都需要优化JVM参数,resin的JVM参数配置在resin.xml里面,配置最大最小内存,会话保持时间及并发数等如下所示:
"*" port="8080"/>
<!-- SSL port configuration: -->
"*" port="8443">
-ssl self-signed-certificate-name="resin@localhost"/>
</http>
-arg>-Xms4000m</jvm-arg>
-arg>-Xmx4000m</jvm-arg>
-arg>-Xmn1000m</jvm-arg>
-arg>-XX:PermSize=128m</jvm-arg>
-arg>-XX:MaxPermSize=256m</jvm-arg>
-max>10000</thread-max>
-timeout>30s</socket-timeout>
-max>5000</keepalive-max>
-timeout>60s</keepalive-timeout>
-arg>-agentlib:resin</jvm-arg>
Resin参数优化同样包括最大内存、最小内存,年轻带,最大并发,会话超时时间等。根据实际的应用来调节不同的参数。
为了资源最大利用,单台服务器可以配置多个resin实例,配置resin多实例的方式跟tomcat大部分一致,但还有一些区别:
cd /usr/local/resin/conf
下,然后cp resin.xml resin1.xml ;cp resin.xml resin2.xml
修改两个配置文件如下图所示:
HTTP端口为8080 Resin1.xml 配置如下:
HTTP端口为8081 Resin2.xml 配置如下:
创建两个发布目录mkdir -p /data/webapps/{www1,www2}写入测试jsp文件即可。最后如下方法启动两个resin实例:
/usr/local/resin/bin/resin.sh -conf /usr/local/resin/conf/resin1.xml -server 1 start
/usr/local/resin/bin/resin.sh -conf /usr/local/resin/conf/resin2.xml -server 2 start
真实环境,需要调整jvm参数,需要在resin.xml里面配置,同时需要开启启动resin,只需要把上述脚本加入/etc/rc.local即可。
Nginx动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx处理静态页面,Tomcat、Resin出来动态页面。
动静分离从目前实现角度来讲大致分为两种,一种是纯粹的把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;另外一种方法就是动态跟静态文件混合在一起发布,通过nginx来分开。这样也是本次课程要讲解的,具体怎么来实现呢,如下图,通过location指定不同的后缀名实现不同的请求转发。
通过expires参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体Expires定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。
此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用Expires来缓存),我这里设置3d,表示在这3天之内访问这个URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码200。
如下为nginx.conf里面server 配置段,直接添加在nginx.conf里即可。
####www.wuguangke.cn
server
{
listen 80;
server_name www.wuguangke.cn;
index index.html index.htm;
#配置发布目录为/data/www/wugk
root /data/www/wugk;
location /
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tdt_wugk;
expires 3d;
}
#动态页面交给http://tdt_wugk,也即我们之前在nginx.conf定义的upstream tdt_wugk 均衡
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://tdt_wugk;
}
#配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /data/www/wugk;
#expires定义用户浏览器缓存的时间为3天,如果静态页面不常更新,可以设置更长,这样可以节省带宽和缓解服务器的压力
expires 3d;
}
#定义Nginx输出日志的路径
access_log /data/logs/nginx_wugk/access.log main;
error_log /data/logs/nginx_wugk/error.log crit;
}
真实环境网站程序包只有一个,需要把这个程序包在nginx前端放一份,同时需要在Tomcat、Resin后端也放置一份,如果服务器涉及数量很多,那每台服务器都需要更新,可以使用批量更新方法。
LNAMP(Linux+Nginx+Apache+Mysql+PHP)架构受到很多IT企业的青睐,取代了原来认为很好的LNMP(Linux+Nginx+Mysql+PHP)架构,那我们说LNAMP到底有什么优点呢,还得从Nginx和apache的优缺点说起。
Nginx处理静态文件能力很强,Apache处理动态文件很强而且很稳定,把二者综合在一块,性能提升很多倍。可能很多Linux SA在从事LNMP运维中,会发现PHP(FastCGI)模式会出现一些502错误的现象,这是因为Nginx+PHP(FastCGI)组合不稳定的原因造成的。
源码安装LNAMP之Nginx
yum install prce-devel –y ;cd /usr/src ;wget http://nginx.org/download/nginx-1.6.0.tar.gz ;cd nginx-1.6.0 ;./configure –prefix=/usr/local/nginx && make &&make install
源码安装LNAMP之Apache
yum install apr-devel apr-util-devel –y;
cd /usr/src ; wget http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.27.tar.gz ;tar xzf httpd-2.2.27.tar.gz ;cd httpd-2.2.27 ;./configure --prefix=/usr/local/apache --enable-so --enable-rewrite &&make &&make install
源码安装LNAMP之MySQL
cd /usr/src ;wget http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.63.tar.gz ;tar xzf mysql-5.1.63.tar.gz ;cd mysql-5.1.63 ;./configure --prefix=/usr/local/mysql --enable-assembler &&make &&make install
配置Mysql服务为系统服务:
cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
cp /usr/local/mysql/share/mysql/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --add mysqld
chkconfig --level 345 mysqld on
cd /usr/local/mysql
useradd mysql
chown -R mysql.mysql /usr/local/mysql
/usr/local/mysql/bin/mysql_install_db --user=mysql
chown -R mysql var
/usr/local/mysql/bin/mysqld_safe --user=mysql &
源码安装LNAMP之PHP
cd /usr/src ;wget http://mirrors.sohu.com/php/php-5.3.28.tar.bz2 ;tar jxf php-5.3.28.tar.bz2 ;cd php-5.3.28 ;./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php/etc --with-apxs2=/usr/local/apache/bin/apxs --with-mysql=/usr/local/mysql/
源码安装Apache+PHP整合
整合apache+php环境,修改httpd.conf配置文件,然后加入如下语句:
LoadModule php5_module modules/libphp5.so (默认已存在)
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html (把index.php加入index.html之前)
然后在/usr/local/apache/htdocs目录下创建index.php测试页面,执行如下命令:
cat >>/usr/local/apache/htdocs/index.php <();
?>
EOF
重新启动apache服务,通过IP访问界面如下图,即代表LAMP环境搭建成功。
源码安装DISCUZ论坛
下载discuz源码包文件,然后解压:
cd /usr/src ;wget http://download.comsenz.com/DiscuzX/3.1/Discuz_X3.1_SC_UTF8.zip
解压discuz程序包:unzip Discuz_X3.1_SC_UTF8.zip -d /usr/local/apache/htdocs/
重命名程序文件:cd /usr/local/apache/htdocs/ ;mv upload/* .
赋予discuz目录完全访问权限:cd /usr/local/apache/htdocs/ ;chmod 777 -R data/ uc_server/ config/ uc_client/
然后访问IP安装discuz论坛,如下图,选择“我同意”
进入如下界面,数据库安装,如果不存在则需要新建数据库并授权。
数据库创建及授权命令如下:
create database discuz charset=utf8;
grant all on discuz.* to root@'localhost' identified by "123456";
点击下一步,直至安装完成,进入等待已久的论坛画面:
自此LAMP环境整合并搭建成功,那如何使用Nginx来整合LAMP呢?
源码安装Nginx+LAMP整合
先修改apache访问端口为8080,Nginx端口为80。
然后修改nginx配置文件: vi /usr/local/nginx/conf/nginx.conf,server配置段内容如下:
(定义upstream均衡模块,配置动静分离,动态转发至apache,静态文件直接本地响应)
upstream app_lamp {
server 127.0.0.1:8080 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 80;
server_name localhost;
location / {
root /usr/local/apache/htdocs;
index index.php index.html index.htm;
}
location ~ .*\.(php|jsp|cgi)?$
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://app_lamp;
}
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$
{
root /usr/local/apache/htdocs;
expires 3d;
}
}
测试,访问nginx ip+port如下图所示:
查看系统启动的端口及进程如下图:
自此,LNAMP全部整合完毕,接下来就是对系统内核、各个服务、架构进行优化,同样优化是一项长期的任务。
我们每天打开的网站,他是如何来解析,并且我们怎么能得到网站的内容反馈的界面呢?那什么是DNS呢(DNS(Domain Name service,域名服务,主要用于因特网上作为域名和IP地址相互映射)那今天我们将来学习DNS服务器的构建,DNS服务可以算是Linux服务中比较难的一个了,尤其是配置文件书写,少一个字符都有可能造成错误。
那什么是DNS呢?简单的说就是完成域名到IP的解析过程。简洁的域名能让人们更方便记忆,不需要记那么长的IP访问某一个网站。
DNS解析过程到底是怎样的呢?
第一步:客户机访问某个网站,请求域名解析,首先查找本地HOSTS文件,如果有对应域名、IP记录,直接返回给客户机。如果没有则将该请求发送给本地的域名服务器:
第二步:本地DNS服务器能够解析客户端发来的请求,服务器直接将答案返回给客户机。
第三步:本地DNS服务器不能解析客户端发来的请求,分为两种解析方法
1、采用递归解析:本地DNS服务器向根域名服务器发出请求,根域名服务器对本地域名服务的请求进行解析,得到记录再给本地DNS服务器,本地DNS服务器将记录缓存,并将记录返给客户机。
2、采用迭代解析:本地DNS服务器向根域名服务器发出请求,根域名服务器返回给本地域名服务器一个能够解析请求的根的下一级域名服务器的地址,本地域名服务器再向根返回的IP地址发出请求,最终得到域名解析记录。
如上只是简单介绍了一下DNS相关知识,言归正传,那接下来我们正式来搭建一下DNS服务器。
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
#add named by wugk
zone "wugk.com" IN {
type master;
file "wugk.com.zone";
allow-update { none; };
};
zone "188.92.182.in-addr.arpa" IN {
type master;
file "wugk.com.arpa";
allow-update { none; };
};
@ IN NS ns.wugk.com.
163 IN PTR mail.wugk.com.
163 IN PTR ns.wugk.com.
163 IN PTR www.wugk.com.
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司, 目前属于Oracle公司,MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
对应目前主流的LAMP架构来说,Mysql更是得到各位IT运维、DBA的青睐,目前mysql已被orcacle收购,不过好消息是原来mysql创始人已独立出来自己重新开发了一个MariaDB,而且使用的人数越来越多。而且MariaDB兼容mysql所有的功能和相关参数。
Mysql常用的两大引擎有MyISAM和innoDB,那他们有什么明显的区别呢,什么场合使用什么引擎呢?
MyISAM类型的表强调的是性能,其执行数 度比InnoDB类型更快,但不提供事务支持,如果执行大量的SELECT操作,MyISAM是更好的选择,支持表锁。
InnoDB提供事务支持事务,外部键等高级 数据库功能,执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表,支持行锁。
随着访问量的不断增加,Mysql数据库压力不断增加,需要对mysql进行优化和架构改造,可以使用高可用、主从复制、读写分离来、拆分库、拆分表进行优化。下面我们来学习MySQL主从复制高可用如何来实现。
MySQL数据库主从复制原理
Mysql主从同步其实是一个异步复制的过程,要实现复制首先需要在master上开启bin-log日志功能,整个过程需要开启3个线程,分别是Master开启IO线程,slave开启IO线程和SQL线程。
a) 在从服务器执行slave start,从服务器上IO线程会通过授权的用户连接上master,并请求master从指定的文件和位置之后发送bin-log日志内容。
b) Master服务器接收到来自slave服务器的IO线程的请求后,master服务器上的IO线程根据slave服务器发送的指定bin-log日志之后的内容,然后返回给slave端的IO线程。(返回的信息中除了bin-log日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)
c) Slave的IO线程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个bin-log的哪 个位置开始往后的日志内容,请发给我”;
d) Slave的Sql线程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
MySQL数据库主从配置
环境准备:192.168.33.10为master主服务器,192.168.33.11为slave从服务器。
在主和从服务器都安装mysql相关软件,命令如下:
yum install -y mysql mysql-devel mysql-server mysql-libs
安装完毕后,在Master修改vi /etc/my.cnf内容为如下:
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id = 1
auto_increment_offset=1
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
replicate-do-db =all
创建/data/mysql数据目录,mkdir –p /data/mysql ;chown –R mysqld:mysqld /data/mysql
启动mysql即可,/etc/init.d/mysqld restart
然后修改slave Mysql数据库my.cnf配置文件内容如下:
[mysqld]
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
#Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id = 2
auto_increment_offset=2
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
master-host =192.168.33.10
master-user=tongbu
master-pass=123456
master-port =3306
master-connect-retry=60
replicate-do-db =all
在Master数据库服务器上设置权限,执行如下命令:
grant replication slave on *.* to 'tongbu'@'%' identified by '123456';
在Master 数据库执行如下命令:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000006 | 98 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后在slave服务器指定master IP和同步的pos点:
change master to
master_host='192.168.33.10',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000006',master_log_pos=98;
在slave启动slave start,并执行show slave status\G查看Mysql主从状态:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes两个状态为YES,代表slave已经启动两个线程,一个为IO线程,一个为SQL线程。
然后在Master服务器创建一个数据库和表,命令如下:
然后去slave服务器查看是否有mysql_ab_test数据库和相应t0的表,如果存在则代表Mysql主从同步搭建成功:
同样还可以测试在master服务器插入两条数据,在slave查看insert数据是否已同步:
128 master上执行如下图:
129 slave上执行如下图,在master插入的数据已经同步到slave上:
自此Mysql主从搭建完毕,现在有一个问题,如果master服务器down机了,如何快速恢复服务呢?
可以通过两种方法:
第一种方法,如果程序连接的是master的IP,直接在slave服务器上添加master的IP即可。这个手动去操作,而且需要花费时间比较长,可能还会出现误操作的情况,不推荐。
第二种方法,可以使用keepalived、heartbeat作为HA检测软件,检查MySQL服务是否正常,不正常则自动切换到slave上,推荐使用。
MySQL+keepalived高可用配置
继上一章节MySQL主从配置完毕后,接着配置keepalived服务,主要用于Mysql故障自动切换。那说到keepalived,keepalived到底是什么呢?
keepalived是一个类似于layer3, 4 & 7交换机制的软件,也就是我们平时说的第3层、第4层和第7层交换。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器、Mysql服务器宕机,或工作出现故障,Keepalived将检测到后,会将有故障的web服务器或者Mysql服务器从系统中剔除,当服务器工作正常后Keepalived自动将web、Mysql服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的WEB和Mysql服务器。
Keepalived安装配置:
tar zxf keepalived-1.2.1.tar.gz
cd keepalived-1.2.1 &&./configure --with-kernel-dir=/usr/src/kernels/2.6.18-164.el5-i686 &&make && make install
DIR=/usr/local/ ;cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived
cp $DIR/sbin/keepalived /usr/sbin/
修改Master 服务器上keepalived.conf配置如下,vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
wgkgood@139.com
}
notification_email_from wgkgood@139.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 151
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 2222
}
virtual_ipaddress {
192.168.33.100
}
}
virtual_server 192.168.33.100 3306 {
delay_loop 6
lb_algo wrr
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.10 3306 {
weight 100
notify_down /data/sh/mysql.sh
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 3306
}
}
}
Mysql 从服务器配置keepalived.conf跟master一样,只需要把Realserver IP修改成real_server 192.168.33.11 ;优先级从100改成90即可。
在master、slave数据库上创建/data/sh/mysql.sh脚本,内容为:
pkill keepalived
然后分别重启两台数据库上keepalived服务即可。最后测试停止master Mysql服务,是否会自动切换到Backup上。
关于Mysql集群高可用就在此告一段落,当然除了keepalived高可用之外,Mysql优化还可以进行读写分离、Mysql+DRBD、拆分表等等优化,有兴趣的童鞋可以继续深入研究。
LVS简介及工作原理
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。
LVS 简单工作原理:用户请求LVS VIP,LVS根据转发方式和算法,将请求转发给后端服务器,后端服务器接受到请求,返回给用户。对于用户来说,看不到WEB后端具体的应用。
LVS转发方式有三种,分别是NAT、DR、TUN模式,常用算法:RR、LC、WRR、WLC模式等(RR为轮询模式,LC为最少连接模式)
LVS NAT原理:用户请求LVS到达director,director将请求的报文的目标地址改成后端的realserver地址,同时将报文的目标端口也改成后端选定的realserver相应端口,最后将报文发送到realserver,realserver将数据返给director,director再把数据发送给用户。(两次请求都经过director,所以访问大的话,director会成为瓶颈)
LVS DR原理:用户请求LVS到达director,director将请求的报文的目标MAC地址改成后端的realserver MAC地址,目标IP为VIP(不变),
源IP为用户IP地址(保持不变),然后Director将报文发送到realserver,realserver检测到目标为自己本地IP,如果在同一个网段,然后将请求直接返给用户。如果用户跟realserver不在一个网段,则通过网关返回用户。(此种转发效率最高)
LVS TUN原理:跟LVS DR类似,也是改变封装MAC地址,多了一层隧道加密。实施环境复杂,比LVS DR模式效率略低。
LVS环境安装配置
下载LVS所需软件ipvsadm-1.2.4.tar.gz软件,编译安装:
wget -c http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
ln -s /usr/src/kernels/2.6.* /usr/src/linux //IPVS模块编译进内核里,需要做软连接
tar xzvf ipvsadm-1.24.tar.gz &&cd ipvsadm-1.24 && make && make install
LVS安装完毕之后,需要进行配置,配置的步骤有两步,第一步为定义端口服务,第二步为添加realserver后端服务。
ipvsadm -A -t 192.168.33.188:80 -s rr
ipvsadm -a -t 192.168.33.188:80 -r 192.168.33.12 -m -w 2
ipvsadm -a -t 192.168.33.188:80 -r 192.168.33.13 -m -w 2
参数说明:
-A 增加一台虚拟服务器地址。
-t 虚拟服务器提供的是tcp服务。
-s 使用的调度算法。
-a 在虚拟服务器中增加一台后端真实服务器。
-r 指定真实服务器地址。
-m 设置当前转发方式为NAT模式;-g为直接路由模式;-i 模式为隧道模式。
-w 后端真实服务器的权重。
查看LVS转发列表命令为:ipvsadm –Ln
我们会发现,如果这台LVS发生突发情况,down机了,那后端所有的应用程序都访问不了。如何避免这种问题呢,这里需要用到故障切换,也就是如果有一台备用的LVS就好了,主down了,自动切换到从,怎么实现这个需求,接下来讲解的keepalived软件就是专门用来做故障检测及切换的。
Keepalived基于三层检测(IP层,TCP层,及应用层),主要用于检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived检测到并将有故障的web服务器从系统中剔除;
当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
需要注意一点,如果使用了keepalived.conf配置,就不需要再执行ipvs –A命令去添加均衡的realserver命令了,所有的配置都会在keepalived.conf里面,一个配置文件搞定所有,即只需要安装ipvs模块。
Keepalived安装配置
官方下载keepalived相应稳定版本:
cd /usr/src ;wget -c http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
tar -xzvf keepalived-1.1.15.tar.gz &&cd keepalived-1.1.15 && ./configure && make && make install
安装完毕,配置keepalived服务为系统服务。
DIR=/usr/local/
cp $DIR/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/ && cp $DIR/etc/sysconfig/keepalived /etc/sysconfig/ && mkdir -p /etc/keepalived && cp $DIR/sbin/keepalived /usr/sbin/
在MASTER上/etc/keepalived/目录创建keepalived.conf配置文件,并写入如下内容:
! Configuration File for keepalived
global_defs {
notification_email {
wgkgood@163.com
}
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 100
advert_int 5
nopreempt
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.33.188
}
}
virtual_server 192.168.33.188 80 {
delay_loop 6
lb_algo wrr
lb_kind DR
#persistence_timeout 60
protocol TCP
real_server 192.168.33.12 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.33.13 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
如上配置文件,红色标记的地方需要注意,state状态主服务器设置MASTER,从设置为BACKUP,优先级备机设置比MASTER小,例如设置90,使用TCP端口检测。
在LVS BACKUP服务器写入如下配置,需要注意的是客户端的配置要修改优先级及状态:
! Configuration Filefor keepalived
global_defs {
notification_email {
wgkgood@163.com
}
notification_email_from wgkgood@163.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#VIP1
vrrp_instance VI_1 {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 90
advert_int 5
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.33.11
}
}
#REAL_SERVER_1
virtual_server 192.168.33.11 80 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 60
protocol TCP
real_server 192.168.33.130 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
#REAL_SERVER_2
real_server 192.168.33.131 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
如上设置,LVS 主备配置完毕,接下来需要在realserver配置LVS VIP,为什么要在realserver绑定VIP呢?
客户端访问director的VIP,director接收请求,将通过相应的算法将请求转发给相应的realserver。在转发的过程中,会修改请求包的目的mac地址,目的ip地址不变。
Realserver接收请求,并直接响应客户端。这时便出现一个问题,director此时与realserver位于同一个网络中,当director直接将请求转发给realserver时,realserver检测到该请求包的目的ip是vip而并非自己,便会丢弃,而不会响应。为了解决这个问题,所以需要在所有Realserver上都配上VIP。
为什么一定要配置在lo接口上呢?
在realserver上的lo口配置VIP,这样限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突。
客户端启动Realserver.sh脚本内容:
#!/bin/sh
#LVS Client Server
VIP=192.168.33.188
case $1 in
start)
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
exit 0
;;
stop)
ifconfig lo:0 down
route del $VIP >/dev/null 2>&1
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped OK"
exit 1
;;
*)
echo "Usage: $0 {start|stop}"
;;
esac
LVS网站故障排查经验:
如果发现主网站无法访问,首先第一步ping网站域名是否能ping通,如果域名无法访问,试着使用IP能不能访问,如果IP能访问,首先排查到域名解析问题。
如果IP也无法访问,登录LVS服务器,使用命令ipvsadm –Ln 查看当前连接状态和查看/var/log/messages日志信息,可以在LVS上访问realserver ip,进行排查。
如果LVS服务正常,后端realserver服务异常,然后查看nginx日志信息,是否有大量恶意访问,临时重启看是否能访问。
如果有恶意ip访问,找出恶意ip,经确认可以关闭后,使用iptables防火墙临时关闭即可。
LVS+keepalived+Nginx+Apache+PHP+MySQL+Memcached+Redis
随着网站访问人数越来越多,对体验的要求也越来越高,网站承受的并发和压力也越来越大,所以需要对网站和架构进行优化,优化的策略有很多,系统内核、程序、配置均衡、加入缓存等,目前主流缓存服务器主要有squid、varnish、nginx_cache,那今天我们来讨论使用老牌Squid对架构进行缓存优化。
Squid cache(简称为Squid)是一个流行的自由软件,它符合GNU通用公共许可证。Squid作为网页服务器的前置cache服务器,可以代理用户向web服务器请求数据并进行缓存,也可以用在局域网中,使局域网用户通过代理上网。Squid主要设计用于在Linux一类系统运行。
简单的来说就是:用户请求www网站,经过squid,squid检查本地硬盘目录有没有这个文件的缓存;如果没有,squid则去后端真实web服务器获取该页面,返回给用户,同时在自己本地缓存一份,如果另外一个用户再访问同样请求页面时,squid直接从本地返回。
squid 有 ufs, aufs, coss, diskd, null 五种存储机制,其中 ufs, aufs, diskd 都是在文件系统上面保存很多小文件, coss 是 squid 自己实现了一个简单的文件系统,可以使用一个大文件或者一个磁盘设备来存储。null 则是给不想要磁盘缓存的情况准备的,coss 看起来好像很不错, 但是以前试验并不足够稳定,因此并不推荐使用。
对于一些老系统,使用 aufs 或者 diskd 是比较好的选择,如果系统的线程库比较好(如Linux,Solaris),那么使用 aufs。
正式安装squid
安装squid也非常简单,可以用源码安装,也可以使用rpm、yum安装,这里使用yum安装,根据实际经验使用,squid 2.6系列的squid比较稳定,可以考虑采用。
CentOS5.8上yum安装squid 2.6方法:
yum install -y squid
其他系统源码安装squid 2.6.24版本:squid-2.6.STABLE24.tar.bz2
tar -jxf squid-2.6.STABLE24.tar.bz2 ;cd squid-2.6.STABLE24
./configrue --prefix=/usr/local/squid/ --enable-storeio=ufs,diskd ;make ;make install
源码安装的配置文件内容如下:
http_port 80 accel vhost vport
cache_peer 192.168.33.12 parent 80 0 originserver name=wugk1
cache_peer 192.168.33.13 parent 80 0 originserver name=wugk2
cache_peer_domain wugk1 www.wugk1.com
cache_peer_domain wugk2 www.wugk2.com
visible_hostname localhost
forwarded_for off
via off
cache_vary on
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16
acl all src 0.0.0.0/0
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access allow all
acl PURGE method PURGE
http_access allow PURGE localhost
http_access deny PURGE
cache_mem 1000 MB
maximum_object_size 8 MB
maximum_object_size_in_memory 256 KB
hierarchy_stoplist cgi-bin ?
coredump_dir /usr/local/squid/var/cache
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \.(jpg|png|gif|mp3|xml|html|htm|css|js) 1440 50% 2880 ignore-reload
refresh_pattern . 0 20% 4320
Yum安装squid.conf配置文件,内容如下:
http_port 80 accel vhost vport
cache_peer 192.168.33.130 parent 80 0 originserver name=wugk1
cache_peer 192.168.33.131 parent 80 0 originserver name=wugk2
cache_peer_domain wugk1 www.wugk1.com
cache_peer_domain wugk2 www.wugk2.com
visible_hostname localhost
forwarded_for off
via off
cache_vary on
#acl config
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 8080 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl all src 0.0.0.0/0
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
http_access allow all
acl PURGE method PURGE
http_access allow PURGE localhost
http_access deny PURGE
#squid config 2014-03-25
cache_dir aufs /data/cache1 10240 16 256
cache_mem 4000 MB
maximum_object_size 8 MB
maximum_object_size_in_memory 256 KB
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern \.(jpg|png|gif|mp3|xml|html|htm|css|js) 1440 50% 2880 ignore-reload
refresh_pattern . 0 20% 4320
Squid参数详解
#vhost和vport表示支持虚拟主机和虚拟端口,如果再加上transparent表示支持透明代理
http_port 80 accel vhost vport
#cache_peer表示如果本机缓存中找不到客户端请求的数据,则与后端主机联系,以parent类型进行联系;
使用HTTP协议进行联系,联系端口是80,orginserver表示此服务器是源服务器,name表示别名。
cache_peer 192.168.33.10 parent 80 0 originserver name=wugk1
cache_peer 192.168.33.11 parent 80 0 originserver name=wugk2
#设置别名所对应的域名,如果cache_peer中使用域名而不是IP的话;
那么cache_peer_domain中一定要用相同的域名,否则无法访问。
cache_peer_domain wugk1 www.wugk1.com
cache_peer_domain wugk2 www.wugk2.com
#设置缓存服务器名称
visible_hostname localhost
forwarded_for off
via off
cache_vary on
#acl config
acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80 8080 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl all src 0.0.0.0/0
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localnet
http_access allow localhost
##设置访问控制,允许所有客户端访问上面设置的两个网站
http_access allow all
#支持purge方式清除缓存
acl PURGE method PURGE
http_access allow PURGE localhost
http_access deny PURGE
#squid config 2014-03-25
#设置缓存文件夹的路径和参数,缓存机制为aufs,10240表示10G,目录下面分为16级,每级有256个目录
cache_dir aufs /data/cache1 10240 16 256
#设置缓存内存大小,最大内存为4g
cache_mem 4000 MB
#设置硬盘中可缓存的最大文件大小
maximum_object_size 8 MB
#设置内存中可缓存的最大文件大小
maximum_object_size_in_memory 256 KB
hierarchy_stoplist cgi-bin ?
#当squid突然挂掉的时候,或者突然出现什么故障的时候,将squid在内存中的资料写到硬盘中
coredump_dir /var/spool/squid
#
#refresh_pattern用于确定缓存的类型,缓存过期时间,及百分比。
#如果希望内容缓存cache后不删除,直到被主动用purge清除,可以加ignore-reload选项
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|?) 0 0% 0
refresh_pattern .(jpg|png|gif|mp3|xml|html|htm|css|js) 1440 50% 2880 ignore-reload
refresh_pattern . 0 20% 4320
Squid常用命令使用:
Squidclient可以用来清理squid缓存,查看squid状态等功能。
使用方法:
*取得squid运行状态信息: squidclient -p 80 mgr:info
*取得squid内存使用情况: squidclient -p 80 mgr:mem
*取得squid已经缓存的列表: squidclient -p 80 mgr:objects
*取得squid的磁盘使用情况: squidclient -p 80 mgr:diskd
*强制更新某个url:
squidclient -p 80 -m PURGE http://www.wugk1.com/static/image/common/nv_a.png
查看缓存命中率:squidclient -p 80 mgr:info |egrep “(Request Hit Ratios|Byte Hit Ratios)”
vi /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
为了防止失控的进程破坏系统的性能,Unix和Linux跟踪进程使用的大部分资源,允许用户和系统管理员使用对进程的资源限制,设置的限制有两种: 硬限制和软限制:
hard硬限制是可以在任何时候任何进程中设置 但硬限制只能由超级用户修改。
soft软限制是内核实际执行的限制,任何进程都可以将软限制设置为任意小于等于对进程限制的硬限制的值,(noproc)最大线程数和(nofile)文件数。
2) 内核参数的优化
vi /etc/sysctl.conf
net.ipv4.tcp_max_tw_buckets = 6000
timewait的数量,默认是180000。
net.ipv4.ip_local_port_range = 1024 65000
允许系统打开的端口范围。
net.ipv4.tcp_tw_recycle = 1
启用timewait快速回收。
net.ipv4.tcp_tw_reuse = 1
开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。
net.ipv4.tcp_syncookies = 1
开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。
net.core.somaxconn = 262144
web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。
net.core.netdev_max_backlog = 262144
每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
net.ipv4.tcp_max_orphans = 262144
系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。
net.ipv4.tcp_max_syn_backlog = 262144
记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
net.ipv4.tcp_timestamps = 0
时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。
net.ipv4.tcp_synack_retries = 1
为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。
net.ipv4.tcp_syn_retries = 1
在内核放弃建立连接之前发送SYN包的数量。
net.ipv4.tcp_fin_timeout = 1
如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 30
当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。
完整的内核优化脚本:
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65530
net.ipv4.icmp_echo_ignore_all = 1
Sep 23 04:45:54 localhost kernel: possible SYN flooding on port 80. Sending cookies.
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
如上错误是由于net.ipv4.tcp_max_tw_buckets设置过小导致,如果内核有如上错误,我们需要增加net.ipv4.tcp_max_tw_buckets的值。
Too many open files错误:
如果后台报错,大量的too many open files错误,一般主要是JAVA应用出现这类错误比较多。我们需要设置内核打开文件最大数。
ulimit -SHn 51200 临时生效,如果想永久生效,需要写入到系统内核里面:
vi /etc/security/limits.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
然后exit退出,重新登录即生效,也可以写在/etc/profile文件里。
Nginx 是目前主流的WEB服务器发布软件,不仅可以作为强大的web服务器,也可以作为一个反向代理服务器,而且nginx还可以按照调度规则实现动静分离,可以按照轮询、ip_hash、URL哈希、权重等多种方式对后端服务器做负载均衡,同时还支持后端服务器的健康检查。
upstream tdt_wugk {
server 10.10.141.32:8080 weight=1 max_fails=2 fail_timeout=30s;
server 10.10.141.32:8081 weight=1 max_fails=2 fail_timeout=30s;
}
1、upstream的 fail_timeout和max_fails,用来判断负载均衡upstream中的某个server是否失效。在fail_timeout的时间内,nignx与upstream中某个server的连接尝试失败了max_fails次,则nginx会认为该server已经失效。在接下来的 fail_timeout时间内,nginx不再将请求分发给失效的server。
2、fail_timeout默认为10秒,max_fails默认为1。是指在10秒内nginx与后端server连接失败一次,如果在10秒内nginx与后端的连接失败达到一次,nginx认为这个server已失效,在接下来的10秒内,nginx将不会分发请求到这台后端。
3、如果max_fails=0,即关闭后端服务器健康检查,如果权重一样,那么每次请求都会有机会发到后端不可用的服务器。另外,fail_timeout设置的时间对响应时间没影响,这个响应时间是用接下来的proxy_connect_timeout和proxy_read_timeout来控制。
4、proxy_connect_timeout
nginx与后端连接的超时时间,单位为秒,默认为60秒。我们在nginx错误日志里面看到的(110: Connection timed out),就是指nginx与后端连接已经超时。
5、proxy_read_timeout
建立连接后,nginx等候读取后端服务器响应的时间,默认为60秒。在一些比较繁忙的后端,比如线程数经常达到峰值了的tomcat,这个值注意不要设得太低,虽然线程数已经用光,但请求已经进入待队列之中。
6、proxy_send_timeout
nginx转发请求到后端的超时时间,默认为60秒,在这段时间内nginx没将请求数据发到后端将关闭连接。这个在网站有比较多像表单(post)之类的需要留意一下.
7、keepalive_timout时间值意味着:一个http产生的tcp连接在传送完最后一个响应后,还需要等待keepalive_timeout秒后,才开始关闭这个连接。
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults,noatime 0 0
对于从事Linux岗位的童鞋们,最关注的问题莫过于这个行业到底怎么样,能不能挣钱?我以后能做什么?
对于第一个问题:
随着互联网飞速的发展,用户对网站体验各方面都要求很高,所以作为网络底层承载的linux系统来说,得到大批量的应用,可以说大中型互联网公司Linux在服务器领域已经占到7-80%。未来Linux会在各行各业得到普遍的应用。
从Linux运维领域来说,可以努力学习的方向有:
附件:1
linux常用命令
1.Linux管理文件和目录的命令
命令 功能 命令 功能
pwd 显示当前目录 ls 查看目录下的内容
cd 进入所在目录 cat 显示文件的内容
grep 在文件中查找某字符 cp 复制文件
touch 创建文件 rm 删除文件
rmdir 删除目录 vi 编辑文件
1.1 pwd命令
该命令的英文解释为print working directory(打印工作目录)。输入pwd命令,Linux会输出当前目录。
1.2 cd命令
cd命令用来改变所在目录。
cd / 转到根目录中
cd ~ 转到/home/user用户目录下
cd /usr 转到根目录下的usr目录中-------------绝对路径
cd test 转到当前目录下的test子目录中-------相对路径
1.3 ls命令
ls命令用来查看目录的内容。
选项 含义
-a a列举目录中的全部文件,包括隐藏文件
-l l列举目录中的细节,包括权限、所有者、组群、大小、创建日期、文件是否是链接等
-f f列举的文件显示文件类型
-r r逆向,从后向前地列举目录中内容
-R R递归,该选项递归地列举当前目录下所有子目录内的内容
-s s大小,按文件大小排序
-h h以人类可读的方式显示文件的大小,如用K、M、G作单位
1.4 cat命令
cat命令可以用来合并文件,也可以用来在屏幕上显示整个文件的内容。
cat snow.txt 该命令显示文件snow.txt的内容,ctrl+D退出cat。
1.5 grep命令
grep命令的最大功能是在一堆文件中查找一个特定的字符串。
grep money test.txt
以上命令在test.txt中查找money这个字符串,grep查找是区分大小写的。
1.6 touch命令
touch命令用来创建新文件,他可以创建一个空白的文件,可以在其中添加文本和数据。
touch newfile 该命令创建一个名为newfile的空白文件。
1.7 cp命令
cp命令用来拷贝文件,要复制文件,输入命令:
cp
cp t.txt Document/t 该命令将把文件t.txt复制到Document目录下,并命名为t。
选项 含义
-I 互动:如果文件将覆盖目标中的文件,他会提示确认
-r 递归:这个选项会复制整个目录树、子目录以及其他
-v 详细:显示文件的复制进度
1.8 mv命令
mv命令用来移动文件。
选项 说明
-I 互动:如果选择的文件会覆盖目标中的文件,他会提示确认
-f 强制:它会超越互动模式,不提示地移动文件,属于很危险的选项
-v 详细:显示文件的移动进度
mv t.txt Document 把文件t.txt 移动到目录Document中。
1.9 rm命令
rm命令用来删除文件。
选项 说明
-I 互动:提示确认删除
-f 强制:代替互动模式,不提示确认删除
-v 详细:显示文件的删除进度
-r 递归:将删除某个目录以及其中所有的文件和子目录
rm t.txt 该命令删除文件t.txt
1.10 rmdir命令
rmdir命令用来删除目录。
1.11 vi 编辑文件(补充)
vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi Improved),与vi编辑器完全兼容,而且实现了很多增强功能。
进入vi的命令
vi filename :打开或新建文件,并将光标置于第一行首
vi n filename :打开文件,并将光标置于第n行首
vi filename :打开文件,并将光标置于一行首
vi /pattern filename:打开文件,并将光标置于第一个与pattern匹配的串处
vi -r filename :在上次正用vi编辑时发生系统崩溃,恢复filename
vi filename…filename :打开多个文件,依次进行编辑
屏幕翻滚类命令
Ctrl u:向文件首翻半屏
Ctrl d:向文件尾翻半屏
Ctrl f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:将第n行滚至屏幕顶部,不指定n时将当前行滚至屏幕顶部.
插入文本类命令
i :在光标前
I :在当前行首
a:光标后
A:在当前行尾
o:在当前行之下新开一行
O:在当前行之上新开一行
r:替换当前字符
R:替换当前字符及其后的字符,直至按ESC键
s:从当前光标位置处开始,以输入的文本替代指定数目的字符
保存命令
按ESC键 跳到命令模式,然后:
:w 保存文件但不退出vi
:w file 将修改另外保存到file中,不退出vi
:w! 强制保存,不推出vi
:wq 保存文件并退出vi
:wq! 强制保存文件,并退出vi
:q 不保存文件,退出vi
:q! 不保存文件,强制退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑之后,回车,ok!
2.有关磁盘空间的命令
命令 功能
Mount 挂载文件系统
Umount 卸载已挂载上的文件系统
Df 检查各个硬盘分区和已挂上来的文件系统的磁盘空间
Du 显示文件目录和大小
Fsck 主要是检查和修复Linux文件系统
2.1 mount命令
mount命令的功能是挂载文件系统,可以挂载硬盘、光盘、软盘,也可以挂载NFS网络文件系统。这个命令的标准用法如下:
mount –t 设备类型存放目录
mount IP地址:/所提供的目录存放目录
选项 说明
(无) 不加任何参数,直接输入命令可以显示已挂载的文件系统和目录
-a 挂上/etc/fstab下的全部文件系统
-t 制定所挂上来的文件系统的名称,所有系统支持的文件系统,这个信息可以在/proc/filesystems这个文件里看到
-n 挂上文件系统,但是不把文件系统的数据写入/etc/mtlab这个文件
-w 将文件系统设为可读写
-r 挂上来的文件系统设为只读
在目录/mnt下,挂上iso9660文件系统。输入命令:
mount –t iso9660 /dev/hdb /cdrom
2.2 umount命令
umount命令的功能是卸载已挂上的文件系统,在关闭系统前应该把所有挂载上的文件系统卸载。这个命令和mount命令是相对的。用法:
umount 已挂上的目录或设备卸载已挂上的/cdrom目录,输入命令:
umount /cdrom卸载已挂上的某个分区,输入命令:
umount /dev/hdb1
2.3 df命令
df命令用来检查硬盘分区和已挂在的文件系统的磁盘空间,也就是说,检查硬盘的使用量。标准用法如下:
df [-选项]
选项 功能
-a 把全部的文件系统和各分区的硬盘使用情形列出来,包括0区块的,例如/proc这个文件系统
-I 列出I-nodes的使用量
-k 把各分区的大小和挂上来的文件分区的大小用k表示
-t 列出某一文件系统的所有分区磁盘空间使用量
-x 列出不是某一文件系统的所有分区磁盘空间使用量,和-t选项相反
-T 列出每个分区所属文件系统的名称例如,要列出全部文件系统和各分区的磁盘使用情况,输入命令:df -a
2.4 du命令
du命令的功能是用于显示文件目录或大小。标准用法:
du [-选项]
选项 含义
-a 显示全部目录及其次目录下的每个文件所占的磁盘空间
-b 显示目录和文件的大小,以B为单位
-c 最后再加上一个总计
-h 以KB、MB、GB为单位,提高信息可读性
-s 只列出各文件大小的总和
-x 只计算属于同一文件系统的文件
2.5 fsck命令
fsck命令的功能是检查和修复Linux文件系统,这个命令最好在没有人或是没有分区挂上来时使用,其实每次开机系统都会做一次检查,看是否有坏轨或数据流失的现象。用法:
fsck (-选项) 分区名称
选项 功能
-a 自动修复文件系统,不询问任何问题,比较危险
-A 依照/etc/fstab配置文件的内容,检查该文件内所列全部文件系统。若没有附加参数"-P”,则会先检查/目录的文件系统,而不会同时检查所有文件系统
-R 采取互动方式,在修复时询问问题,让用户确认并决定处理方式
-S 依次检查作业而不是同时执行。当依次指定多个文件系统且采用互动的方式进行检查时,请使用此参数以便顺序执行,否则fsck可能会同时询问数个问题,让人不知所措
-V 显示命令执行的过程
-T 指定要检查的文件系统的类型
-N 不是真正执行指令,仅列出实际执行时会进行的动作
3.文件备份和压缩命令
在Linux中,常用的文件压缩工具有gzip、bzip2、zip。bzip2是最理想的压缩工具,它提供了最大限度的压缩。zip兼容性好,Windows也支持。
命令 功能
bzip2/bunzip2 扩展名为bz2的压缩/解压缩工具
gzip/gunzip 扩展名为gz的压缩/解压缩工具
zip/unzip 扩展名为zip的压缩/解压缩工具
tar 创建备份和归档
3.1 bzip2命令
要使用bzip2来压缩文件,在shell提示下输入命令:
bzip2 filename文件即会被压缩,并被保存为filename.bz2。
要解压缩文件,输入命令:bunzip2 filename.bz2
filename.bz2会被删除,而以filename代替。
bzip2 filename.bz2 file1 file2 file3/usr/work/school
上面的命令把file1、file2、file3以及/usr/work/school目录中的内容压缩起来放入filename.bz2。
3.2 gzip命令
要使用gzip来压缩文件,输入命令:gzip filename文件即会被压缩,并被保存为filename.gz。
要解压缩文件,输入命令:gunzip filename.gz,filename.gz会被删除,而以filename代替。
gzip -r filename.gz file1 file2 file3/usr/work/school
上面的命令把file1、file2、file3以及/usr/work/school目录中的内容压缩起来放入filename.gz。
3.3 zip命令
zip命令的使用方法同gzip。
3.4 tar命令
tar命令最早是用来做磁带备份的,但是由于硬盘容量越来越大,因此现在主要用这个命令来备份所有的文件。tar这个命令把大量的文件和目录打包成一个文件。
选项 功能
-c 创建一个新归档
-f 当与-c选项一起使用时,创建的tar文件使用该选项指定的文件名;当与-x选项一起使用时,则解除该选项指定的归档
-t 显示包括在tar文件中的文件列表
-v 显示文件的归档进度
-x 从归档中抽取文件
-z 使用gzip压缩tar文件
-j 使用bzip2压缩tar文件
要创建一个tar文件,输入命令:
tar –cvf filename.tar directory/file/home/mine
上面的命令将directory/file、/home/mine放入归档文件中。
要列出tar文件的内容,输入命令:tar –tvf filename.tar
要抽取tar文件的命令,输入命令:tar –xvf filename.tar
这个命令不会删除tar文件,但会把解除归档的内容复制到当前工作目录下,并保留归档文件所使用的任何目录结构。
请记住,tar默认不压缩文件。要创建一个使用tar和bzip2来归档压缩的文件,使用-j选项:
tar –cjvf filename.tbz file
如果使用bunzip2命令解压filename.tbz文件,则filename.tbz会被删除,以filename.tar代替。
要扩展并解除归档bzip tar文件,输入命令:tar –xjvf filename.tbz
要创建一个用tar和gzip归档并压缩的文件,使用-z选项:tar –czvf filename.tgz file
如果使用gunzip命令解压filename.tgz文件,则filename.tgz会被删除,以filename.tar代替。
4.有关关机和查看系统信息的命令
命令 说明
Shutdown 正常关机
Reboot 重启计算机
Ps 查看目前程序执行的情况
Top 查看目前程序执行的情景和内存使用的情况
Kill 终止一个进程
Date 更改或查看目前日期
Cal 显示月历及年历
4.1 shutdown命令
要使用这个命令必须保证是根用户,否则使用su命令改变为根用户。命令格式如下:
shutdown –(选项)
选项 功能
-k 不是真正的关机,只是发出警告命令
-r 关机后重启(这个用的最多)
-t 在规定的时间内关机
加入要在2min内关机,输入命令:shutdown –t 2
如果是关机后重启,输入命令:shutdown –r
4.2 reboot命令
这个命令也是一个关机命令,只有输入,不加任何参数,系统会以最快的速度关机,且不将内存或缓冲区里的东西写回硬盘。
选项 功能
-d 不把记录写到/var/log/wtmp档案里(-n这个参数包含了-d)
-f 强迫重开机,不呼叫shutdown这个指令
-n 在重开机前不做将记忆体资料写回硬盘
-w 并不会真的重开机,只是把记录写到/var/log/wtmp档案里
4.3 ps命令
ps命令用来查看在计算机系统中有哪些程序正在执行,及其执行的情况。这是一个相当强大的命令,可以用它来找出所有的process id和名称。另外,ps命令也可以用来列出所有程序占用内存的情况。用法如下:
ps –(选项)
选项 功能
-l 用长格式列出
-u 列出使用者的名称和使用时间
-m 列出内存分布的情况
-r 只列出正在执行的前台程序,不列出其他信息
-x 列出所有程序,包括那些没有终端机的程序
4.4 top命令
top命令可以查看目前程序的执行情景和内存使用。它和ps类似,不过,它会几秒钟更新一次系统状态,方便追踪。要离开这个程序,按Ctrl+C键就可以了。
4.5 kill命令
kill命令用来终止一个正在执行中的进程。如果一个程序执行过程中失败了,可以把这个程序终止,避免留在内存中占用系统资源。不过,它的实际意义是送一个信号给这个正在执行的程序,叫它自杀。可以送很多信号给这些程序,也可以让他们受到信号后做很多事情。标准用法:kill –(选项) pid
在执行kill命令前。可以先用ps命令查一下某宕掉程序的pid,然后使用kill除去某个程序。例如,终止pid为90的程序:kill 90
选项 功能
-l 列出所有可用的信号名称
-p 印出pid并不发送信号
-signal 其中可用的讯号有HUP (1), KILL (9), TERM (15), 分别代表著重跑, 砍掉, 结束
将 pid 为 323 的行程砍掉 (kill) :kill -9 323
将 pid 为 456 的行程重跑 (restart) :kill -HUP 456
4.6 date命令
date命令用来显示、设定和修改现在的时间和日期。标准用法:
date –(选项) 显示时间格式(以+号开头,后加格式)
date 设定时间格式
选项 功能
-u 使用格林尼治时间
-r 最后一次修改文件的时间
-s 设置时间
常用的几种时间格式如下表所示:
格式 说明
%a 星期几的简称,例如一、二、三
%A 星期几的全名,例如星期一、星期二
%D 日期(mm/dd/yy格式)
%T 显示时间格式,24小时制(hh:mm:ss)
%x 显示日期的格式(mm/dd/yy)
%y 年的最后两个数字
%Y 年(如2007、2008)
%r 时间(hh:mm:ss上午或下午)
%p 显示上午或下午
如果输入命令:date “+%x,%r”
系统返回如下信息:2010年3月26日,下午 18时06分49秒
4.7 cal命令
cal命令有两种功能:显示月历以及年历。
直接输入cal命令则系统会显示目前月份的月历。
若要显示一整年的年历,可以在cal命令后加4位数的公元年份。例如要显示2008年的年历,必须输入:cal 2008,若输入 cal 08 ,则最显示公元8年的年历。若只需要查看某一年份中某一月份的月历,可以输入:cal 月份公元年份。例如输入:"cal 12 2004”。
5.管理使用者和设立权限的命令
命令 说明
Chmod 用来改变权限
Useradd 用来增加用户
Su 用来修改用户
5.1 chmod命令
chmod命令用来改变许可权限。读取、写入和执行是许可权限中的三个主要设置。因为用户在他们的账号被创建时就被编入一个组群,所以还可以指定那些组群可以读取、写入或执行某一文件。其中:
r—文件可以被读取
w—文件可以被写入
x—文件可以被执行,如果文件是程序的话可以使用带有-l的ls命令来仔细查看一个文件的许多细节。
chmod命令用来设定文件的权限。标准用法:chmod 文件的使用者(u,g,o,a)增减(+,-,=)权限名称(r,w,x) 文件
命令 说明
u 拥有文件的用户
r 读取权
还可以用数字表示权限:4——读取,2——写入,1——执行。下面的两个命令等价:
chmod 751 filename
chmod u+rwx,g=rx,0=x filename
5.2 su命令
su命令用来修改用户。这个命令非常重要,它可以让一个普通的使用者拥有超级用户或其他使用者的权限。不过,这个命令必须具有超级用户或其他使用者的口令才能成为超级用户或其他使用者。如果要离开,可以输入exit。标准用法:
su 用户名 (如果没有输入用户名则预设为root)
举例说明,假设当前用户user01,想要转变为user02,则输入命令:su user02
系统返回:password:此时,输入user02的指令,就会变为user02。
5.3 useradd命令
useradd命令用来增加用户,只有根用户才能增加用户。如果没有登录为根用户,输入su,再输入根口令即可。
要增加用户,输入命令:useradd 用户名。
然后,根据提示为新用户输入一个口令即可。
6.线上查询的命令
命令 功能
man 查询和解释一个命令的使用方法,以及这个命令的说明事项
locate 定位文件和目录
whatis 寻找某个命令的含义
6.1 man命令
man命令用来查询和解释一个命令的使用方法和这个命令的注意事项。这个查询查询在每个Linux上都有。通常,使用者只要输入命令man和这个命令的名称shell就会列出一份完整的说明。标准用法:
man 命令的名称
要查询ls命令的说明书页,输入命令:man ls
要翻阅说明书页,可以使用Page Up和Page Down键,或使用空格键向后翻一页,使用b向前翻。要退出说明书页,输入命令q。要在说明书页中搜索关键字,输入命令/和要搜索的关键字或短语,然后按Enter键即可。所有出现在说明书页中的关键字都会被突出显示,允许快速地阅读上下文中的关键字。
6.2 locate命令
locate命令的主要功能是定位文件和目录。有时候,只知道某一文件或目录存在,却不知道在哪儿,就可以用locate来定位文件和目录。使用locate命令,将会看到每一个包括搜索田间的文件和目录。例如,如果想要搜索带有test的这个词的文件,输入命令:locate test
locate命令使用数据库来定位带有test这个词的文件或目录。
6.3 whatis命令
whatis命令用来查询某个命令的含义。用法简单,也不需要什么参数,直接在whatis命令后加上所要查询的命令就可以了,但是却很实用。
要查询mv命令的含义,输入命令:
whatis mv
7.文件阅读的命令
命令 功能
head 查看文件的开头部分
tail 查看文件结尾的10行
lessless 是一个分页工具,它允许一页一页地(或一个屏幕一个屏幕地)查看信息
moremore 是一个分页工具,它允许一页一页地(或一个屏幕一个屏幕地)查看信息
7.1 head命令
head命令可以用来查看文件的开头部分。此命令的格式是:head 文件名
默认设置,它只查看文件的前10行。但可以通过指定一个数字选项来改变要显示的行数,命令如下:head –20 文件名
这个命令将会查看文件的前20行。
7.2 tail命令
tail命令和head命令恰恰相反。使用tail命令,可以查看文件结尾的10行。这有助于查看日志文件的最后10行来阅读重要的系统信息。还可以使用tail观察日志文件更新的过程。使用-f选项,tail会自动实时地把打开文件中的新信息显示到屏幕上。例如,要活跃地观察/var/log/messages,以根用户身份在shell下输入以下命令:tail –f /var/log/messages
7.3 less命令
less命令与more命令相似。
7.4 more命令
more和less的主要区别是,less允许使用箭头来前后移动,而more使用空格键和b键来前后移动。使用ls和more来列举/etc目录下的内容:ls –al /etc | more
要使用more在文本文件中搜索关键字,按/键并输入命令搜索条目:/foo使用空格键来先前翻阅页码。按q键退出。
more命令标准格式为:more [选项] [fileNames]
选项 含义
-num 一次显示的行数
-d 提示使用者,在画面下方显示如果使用者按错键,则会显示[Press space to continue, q to quit.]
-l 取消遇见特殊字元^L(送纸字元)时会暂停的功能
-f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
-p 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容
-c 跟-p相似,不同的是先显示内容再清除其他旧资料
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
-u 不显示下引号(根据环境变数TERM指定的terminal而有所不同)
+/ 在每个档案显示前搜寻该字串(pattern),然后从该字串之后开始显示
+num 从第num行开始显示
fileNames 欲显示内容的档案,可为复数个数
例如:more -s testfile 逐页显示testfile之档案内容,如有连续两行以上空白行则以一行空白行显示。
more +20 testfile 从第20行开始显示testfile之档案内容。
8.网络操作命令
命令 功能
ftp 传送文件
telnet 远端登陆
bye 结束连线并结束程序
rlogin 远端登入
ping 检测主机
netstat 显示网络状态
8.1 ftp命令
ftp 命令用来传输文件,非常重要。如果在网络上看到一个很重要的文件,就可以用这个命令把那个文件传到自己的机器上来。
标准用法:ftp (-选项) 主机名称或IP地址
选项 含义
-D 详细显示命令的执行过程,便于排错和分析程序的执行情况
-I 关闭互动模式,不询问任何问题
-G 关闭本地主机文件名称支持特殊字符的扩充特征
-N 不适用自动登录。
FTP在启动时,会尝试自动登录远端系统,它会从用户的转述目录中读取.netrc文件的内容,以便自行登录。若该文件不存在,FTP会放弃自动登录,并询问用户的账号名称
-V显示命令的执行过程举例说明,用ftp登录ftp.dark.com主机,输入命令:ftp ftp.dark.com
注意:用户必须有相应的存取权限,否则不能从远程系统中获得文件或向远程系统中传输文件。为了使用ftp来传输文件,用户必须知道远程计算机上的合法用户名和口令。
8.2 bye命令
在ftp模式下,输入bye即可中断目前的连线作业,并结束ftp的执行,没有选项。
8.3 ping命令
执行ping命令,它会使用ICMP传输协议,发出要求回应的信息,若远程主机的网络没有什么问题,就会回应信息,因而得知该主机运作正常。
标准用法:ping (-选项) 主机名称或IP地址
选项 含义
C 次数 设置完成要求回应的次数。ping命令会反复发出信息,直到达到设定的次数为止
D 使用Socket的SO_DEBUG功能
F 大量而且快速地送网络封包给一台机器,看它的回应。一般不到几秒钟,送出去的封包会超过两千个
I秒数 指定收发信息的间隔时间,单位为s,预置位1s。与参数f不兼容
S bytes 设置数据包的大小。预设置为56B,加上8B,ICMP头文件,共64B
R 忽略网关,直接将数据保送到远程主机上。如果该主机并非局域网的一份子,就会传回误信息
Q 不显示命令的执行过程,只显示结果
V 详细显示命令的执行过程,包括非回应信息和其它信息
举例说明,检测des.bllod.net主机网络功能是否正常,送出去要去信息需完成5次回应,每次间隔10s,数据包的大小为512B,输入命令:ping –c 5 –i 10 –s 504 –t 64 des.blood.net
8.4 telnet命令
telnet命令的主要功能是进行远程登录。该命令允许用户在使用telnet协议的远程计算机之间进行通信,用户可以通过网络在远程计算机上登录,就像登录到本地机上执行命令一样。为了通过telnet登录计算机,必须知道远程计算机上的合法用户名和口令。telnet只为普通终端提供终端仿真,而不支持X Window等图形环境。
标准用法:telnet 主机名或IP
例如登录IP地址为140.114.63.12的计算机,输入命令:telnet 140.114.63.12
一旦telnet成功连接到远程系统上,就显示登录信息,并提示用户输入用户名和口令。如果用户名和口令正确,就能成功登录并在远程系统上工作。用户结束了远程会话后,一定要确保使用logout命令退出远程系统。然后telnet报告远程会话被关闭,并返回到用户本地机的shell提示符下。
8.5 rlogin命令
rlogin也是用来远程登录的。它的英文含义是remote login。该命令与telnet命令很相似,允许用户启动远程系统上的交互命令会话。用法:rlogin (-选项) host
选项 含义
8 允许输入8位字符数据
e 为rlogin会话设置转义字符,默认的转义字符是“~”,用户可以指定一个文字字符或一个/nnn形式的八进制数
E 停止任何转义字符。当与-8选项一起使用时,它提供一个完全透明的链接
L 用户名称 指定要登入远端主机的用户名称
L 使用litout模式进行远端登入操作
例如,要登入别人的计算机。输入命令:rlogin –l inin 140.114.125.24
8.6 netstat命令
netstat命令的主要功能是了解Linux系统的网络情况。假设没有指定任何参数给netstat命令,则效果和指定-F参数相同。
用法:netstat (-选项)
选项 说明
a 显示所有连线中的Socket
F 显示FIB
a 全部列出,包括正在等待的程序
c 持续列出网络状态
I 显示网络界面信息
n 使用网络ip地址代替名称
o 显示计时器
r 显示网络路径表
t 显示TCP协议的连接情形
u 显示UDP协议的连接情形
v 显示版本信息
w 显示RAW传输协议的连接情形
which
语法which command
说明:依序从path环境变量所列的目录中找出command的位置,并显示完整路径的名称。在找到第一个符合条件的程序文件时,就立刻停止搜索,省略其余未搜索目录。
范例,找出ls命令的程序文件的位置:which ls
系统输出:/usr/bin/ls
whereis
语法whereis [option] name
说明:找出特定程序的可执行文件、源代码文件以及manpage的路径。你所提供的name会被先除去前置的路径以及任何.ext形式的扩展名。
whereis 只会在标准的Linux目录中进行搜索。
常用选项
b 只搜索可执行文件。
m 只搜索manpage。
s 只搜索源代码文件。
B directory 更改或限定搜索可执行的文件的目录。
M directory 更改或限定搜索manpage的目录。
S directory 更改或限定搜索源代码文件的目录。
find
语法find paths expression [action]
说明:以paths为搜索起点逐层往下找出每一个符合expression条件的文件,并对该文件执行action所代表的动作。expression是搜索条件,它由一个代表匹配项目的选项以及一个代表匹配模式的参数构成。
action是处理动作,它有一个代表“处理方式”的选项以及一个操作参数构成。若不指定action,则默认动作是显示出文件名。
常用的搜索条件
-name pattern
-path pattern
-lname pattern
找出名称、路径名称或符号链接的目标匹配pattern模式的文件。pattern可以包含shell的文件名通配符,路径是相对于搜索起点的。
常见处理动作
-print显示出文件的相对路径(相对于搜索起点)。
-exec cmd /;执行指定的shell命令。若cmd含有任何shell特殊字符,则他们之前都必须加上/符号,以免shell立刻执行他们。在cmd里,可以用”{}”符号(包括双引号)表示find所找出的文件。
locate
语法locate patterns
说明:第一次执行locate时,它会建立一个索引数据库,当往后再次执行时,它便从索引数据库中迅速找出文件的位置。locate很适合用来反复搜索很少变动的目录树,但是对于刚改名的旧文件以及新建的文件,locate就找不到了,除非重建数据库。
updatedb
语法 updatedb [option]
说明:更新slocate的索引数据库。
9.其他命令
命令 功能
echo 显示一字串
passwd 修改密码
clear 清除显示器
lpr 打印
lpq 查看在打印队列中等待的作业
lprm 取消打印队列中的作业
9.1 echo命令
echo命令用来在显示器上输出一段文字,这个命令常用来输出一些提示信息,因此这个命令的意义在于输出一些文字。它的用法也很简单:
echo –(参数) 字串 (可以用"”,也可以不用,显示略有区别)
参数n代表输出文字后不换行,如果不加参数会自动换行。
输入命令:echo “welcome to use Linux”
输出结果为:welcome to use Linux
如果不加"”,则输出结果为:welcome to use Linux
它们的区别在于后一个输出,每两个输出之间只隔一个空格,这是因为echo把这些输出看做字串的缘故。
9.2 clear命令
clear命令的主要功能是清除显示器,这个命令很简单,只要输入clear即可。
9.3 passwd命令
passwd命令用来修改用户的密码。
在shell下输入passwd
然后,根据提示输入旧密码和新密码即可。
9.4 lpr命令
lpr命令的功能是把指定的文件发送到打印队列中。例如,lpr foo.txt 会打印 foo.txt 文件。
标准用法:lpr filename
要查看在打印队列中等待的作业,在命令行中输入命令lpq。系统返回如下信息:active root 389 foo.txt
在这个例子中,389是作业号码。还可以取消打印队列中的作业,格式是:lprm 作业号码
输入命令:lprm 389
这样就去修了 foo.txt 打印作业。