linux-strace跟踪运行中进程对系统资源的访问

简介

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

输出参数含义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@ubuntu:/usr# strace cat /dev/null 
execve("/bin/cat", ["cat", "/dev/null"], [/* 22 vars */]) = 0
brk(0) = 0xab1000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f29379a7000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
...
brk(0) = 0xab1000
brk(0xad2000) = 0xad2000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
open("/dev/null", O_RDONLY) = 3
fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0
read(3, "", 32768) = 0
close(3) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?

每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。

strace参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
-c 统计每一系统调用的所执行的时间,次数和出错的次数等. 
-d 输出strace关于标准错误的调试信息.
-f 跟踪由fork调用所产生的子进程.
-ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号.
-F 尝试跟踪vfork调用.在-f时,vfork不被跟踪.
-h 输出简要的帮助信息.
-i 输出系统调用的入口指针.
-q 禁止输出关于脱离的消息.
-r 打印出相对时间关于,,每一个系统调用.
-t 在输出中的每一行前加上时间信息.
-tt 在输出中的每一行前加上时间信息,微秒级.
-ttt 微秒级输出,以秒了表示时间.
-T 显示每一调用所耗的时间.
-v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出.
-V 输出strace的版本信息.
-x 以十六进制形式输出非标准字符串
-xx 所有字符串以十六进制形式输出.
-a column
设置返回值的输出位置.默认 为40.
-e expr
指定一个表达式,用来控制如何跟踪.格式如下:
[qualifier=][!]value1[,value2]...
qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如:
-eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none.
注意有些shell使用!来执行历史记录里的命令,所以要使用\\.
-e trace=set
只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all.
-e trace=file
只跟踪有关文件操作的系统调用.
-e trace=process
只跟踪有关进程控制的系统调用.
-e trace=network
跟踪与网络有关的所有系统调用.
-e strace=signal
跟踪所有与系统信号有关的 系统调用
-e trace=ipc
跟踪所有与进程通讯有关的系统调用
-e abbrev=set
设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all.
-e raw=set
将指 定的系统调用的参数以十六进制显示.
-e signal=set
指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号.
-e read=set
输出从指定文件中读出 的数据.例如:
-e read=3,5
-e write=set
输出写入到指定文件中的数据.
-o filename
将strace的输出写入文件filename
-p pid
跟踪指定的进程pid.
-s strsize
指定输出的字符串的最大长度.默认为32.文件名一直全部输出.
-u username
以username 的UID和GID执行被跟踪的命令

命令实例

通用的完整用法:

1
strace -o output.txt -T -tt -e trace=all -p 28979

上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。

限制strace只跟踪特定的系统调用

如果你已经知道你要找什么,你可以让strace只跟踪一些类型的系统调用。例如,你需要看看在configure脚本里面执行的程序,你需要监视的系统调 用就是execve。让strace只记录execve的调用用这个命令:

1
strace -f -o configure-strace.txt -e execve ./configure


精品博文转自: http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html

Nginx+tomcat+redis集群之session跟踪(nginx_upstream_jvm_route)

实验环境

CentOS7, Tomcat7(tomcat-1, tomcat-2), Nginx1.8.1, redis3.0.7

tomcat1:Server port=”8105”,Connector port=”8081”,ajp Connector port=”8109”

tomcat2:Server port=”8205”,Connector port=”8082”,ajp Connector port=”8209”

集群环境下tomcat的session处理方式

一、upstream ip_hash(不推荐使用)

nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:

1
2
3
4
5
upstream backend { 
server 127.0.0.1:8081 ;
server 127.0.0.1:8082 ;
ip_hash;
}

不推荐使用的原因如下:

  • nginx不是最前端的服务器。 ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。

  • nginx的后端还有其它方式的负载均衡。
    假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。

  • 多个外网出口。
    很多公司上网有多个出口,多个ip地址,用户访问互联网时候自动切换ip。而且这种情况不在少数。使用 ip_hash 的话对这种情况的用户无效,无法将某个用户绑定在固定的tomcat上 。

    二、nginx_upstream_jvm_route (nginx module, 无法故障转移)

    nginx_upstream_jvm_route 是一个nginx的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。

简单来说,它是基于cookie中的JSESSIONID来决定将请求发送给后端的哪个server,nginx_upstream_jvm_route会在用户第一次请求后端server时,将响应的server标识绑定到cookie中的JSESSIONID中,从而当用户发起下一次请求时,nginx会根据JSESSIONID来决定由哪个后端server来处理。

