So Tired !_! 逆水行舟, 不进则退!

15Sep/17

nginx自定义header的坑

Posted by Nick Xu

原来是对header name的字符做了限制,默认 underscores_in_headers 为off,表示如果header name中包含下划线,则忽略掉。
恰好我自定义的header中都是用的下划线。
处理办法:
1:配置中http部分 增加underscores_in_headers on; 配置
2:用减号-替代下划线符号_,避免这种变态问题。nginx默认忽略掉下划线可能有些原因。
Tagged as: , Comments Off
13Sep/17

ubuntu部署Falcon+

Posted by Nick Xu

https://book.open-falcon.org/zh_0_2/quick_install/index.html

主要参考以上官方链接

apt-get install redis-server mysql-server-5.5 git

cd /tmp/ && git clone https://github.com/open-falcon/falcon-plus.git

cd /tmp/falcon-plus/scripts/mysql/db_schema/

mysql -h 127.0.0.1 -u root -p < 1_uic-db-schema.sql

mysql -h 127.0.0.1 -u root -p < 2_portal-db-schema.sql

mysql -h 127.0.0.1 -u root -p < 3_dashboard-db-schema.sql

mysql -h 127.0.0.1 -u root -p < 4_graph-db-schema.sql

mysql -h 127.0.0.1 -u root -p < 5_alarms-db-schema.sql

cd /tmp

wget https://github.com/open-falcon/falcon-plus/releases/download/v0.2.1/open-falcon-v0.2.1.tar.gz

export FALCON_HOME=/home/service

export WORKSPACE=$FALCON_HOME/open-falcon

mkdir -p $WORKSPACE

tar -xzvf open-falcon-v0.2.1.tar.gz -C $WORKSPACE

cd $WORKSPACE

grep -Ilr 3306  ./ | xargs -n1 -- sed -i 's/root:/real_user:real_password/g'

./open-falcon start

./open-falcon check

git clone https://github.com/open-falcon/dashboard.git

apt-get install python-virtualenv python-dev python-flask python-jinja2 python-werkzeug python-dateutil python-mysqldb gunicorn libmysqld-dev libmysqlclient-dev

cd $WORKSPACE/dashboard

virtualenv ./env

./env/bin/pip install -r pip_requirements.txt

vi rrd/config.py

vi pip_requirements.txt

4Sep/17

mysqlimport 导入文件

Posted by Nick Xu

1).mysqlimport的语法介绍:

mysqlimport位于mysql/bin目录中,是mysql的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数 以及大量的选项可供选择。这个工具把一个文本文件(text file)导入到你指定的数据库和表中。比方说我们要从文件Customers.txt中把数据导入到数据库Meet_A_Geek中的表 Custermers中:

mysqlimport Meet_A_Geek Customers.txt

注意:这里Customers.txt是我们要导入数据的文本文件,而Meet_A_Geek是我们要操作的数据库,数据库中的表名是Customers,这里文本文件的数据格式必须与Customers表中的记录格式一致,否则mysqlimport命令将会出错。

其中表的名字是导入文件的第一个句号(.)前面文件字符串,另外一个例子:

mysqlimport Meet_A_Geek Cus.to.mers.txt

那么我们将把文件中的内容导入到数据库Meet_A_Geek 中的Cus表中。
上面的例子中,都只用到两个参数,并没有用到更多的选项,下面介绍mysqlimport的选项

2).mysqlimport的常用选项介绍:

选项                    功能
-d or --delete      新数据导入数据表中之前删除数据数据表中的所有信息
-f or --force       不管是否遇到错误,mysqlimport将强制继续插入数据
-i or --ignore       mysqlimport跳过或者忽略那些有相同唯一
关键字的行, 导入文件中的数据将被忽略。
-l or -lock-tables  数据被插入之前锁住表,这样就防止了,
你在更新数据库时,用户的查询和更新受到影响。
-r or -replace        这个选项与-i选项的作用相反;此选项将替代
表中有相同唯一关键字的记录。
--fields-enclosed- by= char
指定文本文件中数据的记录时以什么括起的, 很多情况下
数据以双引号括起。 默认的情况下数据是没有被字符括起的。
--fields-terminated- by=char
指定各个数据的值之间的分隔符,在句号分隔的文件中,
分隔符是句号。您可以用此选项指定数据之间的分隔符。
默认的分隔符是跳格符(Tab)
--lines-terminated- by=str
此选项指定文本文件中行与行之间数据的分隔字符串
或者字符。 默认的情况下mysqlimport以newline为行分隔符。
您可以选择用一个字符串来替代一个单个的字符:
一个新行或者一个回车。
mysqlimport命令常用的选项还有-v 显示版本(version), -p 提示输入密码(password)等。

 

3).例子:导入一个以逗号为分隔符的文件

文件中行的记录格式是这样的:
"1", "ORD89876", "1 Dozen Roses", "19991226"
我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中,

我们使用这个命令:

bin/mysqlimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt
这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。

第一部分,bin/mysqlimport ,告诉操作系统你要运行的命令是mysql/bin目录下的mysqlimport,选项p是要求输入密码,这样就要求你在改动数据库之前输入密码,操作 起来会更安全。 我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的,需要用文件中的数 据去更新,因而就用r这个选项,替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我们更新表的时候对表进行查询 或者更改的操作。

mysql导入数据命令之(二):使用批处理和LOAD

批处理导入文件,从sql文件导入数据到数据库中 ,批处理是一种非交互式运行mysql程序的方法,如同您在mysql中使用的命令一样,你仍然将使用这些命令。

为了实现批处理,您重定向一个文件到mysql程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在mysql中输入的命令相同的文本。

比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):
USE Meet_A_Geek;
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton");
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons");

注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。 上面的USE命令选择数据库,INSERT命令插入数据。

下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是mysqld进程(或者说服务,Windows NT下面称为”服务“,unix下面为”进程“)已经在运行。

然后运行下面的命令:
bin/mysql –p < /home/mark/New_Data.sql

接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。

命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库:

现 在您可能会问自己,"究竟为什么我要输入所有的这些SQL语句到文件中,然后通过程序运行它们呢?” 这样看起来好像需要大量的工作。很好,你这样想很可能就对了。但是假如你有从所有这些命令中产生的log记录呢?现在这样就很棒,嗯,大多数数据库都会自 动产生数据库中的事件记录的log。而大部分log都包含有用过的原始的SQL命令。因此,如果您不能从您现在的数据库中导出数据到新的mysql数据库 中使用,那么您可以使用log和mysql的批处理特性,来快速且方便地导入您地数据。当然,这样就省去了打字的麻烦。

LOAD DATA INFILE

这 是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与mysqlimport非常相似,但这个方法可以在mysql命令行中使用。也就 是说您可以在所有使用API的程序中使用这个命令。使用这种方法,您就可以在应用程序中导入您想要导入的数据。 使用这个命令之前,mysqld进程(服务)必须已经在运行。

启动mysql命令行:
bin/mysql –p

按提示输入密码,成功进入mysql命令行之后,输入下面的命令:
USE Meet_A_Geek;
LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders;

简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令:
LOAD DATA LOCAL INFILE "C:/MyDocs/SQL.txt" INTO TABLE Orders;

上 面的LOCAL参数表示文件是本地的文件,服务器是您所登陆的服务器。 这样就省去了使用ftp来上传文件到服务器,MySQL替你完成了. 您也可以设置插入语句的优先级,如果您要把它标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把插入数 据。可以使用如下的命令:
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders;

您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法:
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders;
上面的句子看起来有点笨拙,但却把关键字放在了让您的剖析器可以理解的地方。

下面的一对选项描述了文件的记录格式,这些选项也是在mysqlimport工具中可以用的。他们在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
TERMINATED BY character
ENCLOSED BY character
ESCAPED BY character