但是当客户端对应的tomcat挂掉之后,客户端的请求将不能通过其它tomcat代替进行处理,也就是说 nginx_upstream_jvm_route不支持故障转移

三、tomcat-redis-session-manager (java lib, 推荐使用)

通过集群实例tomcat连接到同一个redis,将sessionID存储在redis中完成session共享。由于session共享,所以支持故障转移。

详见我的另一篇博文《Nginx+tomcat+redis集群之session共享》

nginx_upstream_jvm_route安装配置

github地址:https://github.com/nulab/nginx-upstream-jvm-route

安装方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
[root@localhost ~]# git clone https://github.com/nulab/nginx-upstream-jvm-route.git
[root@localhost ~]# cd nginx-1.8.1 //注意:一定是进入到nginx安装目录打补丁
[root@localhost nginx-1.8.1]# patch -p0 < ../nginx-upstream-jvm-route/jvm_route.patch
patching file src/http/ngx_http_upstream.c
Hunk #1 succeeded at 5281 (offset 672 lines).
Hunk #2 succeeded at 5380 (offset 678 lines).
Hunk #3 succeeded at 5397 (offset 656 lines).
Hunk #4 succeeded at 5434 (offset 656 lines).
Hunk #5 succeeded at 5467 (offset 656 lines).
Hunk #6 succeeded at 5527 (offset 671 lines).
patching file src/http/ngx_http_upstream.h
Hunk #1 succeeded at 96 (offset 4 lines).
Hunk #2 succeeded at 110 (offset 4 lines).
[root@localhost nginx-1.8.1]# ./configure --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ \--add-module=../nginx_upstream_check_module/ \--add-module=../nginx-module-vts/ \--add-module=../nginx-upstream-jvm-route/
[root@localhost nginx-1.8.1]# make
[root@localhost nginx-1.8.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
mv:是否覆盖"/usr/local/nginx/sbin/nginx.old"? y
[root@localhost nginx-1.8.1]# cp objs/nginx /usr/local/nginx/sbin/
[root@localhost nginx-1.8.1]# 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`
[root@localhost nginx-1.8.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ --add-module=../nginx_upstream_check_module/ --add-module=../nginx-module-vts/ --add-module=../nginx-upstream-jvm-route/

配置nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
http {
upstream tomcats_jvm_route {
server 127.0.0.1:8081 srun_id=tomcat01;
server 127.0.0.1:8082 srun_id=tomcat02;
jvm_route $cookie_JSESSIONID|sessionid reverse;
}
server {
#....原有配置.....
location ~ .*\.(do|jsp|action)?$ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root html;
index index.html index.htm;
#proxy_pass http://tomcat;
proxy_pass http://tomcats_jvm_route;
}
#....原有配置.....
}
}

修改tomcat的server.xml配置:

1
2
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat01">
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat02">

验证生效

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost ~]# ps -ef |grep tomcat|grep -v grep|awk '{print $2}'
19914
20029
[root@localhost ~]# ps -ef |grep tomcat|grep -v grep|awk '{print $2}'|xargs kill
[root@localhost ~]# ps -ef |grep tomcat|grep -v grep|awk '{print $2}'
[root@localhost ~]# cd tomcat-1/
[root@localhost tomcat-1]# ./bin/startup.sh
Using CATALINA_BASE: /root/tomcat-1
Using CATALINA_HOME: /root/tomcat-1
Using CATALINA_TMPDIR: /root/tomcat-1/temp
Using JRE_HOME: /usr/local/jdk1.7.0_60
Using CLASSPATH: /root/tomcat-1/bin/bootstrap.jar:/root/tomcat-1/bin/tomcat-juli.jar
Tomcat started.
[root@localhost tomcat-1]# cd ../tomcat-2
-bash: cd: tomcat-2: 没有那个文件或目录
[root@localhost tomcat-2]# ./bin/startup.sh
Using CATALINA_BASE: /root/tomcat-1
Using CATALINA_HOME: /root/tomcat-1
Using CATALINA_TMPDIR: /root/tomcat-1/temp
Using JRE_HOME: /usr/local/jdk1.7.0_60
Using CLASSPATH: /root/tomcat-1/bin/bootstrap.jar:/root/tomcat-1/bin/tomcat-juli.jar
Tomcat started.
[root@localhost tomcat-2]# /usr/local/nginx/sbin/nginx -t;/usr/local/nginx/sbin/nginx -s reload;