这些关键字与它们的参数跟mysqlimport中的用法是一样的. The TERMINATED BY 描述字段的分隔符,默认情况下是tab字符(/t)
ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。
ESCAPED BY 描述的转义字符。默认的是反些杠(backslash:/ ).

下面仍然使用前面的mysqlimport命令的例子,用LOAD DATA INFILE语句把同样的文件导入到数据库中:
LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ',' ENCLOSED BY '"';

LOAD DATA INFILE语句中有一个mysqlimport工具中没有特点:

LOAD DATA INFILE 可以按指定的列把文件导入到数据库中。 当我们要把数据的一部分内容导入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些栏目(列/字 段/field)到MySQL数据库中,以适应一些额外的需要。

这个时候,我们的Access数据库中的数据仍然是可用的,但是因为 这些数据的栏目(field)与MySQL中的不再匹配,因此而无法再使用mysqlimport工具。尽管如此,我们仍然可以使用LOAD DATA INFILE,下面的例子显示了如何向指定的栏目(field)中导入数据:
LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID);

如您所见,我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果您遗漏了其中任何一个,MySQL将会提醒您^_^

4Sep/17

MongoDB 数据导出mongoexport(可导出为txt或csv)

Posted by Nick Xu

1、概述

mongoexport命令行用于数据的导出,默认导出的文件格式为JSON格式。当然也可以指定特定的文件格式。

2、语法

  1. C:\mongo\bin>mongoexport -help
  2. options:
  3.   --help                  produce help message
  4.   -v [ --verbose ]        be more verbose (include multiple times for more
  5.                           verbosity e.g. -vvvvv)
  6.   -h [ --host ] arg       mongo host to connect to ( <set name>/s1,s2 for sets)
  7.   --port arg              server port. Can also use --host hostname:port
  8.   --ipv6                  enable IPv6 support (disabled by default)
  9.   -u [ --username ] arg   username
  10.   -p [ --password ] arg   password
  11.   --dbpath arg            directly access mongod database files in the given
  12.                           path, instead of connecting to a mongod  server -
  13.                           needs to lock the data directory, so cannot be used
  14.                           if a mongod is currently accessing the same path
  15.   --directoryperdb        if dbpath specified, each db is in a separate
  16.                           directory
  17.   -d [ --db ] arg         database to use
  18.   -c [ --collection ] arg collection to use (some commands)
  19.   -f [ --fields ] arg     comma separated list of field names e.g. -f name,age
  20.   --fieldFile arg         file with fields names - 1 per line
  21.   -q [ --query ] arg      query filter, as a JSON string
  22.   --csv                   export to csv instead of json
  23.   -o [ --out ] arg        output file; if not specified, stdout is used
  24.   --jsonArray             output to a json array rather than one object per
  25.                           Line

说明:

-h:数据库宿主机的IP

-u:数据库用户名

-p:数据库密码

-d:数据库名字

-c:集合的名字

-f:导出的列名

-q:导出数据的过滤条件

--csv:导出格式为csv

3、示例

现有如下数据:

现在进行全部导出操作,默认导出的是JSON格式的数据:

上述命令行:从test数据库中导出集合为emp的数据,保存文件到emp.dat中。

查看:

下面是导出csv格式的命令:

查看:

实战示例:

1、将集合中account和balance字段导出为txt格式

mongoexport -h 127.0.0.1 --port 27017 --username username  --password password  --collection accounts -f account,balance --out /usr/local/bak/db/1.txt --db dbname

2、将集合中account和balance字段导出为csv格式

mongoexport -h 127.0.0.1 --port 27017 --username username --csv --password password  --collection accounts -f account,balance --out /usr/local/bak/db/1.csv --db dbname

Tagged as: , Comments Off
31Aug/17

峰值QPS/QPS/PV/UV/服务器数量/并发数/吐吞量/响应时间计算公式

Posted by Nick Xu