从上图的结果来看:

  • 1: sessionID的后面增加了第一个为客户端服务的最终tomcat实例标识。
  • 2: 在不停的刷新页面的时候都是同一个tomcat实例返回的页面。从vts的监控图可以看出,请求都被导流到同一个tomcat实例上。
  • 3: 在停止tomcat1后,再对浏览器进行刷新操作,发现请求被导到tomcat2上,但对应的sessionId也发生了变化,说明服务器端认定这是一个新的客户端进行的请求操作。验证了我之前所说,这种方式不支持故障转移

观点仅代表自己,期待你的留言。

Nginx+tomcat+redis集群之session共享

实验环境

CentOS7, Tomcat7(tomcat-1, tomcat-2), Nginx1.8.1, redis3.0.7

安装redis与tomcat

1
2
3
4
5
6
7
[root@localhost ~]# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
[root@localhost ~]# wget http://mirror.nus.edu.sg/apache/tomcat/tomcat-7/v7.0.68/bin/apache-tomcat-7.0.68.tar.gz
[root@localhost ~]# tar -xvf redis-3.0.7.tar.gz; cd redis-3.0.7
[root@localhost redis-3.0.7]# make && make install
[root@localhost redis-3.0.7]# redis-server & //运行redis服务
[root@localhost ~]# tar -xvf apache-tomcat-7.0.68.tar.gz
[root@localhost ~]# mv apache-tomcat-7.0.68 tomcat-1; cp -r tomcat-1 tomcat-2

在tomcat-1和tomcat-2的webapps/ROOT目录下新增一个名叫session.jsp的文件,内容如下:

1
2
<%@ page  %>
Tomcat1(tomcat-2中为Tomcat2) SessionId = <%=session.getId() %>

修改tomcat与nginx配置

架设场景如下图:

架设场景

  • 修改tomcat端口(conf/server.xml)

tomcat1:Server port=”8105”,Connector port=”8081”,ajp Connector port=”8109”

tomcat2:Server port=”8205”,Connector port=”8082”,ajp Connector port=”8209”

  • 修改nginx配置,以随机访问的方式将请求引入后端的tomcat集群中
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    http {
    upstream tomcat {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
    }
    server {
    listen 80;
    server_name localhost;
    #charset koi8-r;
    #access_log logs/host.access.log main;
    location ~ .*\.(do|jsp|action)?$ {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    root html;
    index index.html index.htm;
    proxy_pass http://tomcat;
    }
    #配置Nginx动静分离,定义的静态页面直接从Nginx发布目录读取。
    location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
    root /data/;
    gzip_static on; #开启压缩静态资源
    }

    location / {
    root html;
    index index.html index.htm;
    }
    }
    }

然后访问http://10.28.10.218/session.jsp 可以看到服务器随机返回给我们两个tomcat的session页面。同时我们也可以看到SessionId在不停的变化。

Tomcat1的session.jsp

Tomcat2的session.jsp

通过Nginx的监控页也可以看出请求被随机的转发到了tomcat中

Nginx的监控页

将tomcat的session都存储到redis中

Tomcat存储到Redis库项目地址:https://github.com/jcoleman/tomcat-redis-session-manager
从gradle配置上看,此项目还有三个依赖库。通过gradle进行编译,最终会自动从网络下载commons-pool,commons-pool2,jedis库并编译生成tomcat-redis-session-manager。

1
2
3
4
5
6
7
8
9
10
11
12
dependencies {
compile group: 'org.apache.tomcat', name: 'tomcat-catalina', version: '7.0.27'
compile group: 'redis.clients', name: 'jedis', version: '2.5.2'
compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.2'
//compile group: 'commons-codec', name: 'commons-codec', version: '1.9'

testCompile group: 'junit', name: 'junit', version: '4.+'
testCompile 'org.hamcrest:hamcrest-core:1.3'
testCompile 'org.hamcrest:hamcrest-library:1.3'
testCompile 'org.mockito:mockito-all:1.9.5'
testCompile group: 'org.apache.tomcat', name: 'tomcat-coyote', version: '7.0.27'
}

觉得麻烦的同学可以直接下载以下库,放入到tomcat/lib下:
commons-pool-1.5.5.jar
commons-pool2-2.2.jar
jedis-2.0.0.jar
tomcat-redis-session-manager-1.2-tomcat-7-1.2.jar

按tomcat-redis-session-manager在github上地址里的说明修改两个tomcat的context.xml(tomcat/conf/context.xml)增加存储配置

1
2
3
4
5
6
7
8
9
<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />
<Manager className="com.radiadesign.catalina.session.RedisSessionManager"
host="localhost" <!-- optional: defaults to "localhost" -->
port="6379" <!-- optional: defaults to "6379" -->
database="0" <!-- optional: defaults to "0" -->
maxInactiveInterval="60" <!-- optional: defaults to "60" (in seconds) -->
sessionPersistPolicies="PERSIST_POLICY_1,PERSIST_POLICY_2,.." <!-- optional -->
sentinelMaster="SentinelMasterName" <!-- optional -->
sentinels="sentinel-host-1:port,sentinel-host-2:port,.." />

修改好配置后,启动tomcat-1和tomcat-2。再访问session.jsp时你会发现无论是从哪一个tomcat返回的页面同一个客户端的sessionID都是相同的,这就达到了session在集群tomcat下共享的目的。

通过redis-cli命令连接到redis服务器,可以看到对应sessionID的数据已存储到了redis中。

提醒:session的超时时间由context.xml中的maxInactiveInterval配置,默认60秒


观点仅代表自己,期待你的留言。

Nginx不停止服务下升级与Nginx服务监控

一、文章目的

本文以添加新模块”ngx_http_stub_status_module”为例介绍Nginx如果在不停止服务的情况下进行升级。

二、Nginx升级

先查看一下目前现在模块:

1
2
3
4
5
6
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ --add-module=../nginx_upstream_check_module/ --add-module=../nginx-module-vts/

进入到nginx源码目录(或者直接从网络上下载。参见博文[ Nginx在CentOS7上源码编译安装 ]),编译时增加所需添加的模块:

1
2
3
[root@localhost nginx-1.8.1]# cd ~/nginx-1.8.1
[root@localhost nginx-1.8.1]# ./configure --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ \--add-module=../nginx_upstream_check_module/ \--add-module=../nginx-module-vts/
[root@localhost nginx-1.8.1]# make

将编译出的objs目录下及nginx运行文件直接copy到原nginx目录(注意备份):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost nginx-1.8.1]# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
[root@localhost nginx-1.8.1]# cp objs/nginx /usr/local/nginx/sbin/
[root@localhost nginx-1.8.1]# 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`
[root@localhost sbin]# ./nginx -V
nginx version: nginx/1.8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_stub_status_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ --add-module=../nginx_upstream_check_module/ --add-module=../nginx-module-vts/

从以上的输出信息来看,nginx已经成功添加了http_stub_status_module模块。接下来,我们进行验证。

验证ngx_http_stub_status_module模块是否生效

在conf/nginx.conf的server节点下添加

1
2
3
location /status {
stub_status;
}

重新load一下nginx配置

1
2
3
[root@localhost sbin]# ./nginx -t;./nginx -s reload
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

然后通过浏览器访问http://10.28.10.218/status 就可以看到nginx的运行状态已经通过界面的方式显示出来了。

由于http_stub_status_module模块监控的状态项非常有限,建议使用nginx-module-vts模块对nginx进行更全面的运行状态监控。
Nginx VTS

nginx.conf