QPS:
每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力。
QPS = req/sec = 请求数/秒
QPS统计方式 [一般使用 http_load 进行统计]
QPS = 总请求数 / ( 进程总数 * 请求时间 )
QPS: 单个进程每秒请求服务器的成功次数
峰值QPS:
原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间
公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS)
PV:
访问量即Page View, 即页面浏览量或点击量,用户每次刷新即被计算一次
单台服务器每天PV计算
公式1:每天总PV = QPS * 3600 * 6
公式2:每天总PV = QPS * 3600 * 8
UV:
独立访客即Unique Visitor,访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次
服务器数量:
机器:峰值时间每秒QPS / 单台机器的QPS = 需要的机器
机器:ceil( 每天总PV / 单台服务器每天总PV )
并发数:
并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量
吐吞量:
吞吐量是指系统在单位时间内处理请求的数量
响应时间(RT):
响应时间是指系统对请求作出响应的时间

例子:
每天300w PV 的在单台机器上,这台机器需要多少QPS?
答:( 3000000 * 0.8 ) / (86400 * 0.2 ) = 139 (QPS)
如果一台机器的QPS是58,需要几台机器来支持?
答:139 / 58 = 3

Tagged as: Comments Off
1Aug/17

Shadowsocks-go一键安装脚本

Posted by Nick Xu

本脚本适用环境:
系统支持:CentOS,Debian,Ubuntu
内存要求:≥64M
日期:2017 年 07 月 22 日

关于本脚本:
一键安装 Go 版的 shadowsocks 最新版本 1.2.1。与 Python 版不同的是,其客户端程序能使用多个服务端配置,本脚本安装的是服务端程序。
友情提示:如果你有问题,请先参考这篇《Shadowsocks Troubleshooting》后再问。

默认配置:
服务器端口:自己设定(如不设定,默认为 8989)
密码:自己设定(如不设定,默认为 teddysun.com)
加密方式:自己设定(如不设定,默认为 aes-256-cfb)

Shadowsocks for Windows 客户端下载:
https://github.com/shadowsocks/shadowsocks-windows/releases

使用方法:
使用root用户登录,运行以下命令:

wget --no-check-certificate -O shadowsocks-go.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh
chmod +x shadowsocks-go.sh
./shadowsocks-go.sh 2>&1 | tee shadowsocks-go.log

安装完成后,脚本提示如下:

Congratulations, Shadowsocks-go server install completed!
Your Server IP        :your_server_ip
Your Server Port      :your_server_port
Your Password         :your_password
Your Encryption Method:your_encryption_method

Welcome to visit:https://teddysun.com/392.html
Enjoy it!

卸载方法:
使用 root 用户登录,运行以下命令:

./shadowsocks-go.sh uninstall

其他事项:
客户端配置的参考链接:https://teddysun.com/339.html

安装完成后即已后台启动 Shadowsocks-go ,运行:

/etc/init.d/shadowsocks status

可以查看 Shadowsocks-go 进程是否已经启动。
本脚本安装完成后,已将 shadowsocks-go 加入开机自启动。

使用命令:
启动:/etc/init.d/shadowsocks start
停止:/etc/init.d/shadowsocks stop
重启:/etc/init.d/shadowsocks restart
状态:/etc/init.d/shadowsocks status

多用户多端口配置文件示例:
配置文件路径:/etc/shadowsocks/config.json

{
    "port_password":{
         "8989":"password0",
         "9001":"password1",
         "9002":"password2",
         "9003":"password3",
         "9004":"password4"
    },
    "method":"your_encryption_method",
    "timeout":600
}

官方版本的示例 ,详见这里

更多版本 Shadowsocks 服务端一键安装脚本:
ShadowsocksR 版一键安装脚本(CentOS,Debian,Ubuntu)
Shadowsocks Python 版一键安装脚本(CentOS,Debian,Ubuntu)
CentOS 下 shadowsocks-libev 一键安装脚本
Debian 下 shadowsocks-libev 一键安装脚本

更新日志:

2017 年 07 月 22 日:
新增:安装时可选 9 种加密方式的其中之一。如下所示:

aes-256-cfb
aes-192-cfb
aes-128-cfb
aes-256-ctr
aes-192-ctr
aes-128-ctr
chacha20-ietf
chacha20
rc4-md5

2017 年 02 月 18 日:
基于 Github 最新代码,使用最新的 go 1.8 自主编译 x86 和 x86_64 二进制文件。

2017 年 02 月 13 日:
升级 Shadowsocks-go 版到版本 1.2.1(基于 Github 最新代码,用 go 1.7.5 自主编译完成的 x86 和 x86_64 二进制文件)。

2017 年 01 月 27 日:
更新 Shadowsocks-go 到版本 1.2.1(仅适用于 x86_64 系统,x86 系统仍是 1.1.5)。

2016 年 05 月 12 日:
新增在 CentOS 7 下的防火墙规则设置。

2016 年 05 月 04 日:
更新 Shadowsocks-go 到版本 1.1.5。

2015 年 08 月 01 日:
新增自定义服务器端口功能(如不设定,默认为 8989)。

2015 年 05 月 11 日:
更新 Shadowsocks-go 到版本 1.1.4。

2015 年 03 月 09 日:
新增支持在 Debian,Ubuntu 下安装。

2015 年 01 月 08 日:
修改了启动脚本 /etc/init.d/shadowsocks ,按照 CentOS 的 chkconfig 标准语法修改了一下(原来使用的是作者 Github 上自带的)。去掉了以 nobody 用户启动 shadowsocks 的方式,改为直接以当前登录用户直接启动(一般是 root 用户)。开机自启动,以及修改端口号提示无权限的问题已经解决。

参考链接:
https://github.com/shadowsocks/shadowsocks-go

转载请注明:秋水逸冰 » Shadowsocks-go一键安装脚本

24Jul/17

关闭redis的持久化功能

Posted by Nick Xu

在 Redis 2.2 或以上版本,可以在不重启的情况下,从 RDB 切换到 AOF :

   为最新的 dump.rdb 文件创建一个备份。
   将备份放到一个安全的地方。
   执行以下两条命令:

   redis-cli> CONFIG SET appendonly yes

   redis-cli> CONFIG SET save ""

   确保命令执行之后,数据库的键的数量没有改变。
   确保写命令会被正确地追加到 AOF 文件的末尾。

步骤 3 执行的第一条命令开启了 AOF 功能: Redis 会阻塞直到初始 AOF 文件创建完成为止, 之后 Redis 会继续处理命令请求, 并开始将写入命令追加到 AOF 文件末尾。

步骤 3 执行的第二条命令用于关闭 RDB 功能。 这一步是可选的, 如果你愿意的话, 也可以同时使用 RDB 和 AOF 这两种持久化功能

Tagged as: Comments Off
20Jul/17

Nginx Access Log日志统计分析常用命令

Posted by Nick Xu

IP相关统计

统计IP访问量

awk '{print $1}' access.log | sort -n | uniq | wc -l

查看某一时间段的IP访问量(4-5点)

grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l   

查看访问最频繁的前100个IP

awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100

查看访问100次以上的IP

awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn

查询某个IP的详细访问情况,按访问频率排序

grep '104.217.108.66' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100   

页面访问统计

查看访问最频的页面(TOP100)

awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100