1
2
3
4
5
6
7
8
9
http {
vhost_traffic_status_zone;
server {
location /vts {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}

三、提高nginx监控页面的安全性

由于nginx的运行状态为非常重要的数据,所以只允许有特定权限的人员才能有权访问,所以我们可以通过http_auth_basic_module模块来进行身份的验证。更为关键的是http_auth_basic_module模块默认已安装。

通过“yum provides *bin/htpasswd”查看哪个库中有htpasswd命令,安装账户生成命令htpasswd,并添加一个用户admin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost nginx-1.8.1]# yum provides \*bin/htpasswd
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.sina.cn
* epel: ftp.cuhk.edu.hk
* extras: mirrors.sina.cn
* updates: mirrors.sina.cn
base/7/x86_64/filelists_db | 6.2 MB 00:00:01
httpd-tools-2.4.6-40.el7.centos.x86_64 : Tools for use with the Apache HTTP Server
源 :base
匹配来源:
文件名 :/usr/bin/htpasswd


[root@localhost nginx-1.8.1]# yum install httpd-tools
[root@localhost nginx-1.8.1]# whereis htpasswd //查看是否安装成功
htpasswd: /usr/bin/htpasswd /usr/share/man/man1/htpasswd.1.gz
[root@localhost nginx]# htpasswd -c ./nginx.auth admin //在nginx目录下会生成一个nginx.auth文件来存储账户信息,第二次添加用户就不需要加-c的参数了
New password:
Re-type new password:
Adding password for user admin

在conf/nginx.conf的location status节点内添加以下身份验证配置

1
2
3
4
5
6
7
8
9
10
11
http {
vhost_traffic_status_zone;
server {
location /vts {
auth_basic "Restricted";
auth_basic_user_file ../nginx.auth;
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
}
}

重新热更新一下配置,再次通过浏览器访问时就会弹框提示你输入用户名和密码了。

1
2
3
[root@localhost sbin]# ./nginx -t;./nginx -s reload
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

Nginx Auth


观点仅代表自己,期待你的留言。

Nginx在CentOS7上源码编译安装

下载Nginx源码及依赖库

1
2
3
4
[root@localhost ~]# wget http://nginx.org/download/nginx-1.8.1.tar.gz
[root@localhost ~]# yum install -y gcc gcc-c++
[root@localhost ~]# wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.38/pcre-8.38.tar.gz
[root@localhost ~]# wget http://zlib.net/zlib-1.2.8.tar.gz

下载Nginx模块

Nginx官网所有模块列表 http://nginx.org/en/docs/

1
2
3
4
[root@localhost ~]# yum -y install openssl openssl-devel
[root@localhost ~]# git clone https://github.com/vozlt/nginx-module-vts.git
[root@localhost ~]# git clone https://github.com/yaoweibin/nginx_tcp_proxy_module.git
[root@localhost ~]# git clone https://github.com/yaoweibin/nginx_upstream_check_module.git

编译安装Nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost ~]# tar xvf nginx-1.8.1.tar.gz
[root@localhost ~]# tar xvf pcre-8.38.tar.gz
[root@localhost ~]# tar xvf zlib-1.2.8.tar.gz
[root@localhost ~]# cd nginx-1.8.1
[root@localhost nginx-1.8.1]# patch -p1 < ../nginx_tcp_proxy_module/tcp.patch
[root@localhost nginx-1.8.1]# patch -p1 < ../nginx_upstream_check_module/check_1.7.5+.patch //按nginx版本来执行不同的补丁文件
[root@localhost nginx-1.8.1]# ./configure --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ \--add-module=../nginx_upstream_check_module/ \--add-module=../nginx-module-vts/
[root@localhost nginx-1.8.1]# make
[root@localhost nginx-1.8.1]# make install
[root@localhost nginx-1.8.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.8.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-pcre=../pcre-8.38 --with-zlib=../zlib-1.2.8 --with-http_gzip_static_module --with-http_ssl_module --add-module=../nginx_tcp_proxy_module/ --add-module=../nginx_upstream_check_module/ --add-module=../nginx-module-vts/
[root@localhost nginx-1.8.1]# /usr/local/nginx/sbin/nginx
[root@localhost nginx-1.8.1]# systemctl stop firewalld.service //关闭防火墙,开放访问端口80

Nginx Welcome

nginx安装目录默认为: /usr/local/nginx, 可通过在configure时增加–prefix=”path”来更改。

nginx启动时默认用户及用户组设置:

  • 通过在configure时增加–user=”user name”和–group=”group name”来更改。
  • 在nginx.conf里增加user “user name” “group name”来更改。

注意: 在configure时如需添加多个第三方module时,从第二个–add-module开始,在之前需要加“\”


观点仅代表自己,期待你的留言。

关于电商系统业务模块猜想

电商四大体系
  • 企业信息化
  • 电商网络体系
  • 线上监控体系
  • 数据分析体系

电商四大体系

电商业务模块

经过与朋友们的讨论,笔者着手总结电商应包含的模块如下:

电商业务模块总览

笔者认为电商门户建设应从企业信息化建设入手,逐步加入电商元素,最终形成企业电商。


观点仅代表自己,期待你的留言。

博客站开写啦

经过两天的努力总算搭建一个属于自己的博客站,不得不感叹自己真的是太懒了,原本很早以前就想做的事情偏偏等到现在才来完成,懒!懒!懒!

为了让自己形成坚持记录的习惯,理清工作中千丝万缕的思路,让瞬间的“天马行空”留下痕迹。

我决定以后坚持写博客,并开通评论功能接收各位朋友的褒贬建议。

不积跬步,无以至千里;不积小流,无以成江海。坚持写作,观点仅代表自己,加油!!!