查看访问最频的页面([排除php页面】(TOP100)

grep -v ".php"  access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100          

查看页面访问次数超过100次的页面

cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less

查看最近1000条记录,访问量最高的页面

tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less

每秒请求量统计

统计每秒的请求数,top100的时间点(精确到秒)

awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100

每分钟请求量统计

统计每分钟的请求数,top100的时间点(精确到分钟)

awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100

每小时请求量统计

统计每小时的请求数,top100的时间点(精确到小时)

awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100

性能分析

在nginx log中最后一个字段加入$request_time

列出传输时间超过 3 秒的页面,显示前20条

cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20

列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条

cat access.log|awk '($NF > 1 &&  $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

蜘蛛抓取统计

统计蜘蛛抓取次数

grep 'Baiduspider' access.log |wc -l

统计蜘蛛抓取404的次数

grep 'Baiduspider' access.log |grep '404' | wc -l

TCP连接统计

查看当前TCP连接数

netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l

用tcpdump嗅探80端口的访问看看谁最高

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
Filed under: Linux Comments Off
13Jul/17

Nginx1.8.0版本平滑升级新版本1.9.7

Posted by Nick Xu

首先查看现在环境nginx的版本为1.8.0 编译的参数只指定了安装路径;

代码如下:
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.8.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
configure arguments: --prefix=/usr/local/nginx

平滑升级步骤如下:

下载nginx1.9.7版本,解压并进入解压后的目录

代码如下:
[root@localhost ~]# wget -P /usr/local/src/ http://nginx.org/download/nginx-1.9.7.tar.gz
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# tar -zxvf nginx-1.9.7.tar.gz
[root@localhost src]# cd nginx-1.9.7

编译安装之前查看nginx进程ID信息:

代码如下:
[root@localhost nginx-1.9.7]# ps -ef |grep nginx
root 894 1 0 16:06 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 896 894 0 16:06 ? 00:00:00 nginx: worker process
nobody 897 894 0 16:06 ? 00:00:00 nginx: worker process

编译安装:指定用户www 支持ssl 支持pcre 支持状态查询 支持静态压缩模块;

代码如下:
[root@localhost nginx-1.9.7]# ./configure --user=www --group=www --prefix=/usr/local/nginx/ --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module

编译安装后可以echo $?查看是否成功,成功后只需要执行make,不需要make install;

代码如下:
[root@localhost nginx-1.9.7]# make

平滑升级,先移走现有的nginx二进制文件

代码如下:
[root@localhost nginx-1.9.7]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

拷贝新生成的nginx二进制文件到指定目录

代码如下:
[root@localhost nginx-1.9.7]# cp objs/nginx /usr/local/nginx/sbin/

执行升级命令

代码如下:
[root@localhost nginx-1.9.7]# make upgrade
/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
kill -USR2 `cat /usr/local/nginx//logs/nginx.pid`
sleep 1
test -f /usr/local/nginx//logs/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx//logs/nginx.pid.oldbin`

查看版本,发现已经是1.9.7版本,编译的参数也存在;

代码如下:
[root@localhost nginx-1.9.7]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.9.7
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx/ --with-pcre --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module

创建www用户

代码如下:
[root@localhost nginx-1.9.7]# useradd -s /sbin/nologin -M www

查看nginx进程 PID已经更改

代码如下:
[root@localhost sbin]# ps -ef |grep nginx
root 3814 1 0 16:23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 3815 3814 0 16:23 ? 00:00:00 nginx: worker process
nobody 3816 3814 0 16:23 ? 00:00:00 nginx: worker process

修改nginx.conf配置文件,更改用户和用户组为www用户,保存退出,重启nginx服务;

代码如下:
[root@localhost conf]# ps -ef |grep nginx
root 3814 1 0 16:23 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
www 4200 3814 0 16:48 ? 00:00:00 nginx: worker process
www 4201 3814 0 16:48 ? 00:00:00 nginx: worker process

Nginx1.8.0版本平滑升级新版本1.9.7就给大家介绍到这里,希望对大家有所帮助!

Tagged as: , Comments Off
7Jul/17

kvm console连接和shutdown虚拟机

Posted by Nick Xu

8.1 HOST上的设置

虚拟机提供了ssh进入的方式, 如果我们想要以virsh console方式进入虚拟机, 需要在host机器上的vm1.xml做些更改:

# virsh edit vm1

进入vim界面, 在<devices>...</devices>里面添加如下内容(注意, 如果已经存在就不要加了):

 

  1. <devices>
  2.   ...
  3.   <serial type='pty'>
  4.     <source path='/dev/pts/2'/>
  5.     <target port='0'/>
  6.   </serial>
  7.   <console type='pty' tty='/dev/pts/2'>
  8.     <source path='/dev/pts/2'/>
  9.     <target port='0'/>
  10.   </console>
  11. </devices>

 

8.2 GUEST上的设置使virsh console可以登录虚拟机

1) ubuntu

在虚拟机vm1中, 需要创建一个文件"/etc/init/ttyS0.conf", 内容如下(#注释部分可以忽略):

 

  1. # ttyS0.conf - getty
  2. # This service maintains a getty on ttyS0 from the point the system is
  3. # started until it is shut down again.
  4. start on stopped rc RUNLEVEL=[2345]
  5. stop on runlevel [!2345]
  6. respawn
  7. exec /sbin/getty -L 115200 ttyS0 vt220

 

这个"/etc/init/ttyS0.conf"可以在创建虚拟机的最后阶段, 作为一个启动脚本加进去.

2) rhel6.4或centos6.5

How to activate the serial console in CentOS 6. Useful for logging into a virtual guest via 'virsh console'.

/etc/init/ttyS0.conf:

  1. # ttyS0 - agetty for rhel6
  2. stop on runlevel [016]
  3. start on runlevel [345]
  4. instance ttyS0
  5. respawn
  6. pre-start exec /sbin/securetty ttyS0
  7. exec /sbin/agetty /dev/ttyS0 115200 vt100-nav

3) rhel5.4

# 添加ttyS0的安全许可,允许root登录:

  1. echo "ttyS0" >> /etc/securetty
# 在 /etc/grub.conf 文件中为内核添加参数, 让内核把输出定向至 ttyS0。
  1. console=ttyS0
# 在 /etc/inittab 中添加 agetty, 在inittab里加一个ttyS0在系统启动时会生成一个ttyS0来接收内核的数据。
  1. S0:12345:respawn:/sbin/agetty ttyS0 115200

 

8.3 virsh console

重启虚拟机后,进入 vm1

  1. # virsh console vm1

 

多敲几次回车, 敲入登录的用户名和密码.

退出虚拟机回到HOST按组合键:

Ctrl+]

9 为虚拟机添加启动脚本

创建一个脚本文件: firstboot_vm.sh

  1. # Set time zone
  2. cp /usr/share/zoneinfo/Asia/Harbin /etc/localtime
  3. # Set proxy server
  4. # replaceyourProxyHostIP by your true IP, if not, comment below line
  5. echo 'Acquire::http::proxy "http://yourProxyHostIP:3142";' >> /etc/apt/apt.conf
  6. # ttyS0 -getty
  7. #
  8. # Thisservice maintains a getty on ttyS0 from the point the system is
  9. # starteduntil it is shut down again.
  10. echo "start on stopped rc RUNLEVEL=[2345]" > /etc/init/ttyS0.conf
  11. echo "stop on runlevel [!2345]" >> /etc/init/ttyS0.conf
  12. echo "respawn" >> /etc/init/ttyS0.conf
  13. echo "exec /sbin/getty -L 115200 ttyS0 vt220" >> /etc/init/ttyS0.conf

 

在创建虚拟机时指定它, 参考 "4.1 创建虚拟机的脚本: create_vm.sh":

  1. --firstboot=firstboot_vm.sh

 

一般我们认为,windows系统下的acpi是默认开启的,但是本次我测试win2003虚拟机,发现默认情况下通过“virsh shutdown 虚拟机名称”无法正常关闭虚拟机

解决方法:

在虚拟机里面修改组策略配置:

1
2
3
“gpedit.msc”--“Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\"
Shutdown: Allow system to be shut down 
without having to log on”

修改注册表信息:

然后运行ShutdownWarningDialogTimeout.reg

内容如下:

1
2
3
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows]
"ShutdownWarningDialogTimeout"=dword:00000001

再次测试,发现问题得到解决。

Linux下只需安装acpid并启动该服务即可.

Tagged as: , , Comments Off
site
site