Docker容器进入的方式

1.使用docker exec进入Docker容器

docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:

1
sudo docker exec --help
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost toor]# sudo docker exec --help

Usage: docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

Run a command in a running container

Options:
-d, --detach Detached mode: run command in the background
--detach-keys string Override the key sequence for detaching a
container
-e, --env list Set environment variables
-i, --interactive Keep STDIN open even if not attached
--privileged Give extended privileges to the command
-t, --tty Allocate a pseudo-TTY
-u, --user string Username or UID (format:
<name|uid>[:<group|gid>])
-w, --workdir string Working directory inside the container
[root@localhost toor]#
1
2
3
4
[root@localhost toor]# docker exec -it a46fa8852e07 /bin/bash
root@a46fa8852e07:/# exit
exit
[root@localhost toor]#

参考:

https://www.cnblogs.com/xhyan/p/6593075.html

CentOS7添加/删除用户和用户组

新建用户

注:root下操作

1
2
adduser testuser #新建testuser 用户
passwd testuser #设置密码

授权

新创建的用户并不能使用sudo命令,需要给他添加授权。

sudo命令的授权管理是在sudoers文件里的。可以看看sudoers

1
2
3
4
[root@localhost Desktop]# sudoers
bash: sudoers: 未找到命令...
[root@localhost Desktop]# whereis sudoers
sudoers: /etc/sudoers /etc/sudoers.d /usr/libexec/sudoers.so /usr/share/man/man5/sudoers.5.gz

找到这个文件位置之后再查看权限:

1
2
[root@localhost Desktop]# ls -l /etc/sudoers
-r--r-----. 1 root root 4000 3月 6 2015 /etc/sudoers

只有只读的权限,如果想要修改的话,需要先添加w权限:

1
2
[root@localhost Desktop]# chmod -v u+w /etc/sudoers
mode of "/etc/sudoers" changed from 0440 (r--r-----) to 0640 (rw-r-----)

然后就可以添加内容了,在下面的一行下追加新增的用户:

1
2
3
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
toor ALL=(ALL) ALL #新增的用户

wq保存退出,这时候要记得将写权限收回:

1
2
[root@localhost Desktop]# chmod -v u-w /etc/sudoers
mode of "/etc/sudoers" changed from 0640 (rw-r-----) to 0440 (r--r-----)

这时候使用新用户登录,使用sudo

新建工作组

1
groupadd testgroup

新建用户同时增加工作组

1
useradd -g testgroup testuser

注::-g 所属组

给已有的用户增加工作组

1
usermod -G groupname username

永久删除用户帐号

1
2
3
userdel testuser
groupdel testgroup
usermod -G testgroup testuser #强制删除该用户的主目录和主目录下的所有文件和子目录

用户列表文件:/etc/passwd
用户组列表文件:/etc/group

查看系统中有哪些用户:cut -d : -f 1 /etc/passwd
查看可以登录系统的用户:cat /etc/passwd | grep -v /sbin/nologin | cut -d : -f 1
查看用户操作:w命令(需要root权限)
查看某一用户:w 用户名
查看登录用户:who
查看用户登录历史记录:last

参考:

https://www.linuxidc.com/Linux/2016-11/137549.htm

http://www.jb51.net/article/123444.htm

http://blog.51cto.com/risingair/1861641

Docker Dockerfile详解

官网

Docker简介

Docker项目提供了构建在Linux内核功能之上,协同在一起的的高级工具。其目标是帮助开发和运维人员更容易地跨系统跨主机交付应用程序和他们的依赖。Docker通过Docker容器,一个安全的,基于轻量级容器的环境,来实现这个目标。这些容器由镜像创建,而镜像可以通过命令行手工创建或 者通过Dockerfile自动创建。

Dockerfile简介

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像。它们简化了从头到尾的流程并极大的简化了部署工作。Dockerfile从FROM命令开始,紧接着跟随者各种方法,命令和参数。其产出为一个新的可以用于创建容器的镜像。

基本结构

一般而言,Dockerfile 的内容分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# This dockerfile uses the Ubuntu image
# VERSION 2
# Author: docker_user
# Command format: Instruction [arguments / command] …

# 第一行必须指定基于的容器镜像
FROM ubuntu

# 维护者信息
MAINTAINER docker_user docker_user@email.com

# 镜像的操作指令
RUN echo “deb http://archive.ubuntu.com/ubuntu/ raring main universe” >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo “\ndaemon off;” >> /etc/nginx/nginx.conf

# 容器启动时执行指令
CMD /usr/sbin/nginx

Dockerfile 命令

FROM

FROM命令可能是最重要的Dockerfile命令。该命令定义了使用哪个基础镜像启动构建流程。基础镜像可以为任意镜像。如果基础镜像没有被发现,Docker将试图从Docker image index来查找该镜像。FROM命令必须是Dockerfile的首个命令。

1
2
# Usage: FROM [image name]
FROM ubuntu

MAINTAINER

声明作者;这个命令放在Dockerfile的起始部分,虽然理论上它可以放置于Dockerfile的任意位置。这个命令用于声明作者,并应该放在FROM的后面。

注意:MAINTAINER 指令已经被抛弃,建议使用 LABEL 指令。

1
2
# Usage: MAINTAINER [name]
MAINTAINER authors_name

LABEL

格式为:

1
LABEL <key>=<value> <key>=<value> <key>=<value> ...

LABEL 指令为镜像添加标签。一个 LABEL 就是一个键值对。

下面是一些例子:

1
2
3
4
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \that label-values can span multiple lines."

我们可以给镜像添加多个 LABEL,需要注意的是,每条 LABEL 指令都会生成一个新的层。所以最好是把添加的多个 LABEL 合并为一条命令:

1
LABEL multi.label1="value1" multi.label2="value2" other="value3"

也可以写成这样:

1
2
3
LABEL multi.label1="value1" \
multi.label2="value2" \
other="value3"

如果新添加的 LABEL 和已有的 LABEL 同名,则新值会覆盖掉旧值。
我们可以使用 docker inspect 命令查看镜像的 LABEL 信息。

RUN

1
2
3
4
5
有两种格式,分别为:

RUN <command>

RUN [“executable”, “param1”, “param2”]。

RUN命令是Dockerfile执行命令的核心部分。它接受命令作为参数并用于创建镜像。不像CMD命令,RUN命令用于创建镜像(在之前commit的层之上形成新的层)。
前者将在 shell 终端中运行命令,即 /bin/sh -c,后者则使用 exec 执行。指定使用其他终端可以通过第二种方式实现,例如 RUN [“/bin/bash”, “-c”, “echo hello”]。
每条 RUN 指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行。

1
2
# Usage: RUN [command]
RUN aptitude install -y riak

CMD

支持三种格式:

1
2
3
4
5
CMD [“executable”, “param1”, “param2”] 使用 exec 执行,推荐方式。

CMD command param1 param2 在 /bin/sh 中执行,提供给需要交互的应用。

CMD [“param1”, “param2”] 提供给 ENTRYPOINT 的默认参数。

指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。如果用户在启动容器时指定了要运行的命令,则会覆盖掉 CMD 指定的命令。

和RUN命令相似,CMD可以用于执行特定的命令。和RUN不同的是,这些命令不是在镜像构建的过程中执行的,而是在用镜像构建容器后被调用。

1
2
# Usage 1: CMD application "argument", "argument", ..
CMD "echo" "Hello docker!"

EXPOSE

格式为:

1
EXPOSE <port> [<port>…]

告诉 Docker 服务,容器需要暴露的端口号,供互联系统使用。在启动容器时需要通过 -P 参数让 Docker 主机分配一个端口转发到指定的端口。使用 -p 参数则可以具体指定主机上哪个端口映射过来。

1
2
# Usage: EXPOSE [port]
EXPOSE 8080

ENV

ENV命令用于设置环境变量。这些变量以”key=value”的形式存在,并可以在容器内被脚本或者程序调用。这个机制给在容器中运行应用带来了极大的便利。

1
2
# Usage: ENV key value
ENV SERVER_WORKS 4

ADD

格式为:

1
ADD <src> <dest>

ADD命令有两个参数,源和目标。它的基本作用是从源系统的文件系统上复制文件到目标容器的文件系统。如果源是一个URL,那该URL的内容将被下载并复制到容器中。其中 <src> 可以是 Dockerfile 所在目录的一个相对路径(文件或目录);也可以是一个 URL;还可以是一个 tar 文件(自动解压为目录)。

1
2
# Usage: ADD [source directory or URL] [destination directory]
ADD /my_app_folder /my_app_folder

COPY

格式:

1
COPY <src> <dest>

复制本地主机的 <src> (为 Dockerfile 所在目录的相对路径,文件或目录) 为容器中的 <dest>。目标路径不存在时,会自动创建。当使用本地目录为源目录时,推荐使用 COPY。

ENTRYPOINT

有两种格式:

1
2
3
ENTRYPOINT [“executable”, “param1”, “param2”]

ENTRYPOINT command param1 param2 (shell 中执行)

配置容器启动后执行的命令,并且不可被 docker run 提供的参数覆盖。

每个 Dockerfile 中只能有一个 ENTRYPOINT,当指定多个时,只有最后一个起效。

ENTRYPOINT 帮助你配置一个容器使之可执行化,如果你结合CMD命令和ENTRYPOINT命令,你可以从CMD命令中移除“application”而仅仅保留参数,参数将传递给ENTRYPOINT命令。

1
2
3
4
5
6
7
8
# Usage: ENTRYPOINT application "argument", "argument", ..
# Remember: arguments are optional. They can be provided by CMD
# or during the creation of a container.
ENTRYPOINT echo
# Usage example with CMD:
# Arguments set with CMD can be overridden during *run*
CMD "Hello docker!"
ENTRYPOINT echo

VOLUME

格式为:

1
VOLUME ["/data"]

也可以使用 VOLUME 指令添加多个数据卷:

1
VOLUME ["/data1", "/data2"]

创建一个可以从本地或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。
VOLUME命令用于让你的容器访问宿主机上的目录。

1
2
# Usage: VOLUME ["/dir_1", "/dir_2" ..]
VOLUME ["/my_files"]

USER

指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户,例如:RUN groupadd -r postgres && useradd -r -g postgres postgres。

1
2
# Usage: USER [UID]
USER 751

WORKDIR

格式为:

1
WORKDIR /path/to/workdir

为后续的 RUN、CMD、ENTRYPOINT 指令配置工作目录。可以使用多个 WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。例如:

1
2
# Usage: WORKDIR /path
WORKDIR ~/

ONBUILD

格式为:

1
ONBUILD [INSTRUCTION]

配置当所创建的镜像作为其他新创建镜像的基础镜像时,所执行的操作指令。例如,Dockerfile 使用如下的内容创建了镜像 image-A。

1
2
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build –dir /app/src

如果基于 image-A 创建新的镜像时,新的 Dockerfile 中使用 FROM image-A 指定基础镜像时,会自动执行 ONBUILD 指令内容,等价于在后面添加了两条指令。

1
2
3
4
FROM image-A
#automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build –dir /app/src

如何使用Dockerfiles

编写完成 Dockerfile 之后,可以通过 docker build 命令来创建镜像。

使用Dockerfiles和手工使用Docker Daemon运行命令一样简单。脚本运行后输出为新的镜像ID。

1
2
3
# Build an image using the Dockerfile at current location
# Example: sudo docker build -t [name] .
sudo docker build -t my_mongodb .

基本的格式为 docker build [选项] 路径,该命令将读取指定路径下(包括子目录)的 Dockerfile ,并将该路径下所有内容发送给 docker 服务端,由服务端来创建镜像。因此一般建议放置 Dockerfile 的目录为空目录。

另外,可以通过 .dockerignore 文件来让 docker 忽略路径下的目录和文件。 要指定镜像的标签信息,可以通过 -t 选项来实现。
例如,指定 Dockerfile 所在路径为 /tmp/docker_builder/,并且希望生成镜像标签为 build_repo/first_image,可以使用下面的命令:

1
sudo docker build -t build_repo/first_image /tmp/docker_builder/

参考:

http://www.cnblogs.com/sparkdev/p/6357614.html

https://yeasy.gitbooks.io/docker_practice/content/introduction/what.html

https://www.cnblogs.com/boshen-hzb/p/6400272.html

Docker安装

官网

安装Docker CE

1
2
3
4
5
6
7
8
9
$ sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2

$ sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo

$ sudo yum install docker-ce

启动

1
sudo systemctl start docker

验证是否成功

1
sudo docker run hello-world

配置镜像加速

安装/升级你的Docker客户端

推荐安装1.10.0以上版本的Docker客户端

如何配置镜像加速器

针对Docker客户端版本大于1.10.0的用户

您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器:

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lhao27k5.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

或者使用ttps://registry.docker-cn.com

卸载

1.卸载Docker包

1
sudo yum remove docker-ce

2.主机上的mages, containers, volumes或自定义配置文件不会自动删除。 删除所有mages, containers, volumes:

1
sudo rm -rf /var/lib/docker

您必须手动删除任何定义配置文件。

Nginx上使用Let’s Encrypt加密(HTTPS)&自动续期

官网

获取证书生成工具 certbot

1
2
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

获取证书

1
./certbot-auto certonly -d *.域名 --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

按照提示依次填写邮箱地址,同意服务条款,绑定IP就行了。

面这一步很关键,需要你配置你的域名TXT记录,以校验域名所有权,也就是判断证书申请者是不是该域名的拥有者。

1
2
3
4
5
6
7
8
Please deploy a DNS TXT record under the name
_acme-challenge.shiyx.top with the following value:

l1VX8xfEnhrJ02QB4o-M6ntb9JEsItRISb1YjOEw3KY

Before continuing, verify the record is deployed.
-------------------------------------------------------------------------------
Press Enter to Continue

在添加txt记录到你的域名之前,切勿点击回车键。

登陆域名解析控制台(阿里云),添加一条TXT记录:

添加解析记录

执行命令:dig -t txt _acme-challenge.shiyx.top

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
ubuntu@ip-172-31-16-20:~$ dig -t txt _acme-challenge.shiyx.top

; <<>> DiG 9.10.3-P4-Ubuntu <<>> -t txt _acme-challenge.shiyx.top
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 54437
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;_acme-challenge.shiyx.top. IN TXT

;; ANSWER SECTION:
_acme-challenge.shiyx.top. 60 IN TXT "l1VX8xfSnwrJ02QB4o-M6ntb9JEsItRISb1YjOEw3YY"

;; Query time: 2001 msec
;; SERVER: 172.31.0.2#53(172.31.0.2)
;; WHEN: Thu Apr 26 00:50:34 UTC 2018
;; MSG SIZE rcvd: 110

确认生效后,按回车键继续

1
2
3
4
5
6
7
8
9
10
11
12
13
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at:
/etc/letsencrypt/live/shiyx.top/fullchain.pem
Your key file has been saved at:
/etc/letsencrypt/live/shiyx.top/privkey.pem
Your cert will expire on 2018-07-24. To obtain a new or tweaked
version of this certificate in the future, simply run certbot-auto
again. To non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:

Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le

证书申请完毕!证书和密钥保存在“/etc/letsencrypt/archive/”目录下

1
2
3
4
5
6
7
8
9
ubuntu@ip-172-31-16-20:~$ sudo tree /etc/letsencrypt/archive
/etc/letsencrypt/archive
└── shiyx.top
├── cert1.pem
├── chain1.pem
├── fullchain1.pem
└── privkey1.pem

1 directory, 4 files

续期HTTPS证书

官网:

https://certbot.eff.org/docs/using.html?highlight=renew#renewing-certificates

续期HTTPS证书命令

1
sudo certbot renew

自动续签HTTPS证书

Let’s Encrypt 证书的有效期只有 90 天,因此我们需要定期的对他进行续签,我们使用linux自带的cron来设定计划任务

1
crontab -e

注意,如果你是第一次运行 crontab 命令,它会问题使用哪一个编辑器,你可以根据自己的需要进行选择,我选择的是 vim-basic

1
sudo crontab -e

添加配置:

1
30 2 * * 1 sudo certbot renew

上面的执行时间为:每周一半夜2点30分执行renew任务。

你可以在命令行执行sudo renew看看是否执行正常。

Nginx配置

官网:http://nginx.org/en/docs/

注:aws需要定义安全组,允许https入站规则

Webroot配置模式

Webroot 的工作插件放置在一个特殊的文件/.well-known目录文档根目录下,它可以打开(通过Web服务器)内由让我们的加密服务进行验证。 根据配置的不同,你可能需要明确允许访问/.well-known目录。

为了确保该目录可供Let’s Encrypt进行验证,让我们快速更改我们的Nginx配置。编辑sudo vim /etc/nginx/sites-available/default文件,并将下面代码添加进去:

1
2
3
location ~ /.well-known {
allow all;
}
1
2
3
4
5
## 检查测试配置文件是否正确
sudo nginx -t -c /etc/nginx/nginx.conf

## 重新加载nginx
sudo service nginx reload

Nginx配置:

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
server {
listen 80;
server_name www.shiyx.top;
return 301 https://www.shiyx.top$request_uri;
server_tokens off;
}
server {
listen 443 ssl http2;
ssl on;
server_name www.shiyx.top;
#$host该变量的值等于请求头中Host的值。如果Host无效时,那么就是处理该请求的server的名称。
#permanent: 永久性重定向。请求日志中的状态码为301
#nginx 对文档检测比较严格,所以if ( $host != 'www.shiyx.top' ) 这些代码之间需要有空格隔开,不然会
#报错:unknown directive “if($host!=”
if ($host != 'www.shiyx.top' ){
rewrite ^/(.*)$ https://www.shiyx.top/$1 permanent;
}
ssl_certificate /etc/letsencrypt/live/shiyx.top/fullchain.pem;

ssl_certificate_key /etc/letsencrypt/live/shiyx.top/privkey.pem;

#禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击
server_tokens off;
# 设置ssl/tls会话缓存的类型和大小。如果设置了这个参数一般是shared,buildin可能会参数内存碎片,默认是none,
#和off差不多,停用缓存。如shared:SSL:10m表示我>所有的nginx工作进程共享ssl会话缓存,
#网介绍说1M可以存放约4000个sessions。
ssl_session_cache shared:SSL:1m;

# 客户端可以重用会话缓存中ssl参数的过期时间,内网系统默认5分钟太短了,可以设成30m即30分钟甚至4h。
ssl_session_timeout 5m;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

# 选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。
# 这里指定的是OpenSSL库能够识别的写法,你可以通过 openssl -v cipher 'RC4:HIGH:!aNULL:!MD5'
#(后面是你所指定的套件加密算法) 来看所支持算法。
ssl_ciphers HIGH:!aNULL:!MD5;

# 设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
location ~ /.well-known{
allow all;
}
}

另附https检查网站

hhttps://www.ssllabs.com/ssltest/analyze.html

参考:

https://www.lao-wang.com/?p=142

https://blog.guorenxi.com/43.html

https://segmentfault.com/a/1190000005797776

http://www.cnblogs.com/stulzq/p/8628163.html

https://www.appinn.com/use-letsencrypt-with-nginx/

https://www.cnblogs.com/lzpong/p/6433189.html

(AWS)Ubuntu 16.04.4 LTS 安装Nginx

安装nginx

nginx官网

1
sudo apt-get install nginx

Ubuntu安装之后的文件结构大致为:

  • 所有的配置文件都在/etc/nginx下,并且每个虚拟主机已经安排在了/etc/nginx/sites-available下
  • 程序文件在/usr/sbin/nginx
  • 日志放在了/var/log/nginx中
  • 并已经在/etc/init.d/下创建了启动脚本nginx
  • 默认的虚拟主机的目录设置在了/var/www/nginx-default (有的版本 默认的虚拟主机的目录设置在了/var/www, 请参考/etc/nginx/sites-available里的配置)

启动nginx

1
sudo /etc/init.d/nginx start

或者

1
sudo service nginx start

停止

1
2
sudo service nginx stop
sudo service nginx restart

检查config配置问题

1
sudo nginx -t -c /etc/nginx/nginx.conf

然后就可以访问了,http://localhost/,默认80端口

aws搭建shadowsocks服务器

shadowsocks特点:

地址:
https://github.com/shadowsocks/shadowsocks

快速(异步I/O和事件驱动程序)

安全(所有的流量都经过加密算法加密,支持自定义算法)

支持移动客户端(专为移动设备和无线网络优化)

跨平台(可运行于包括PC,Mac,手机(Android和iOS)和路由器(OpenWrt)在内的多种平台上)

安装shadowsocks

参考官网命令

Debian / Ubuntu:

1
2
3
4
5
6
7
sudo apt update 
sudo apt install python2
curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
sudo python2 get-pip.py
pip2 --version

pip install shadowsocks

CentOS:

1
2
yum install python-setuptools && easy_install pip
pip install shadowsocks

配置shadowsocks

无论是centos系统还是ubuntu系统,shadowsocks配置都是一样的。

shadowsocks安装完毕后,可以查看使用ssserver命令进行查看

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
ubuntu@ip-172-31-16-20:~$ ssserver -h
usage: ssserver [OPTION]...
A fast tunnel proxy that helps you bypass firewalls.

You can supply configurations via either config file or command line arguments.

Proxy options:
-c CONFIG path to config file
-s SERVER_ADDR server address, default: 0.0.0.0
-p SERVER_PORT server port, default: 8388
-k PASSWORD password
-m METHOD encryption method, default: aes-256-cfb
-t TIMEOUT timeout in seconds, default: 300
--fast-open use TCP_FASTOPEN, requires Linux 3.7+
--workers WORKERS number of workers, available on Unix/Linux
--forbidden-ip IPLIST comma seperated IP list forbidden to connect
--manager-address ADDR optional server manager UDP address, see wiki

General options:
-h, --help show this help message and exit
-d start/stop/restart daemon mode
--pid-file PID_FILE pid file for daemon mode
--log-file LOG_FILE log file for daemon mode
--user USER username to run as
-v, -vv verbose mode
-q, -qq quiet mode, only show warnings/errors
--version show version information

Online help: <https://github.com/shadowsocks/shadowsocks>

which ssserver

1
2
ubuntu@ip-172-31-16-20:~$ which ssserver
/usr/local/bin/ssserver

启动shadowsocks服务

配置文件启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
sudo mkdir /etc/shadowsocks

sudo vim /etc/shadowsocks/config.json
{
"server":"0.0.0.0",
"server_port":1194,
"local_address":"127.0.0.1",
"local_port":1080,
"password":"123qwe$%^",
"timeout":300,
"method":"aes-256-cfb",
"fast_open":false,
"workers": 1
}

启动:

1
2
3
sudo ssserver -c /etc/shadowsocks/config.json -d start
netstat -tunlp
netstat -anp ##显示系统端口使用情况

停止:

1
sudo ssserver -c /etc/shadowsocks/config.json -d stop

命令启动

1
sudo ssserver -p 443 -k password -m rc4-md5

如果要后台运行:

1
sudo ssserver -p 443 -k password -m rc4-md5 --user nobody -d start

如果要停止:

1
sudo ssserver -d stop

如果要检查日志:

1
sudo less /var/log/shadowsocks.log

Docker启动

安装Docker

参考官网链接:
https://docs.docker.com/install/linux/docker-ce/ubuntu/

下载shadowsocks镜像

1
docker pull oddrationale/docker-shadowsocks

运行设置shadowsocks

1
docker run --rm -d -p 8388:8388 oddrationale/docker-shadowsocks -s 0.0.0.0 -p 8388 -k 'paaassswwword' -m aes-256-cfb

运行: docker ps

查看shadowsocks是否运行起来了,没问题的话就可以exit退出vps的登录了

停止容器:

1
docker stop --time=20 container_name

8388 服务器端的端口号,paaassswwword 是密码, aes-256-cfb 是加密方式

配置aws ec2安全组规则

在aws ec2控制平台添加安全组规则-入站规则

自定义TCP规则,端口,任何位置

aws配置

连接shadowsocks服务

shadowsocks服务器搭建完毕后,我们现在来客户端连接shadowsocks服务器。

shadowsocks客户端有Windows版本和Linux版本

Windows版本

windows版本,我们可以从如下网址进行下载,如下:

https://github.com/shadowsocks/shadowsocks-windows/releases

下载完毕后,双击Shadowsocks.exe,在弹出框填入
Shadowsocks服务器的IP、Shadowsocks服务器端口,密码。

shadowsocks客户端配置

参考网址:

https://yq.aliyun.com/articles/43252

https://yq.aliyun.com/articles/555577

WinDbg快速分析异常情况Dump文件

生产环境偶尔会出现一些异常问题,WinDbg 或 GDB 就是解决此类问题的利器。调试工具 WinDbg 如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具,Dump 文件类似于飞机的黑匣子,记录着生产环境程序运行的状态。
本文主要介绍了调试工具 WinDbg 和抓包工具 ProcDump 的使用。

一、简介

1、WinDbg

WinDbg 是在 Windows 平台下的、强大的用户态和内核态调试工具。相比较于 Visual Studio,它是一个轻量级的调试工具,所谓轻量级指的是它的安装文件大小较小,但是其调试功能,却比 VS 更为强大。
它的另外一个用途是可以用来分析 Dump 数据。WinDbg 是 Microsoft 公司免费调试器调试集合中的 GUI 的调试器,支持 Source 和 Assembly 两种模式的调试。
WinDbg 不仅可以调试应用程序,还可以进行 Kernel Debug。结合 Microsoft 的 Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。
WinDbg 支持的平台包括 x86、IA64、AMD64。虽然 WinDbg 也提供图形界面操作,但它最强大的地方还是有着强大的调试命令,一般情况会结合 GUI 和命令行进行操作,常用的视图有:局部变量、全局变量、调用栈、线程、命令、寄存器、白板等。其中“命令”视图是默认打开的。

2、DebugDiag

DebugDiag 最初是为了帮助分析 IIS 的性能问题而开发的,它同样可以用于任何其他的进程。DebugDiag 工具主要用于帮助解决如挂起、 速度慢、 内存泄漏或内存碎片,和任何用户模式进程崩溃等问题。
该工具包括附加调试脚本,侧重于互联网信息服务(IIS)应用程序、 Web 数据访问组件、 COM+ 和相关 Microsoft 技术、SharePoint 和 .NET。它提供可扩展对象模型中的 COM 对象的形式,并具有一个内置的报告框架提供的脚本主机。它由 3 部分组成,包括调试服务、 调试器主机和用户界面。

3、ProcDump

ProcDump 是 System Internal 提供的一个专门用来监测程序 CPU 高使用率从而生成进程 Dump 文件的工具。ProcDump 可以根据系统的 CPU 使用率或者指定的性能计数器来针对特定进程生成一系列的 Dump 文件,以便调试者对事故原因进行分析。

二,工具下载地址

1、WinDbg 下载

x86 位版本下载:http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools/dbg_x86.msi

x64 位版本下载:http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi

2、DebugDiag v2 Update 2 下载:https://www.microsoft.com/en-us/download/details.aspx?id=49924

3、ProcDump v9.0 下载:https://download.sysinternals.com/files/Procdump.zip

三、获取异常进程的 Dump 文件

以下四种方式获取 Dump 文件:

1、通过【任务管理器】获取 Dump 文件,这样获取的是 MinDump

通过任务管理器

2、利用 WinDbg 的 adplus 获取 Dump 文件,这样获取的是 FullDump

C:\Program Files\Debugging Tools for Windows (x64)>adplus -hang -pn explorer.exe
-o D:\dumps

WinDbg-1

3、通过 DebugDiag 创建.NET 异常转储 Dump 文件

debugdiag-2

4、通过 ProcDump 抓取异常线程 Dump 文件。

4.1、命令行

进入ProcDump目录,运行命令行:

1
2
3
4
5
6
procdump [-a] [[-c|-cl CPU usage] [-u] [-s seconds]] [-n exceeds] 
[-e [1 [-b]] [-f <filter,...>] [-g] [-h] [-l] [-m|-ml commit usage]
[-ma | -mp] [-o] [-p|-pl counter threshold] [-r] [-t]
[-d <callback DLL>] [-64] <[-w] <process name or service name or PID>
[dump file] | -i <dump file> | -u | -x <dump file> <image file>
[arguments] >] [-? [ -e]]

实例:

1
2
3
4
5
6
7
8
procdump -c 70 -s 5 -ma -n 3 w3wp
- 当系统 CPU 使用率持续 5 秒超过 70% 时,连续抓 3 个 Full Dump。
procdump outlook -p "\Processor(_Total)\% Processor Time" 80
- 当系统 CPU 使用率超过 80%,抓取 Outlook 进程的 Mini Dump。
procdump -ma outlook -p "\Process(Outlook)\Handle Count" 10000
- 当 Outlook 进程 Handle 数超过 10000 时抓取 Full Dump
procdump -ma 4572
- 直接生成进程号位 4572 的 Full Dump。

注意:

  • ProcDump 需要进程已经启动,并且中途不能停止。比如需要抓取 IIS Worker Process 的 High CPU Dump,由于 IIS Worker Process 默认会

配置 Idle Timeout = 20 min,即该进程在 20 分钟内没有任何请求的话就会自动结束,这种情况下 ProcDump 也会自动结束。需要重新运行命令。

因此如果目标程序存在这样的配置,需要暂时将该配置取消。

  • 有些系统管理员希望能够运行该工具后退出用户 session,ProcDump 是做不到的,如果有这种需求可以考虑使用 DebugDiag。

  • 在调试 High CPU 问题的时候经常用到的一个命令是!runaway,但是有些时候!runway 在 ProcDump 抓取 Dump 文件的过程中运行不出来,报错信息如下:

0:000> !runaway ERROR: !runaway: extension exception 0x80004002. “Unable to get thread times - dumps may not have time information”

解决方法是将 Debugging Tools for Windows (WinDbg) 安装目录下的 dbghelp.dll 拷贝到 procdump.exe 所在目录下,然后再运行命令抓取 Dump。

四、WinDbg 使用方法

操作步骤如下:

1、抓取异常程序的 Dump 文件。

2、设置符号表

符号表是 WinDbg 关键的“数据库”,如果没有它,WinDbg 基本上就是个废物,无法分析更多问题。所以使用 WinDbg 设置符号表,是必须要走的一步。

  • a、运行 WinDbg 软件,然后按【Ctrl+S】弹出符号表设置窗。

  • b、将符号表地址:SRVC:\Symbols

http://msdl.microsoft.com/download/symbols 粘贴在输入框中(不能换行),点击确定即可。点击确定之前,请先确认红色字的文件夹是否已被新建。

注:红色字C:\Symbols表示符号表本地存储路径,建议固定路径,可避免符号表重复下载。

3、学会打开第一个 Dump 文件!

使用【Ctrl+D】快捷键,或者点击 WinDbg 界面上的【File=>Open Crash Dump…】按钮,来打开一个 Dump 文件。

当你想打开第二个 Dump 文件时,可能因为上一个分析记录未清除,导致无法直接分析 Dump 文件,此时你可以使用快捷键【Shift+F5】来关闭上一个对 Dump 文件的分析记录。

SOS does not support the current target architecture
这个错误的原因是用了32位的任务管理器抓的32位的dump文件。
需要用64位的任务管理器抓32位的dump文件(C:\Windows\SysWOW64\taskmgr.exe)

4、通过简单的几个命令学会分析 Dump 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.loadby sos clr     //首先加载sos

// 或

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.dll

.chain // 显示加载的扩展dll

!runaway // 查看线程运行时间

~22s // 进入线程 22

!clrstack // 查看当前线程堆栈变量值的信息

!dso // 把当前栈上所有的变量都显示出来

调试dump步骤

将dump文件拖入windbg
执行.loadby sos clr或.loadby sos mscorwks加载模块
执行!analyze -v 进行异常分析

调试exe文件步骤

Open Executeable..
执行 sxe ld:clrjit
执行 g
执行.loadby sos clr

5、常用命令

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
.sympath  // 检查sympath是否正确

.sympath srv*c:\Symbols*http://msdl.microsoft.com/download/symbols

也可以在命令行执行
.symfix d:\symbols

!lmi truecrypt // 查找相应的模块信息

!sym noisy // 检查符号表加载详细情况

lm // 列出模块
lmf // 指令列出当前进程中加载的所有DLL文件和对应的路径
lmvm // 查看DLL/EXE文件信息,参数为某个dll文件名称
.loadby sos mscorwks // 指令用于加载.Net 3.5版本及以下模块
.loadby sos clr // 指令用于加载.Net 4.0版本及以上模块

!help sos // 指令帮助
!threads // 显示所有线程
!address // 内存使用情况
!threadpool(!tp) // 显示程序池信息
!ProcInfo // 显示进程信息
!address -summary // 内存概况

!heap // 查看进程堆

!load wow64exts

!sw

.reload // 重新加载

.loadby sos mscorwks

.symfix+ c:\symbols //强制下载symbols

.reload /f; // Force reloading symbols 强制加载符号文件

.cordll -ve -u –l //重新加载调试DLL,这是加载DLL,不是符号
!dumpheap // 显示托管堆的信息
!dumpheap -stat //检查当前所有托管类型的统计信息
!dumpheap -type Person –stat // 在堆中查找指定类型(person)对象,注意大小写敏感
!dumpheap -mt 00007ffdb9386948 -min 200 //查看200byte以上的string
!dumpobj(!do) // 显示一个对象的内容
!DumpStackObjects(!dso) // 当前线程对象分配过程
!do 0000021bcbaf5158 // 使用!do命令查看一个对象的内容
!dumparray(!da) // 显示数组
!syncblk // 显示同步块
!runaway // 显示线程cpu时间
!gcroot // 跟踪对象内存引用
!gcroot 0000021bcbaf5158 //使用!gcroot 查看一个对象的gc根

!DumpObj /d 0000021975972b48 //查看第对象

.cordll -ve -u -l

.chain // 显示加载的扩展dll

.unload C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos // 卸载

!threads -live //查看托管线程

!runaway // 查看线程运行时间

.loadby sos clr

!eeversion

!pe // 打印异常
!ObjSize // 查看对象大小 ObjSize 用于知道对象地址时,查看该对象的大小。
~#s

!clrstack //显示调用栈,只显示托管代码

kb // 显示当前线程的callstack,只显示非托管代码

~*e !clrstack // 所有线程的调用堆栈
.cls // 清屏

!EEStack -EE

参考:

Windbg常用命令

https://www.cnblogs.com/sheng-jie/p/9503650.html

http://mp.weixin.qq.com/s/R6TrIlxqJVgApFP-V2r0GA

http://blog.csdn.net/beanjoy/article/details/39203259

http://www.cnblogs.com/softfair/p/The_version_SOS_not_match_version_of_CLR_PDB_symbol_for_clr_dll_not_loaded.html

http://www.cnblogs.com/Clingingboy/archive/2013/03/26/2983166.html

http://blog.csdn.net/bcbobo21cn/article/details/51683137

CentOS7查看端口占用

Linux命令

netstat -nap #会列出所有正在使用的端口及关联的进程/应用

lsof -i :portnumber #portnumber要用具体的端口号代替,可以直接列出该端口听使用进程/应用

查看监听(Listen)的端口

netstat -lntp

检查端口被哪个进程占用

netstat -lnp|grep 88 #88请换为你的apache需要的端口,如:80

查看进程的详细信息

ps 1777

杀掉进程,重新启动

kill -9 1777 #杀掉编号为1777的进程(请根据实际情况输入)

service httpd start #启动apache

开启远程访问端口

开启端口:

1
firewall-cmd --zone=public --add-port=6379/tcp --permanent

命令含义:

1
2
3
4
5
--zone #作用域

--add-port=27017/tcp #添加端口,格式为:端口/通讯协议

--permanent #永久生效,没有此参数重启后失效

重启防火墙

1
firewall-cmd --reload  #重启防火墙

CentOS7修改静态IP

进入终端

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost toor]# cd /etc/sysconfig/network-scripts
[root@localhost network-scripts]# ls
ifcfg-eno16777736 ifdown-isdn ifup-eth ifup-Team
ifcfg-eno16777736-1 ifdown-post ifup-ib ifup-TeamPort
ifcfg-eno16777736.6BOP8P ifdown-ppp ifup-ippp ifup-tunnel
ifcfg-lo ifdown-routes ifup-ipv6 ifup-wireless
ifcfg-Wired_connection_1 ifdown-sit ifup-isdn init.ipv6-global
ifdown ifdown-Team ifup-plip network-functions
ifdown-bnep ifdown-TeamPort ifup-plusb network-functions-ipv6
ifdown-eth ifdown-tunnel ifup-post route-eno16777736-1
ifdown-ib ifup ifup-ppp
ifdown-ippp ifup-aliases ifup-routes
ifdown-ipv6 ifup-bnep ifup-sit
[root@localhost network-scripts]# vim ifcfg-eno16777736

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
TYPE=Ethernet
BOOTPROTO=static #dhcp改为static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=7b7f487c-4a01-464b-9587-dae9daca6bc9
DEVICE=eno16777736
ONBOOT=yes
IPADDR=192.168.0.122 #静态IP
GATEWAY=192.168.0.1 #默认网关
NETMASK=255.255.255.0 #子网掩码

重启网络服务

1
service network restart

若出现重启失败的话,可以试着把ifcfg-eno文件里的DEVICE一行删除试试

下载安装

官网文档

注: root账户安装

添加RPM

1
yum install https://download.postgresql.org/pub/repos/yum/9.6/redhat/rhel-7-x86_64/pgdg-centos96-9.6-3.noarch.rpm

安装PostgreSQL

1
2
yum install postgresql96         ##客户端包##
yum install postgresql96-server ##服务端包##

安装过程出现问题,可能会导致初始化数据库错误错误,如下:

解决方法:重新执行命令 yum install postgresql96-server

1
2
[root@iz2zeii3e4srrxcoy1gbubz ~]# /usr/pgsql-9.6/bin/postgresql96-setup initdb
-bash: /usr/pgsql-9.6/bin/postgresql96-setup: No such file or directory

初始化数据库,允许自动启动

1
2
3
/usr/pgsql-9.6/bin/postgresql96-setup initdb
systemctl enable postgresql-9.6
systemctl start postgresql-9.6

配置

PostgreSQL 安装完成后,会建立一下‘postgres’用户,用于执行PostgreSQL,数据库中也会建立一个’postgres’用户,默认密码为自动生成,需要在系统中改一下。

修改默认密码

1
2
3
4
5
su - postgres  ##切换用户,执行后提示符会变为 '-bash-4.2$'
psql -U postgres ##登录数据库,执行后提示符变为 'postgres=#'
ALTER USER postgres WITH PASSWORD 'abc123' ## 设置postgres用户密码
\q  ##退出数据库
exit ##退出

开启远程访问

1
vi /var/lib/pgsql/9.6/data/postgresql.conf

修改#listen_addresses = ‘localhost’ 为 listen_addresses=’*’

当然,此处‘*’也可以改为任何你想开放的服务器IP

信任远程连接

1
vi /var/lib/pgsql/9.6/data/pg_hba.conf

修改如下内容,信任指定服务器连接

1
2
3
# IPv4 local connections:
host    all      all      127.0.0.1/32      trust
host    all       all      10.211.55.6/32(需要连接的服务器IP)  trust

打开防火墙

CentOS 防火墙中内置了PostgreSQL服务,配置文件位置在

/usr/lib/firewalld/services/postgresql.xml,

我们只需以服务方式将PostgreSQL服务开放即可。

1
2
firewall-cmd --add-service=postgresql --permanent  开放postgresql服务
firewall-cmd --reload  重载防火墙

重启服务

1
systemctl restart postgresql-9.6.service

开发备注

本地服务器连接数据库出现以下错误:

1
OperationalError: FATAL: Ident authentication failed for user “dbuser”

出现这个错误的原因还是在于上面pg_hba.conf 文件的设置,Debian系(包括ubuntu)默认的pg_hba.conf 文件对于

localhost本地机器的数据库访问方式是ident,它指的是只有Linux shell用户通过同名的postgreSQL 用户才能访问,

也就是pg超级用户postgres 只能由linux 用户postgres 登录后操作。

“postgres”的问题,有两种解决方法:

  • 在执行$ python manage.py shell之前先$su postgres 切换为postgres 用户

  • 修改pg_hba.conf 的客户端访问设置,将laocal 的访问由ident 改为trust,如:

1
2
# TYPE DATABASE USER CIDR-ADDRESS METHOD
local all all trust

修改完pg_hba.conf设置记得重启pg。安装了pg_ctl 也可以用pg_ctl reload。

参考:

官网文档

http://www.jianshu.com/p/7e95fd0bc91a

http://www.cnblogs.com/mchina/archive/2012/06/06/2539003.html

http://blog.csdn.net/wang1144/article/details/8986479

简介

Linux tar(英文全拼:tape archive )命令用于备份文件。

用法

语法

1
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

参数:

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
-A或--catenate 新增文件到已存在的备份文件。
-b<区块数目>或--blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
-B或--read-full-records 读取数据时重设区块大小。
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
-f<备份文件>或--file=<备份文件> 指定备份文件。
-F<Script文件>或--info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
-g或--listed-incremental 处理GNU格式的大量备份。
-G或--incremental 处理旧的GNU格式的大量备份。
-h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
-i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
-k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
-K<文件>或--starting-file=<文件> 从指定的文件开始还原。
-l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
-L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
-m或--modification-time 还原文件时,不变更文件的更改时间。
-M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
-N<日期格式>或--newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
-o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
-O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
-p或--same-permissions 用原来的文件权限还原文件。
-P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-r或--append 新增文件到已存在的备份文件的结尾部分。
-R或--block-number 列出每个信息在备份文件中的区块编号。
-s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
-S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
-t或--list 列出备份文件的内容。
-T<范本文件>或--files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
-u或--update 仅置换较备份文件内的文件更新的文件。
-U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
-v或--verbose 显示指令执行过程。
-V<卷册名称>或--label=<卷册名称> 建立使用指定的卷册名称的备份文件。
-w或--interactive 遭遇问题时先询问用户。
-W或--verify 写入备份文件后,确认文件正确无误。
-x或--extract或--get 从备份文件中还原文件。
-X<范本文件>或--exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-Z或--compress或--uncompress 通过compress指令处理备份文件。
-<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
--after-date=<日期时间> 此参数的效果和指定"-N"参数相同。
--atime-preserve 不变更文件的存取时间。
--backup=<备份方式>或--backup 移除文件前先进行备份。
--checkpoint 读取备份文件时列出目录名称。
--concatenate 此参数的效果和指定"-A"参数相同。
--confirmation 此参数的效果和指定"-w"参数相同。
--delete 从备份文件中删除指定的文件。
--exclude=<范本样式> 排除符合范本样式的文件。
--group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
--help 在线帮助。
--ignore-failed-read 忽略数据读取错误,不中断程序的执行。
--new-volume-script=<Script文件> 此参数的效果和指定"-F"参数相同。
--newer-mtime 只保存更改过的文件。
--no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
--null 从null设备读取文件名称。
--numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
--owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
--posix 将数据写入备份文件时使用POSIX格式。
--preserve 此参数的效果和指定"-ps"参数相同。
--preserve-order 此参数的效果和指定"-A"参数相同。
--preserve-permissions 此参数的效果和指定"-p"参数相同。
--record-size=<区块数目> 此参数的效果和指定"-b"参数相同。
--recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
--remove-files 文件加入备份文件后,就将其删除。
--rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
--same-owner 尝试以相同的文件拥有者还原文件。
--suffix=<备份字尾字符串> 移除文件前先行备份。
--totals 备份文件建立后,列出文件大小。
--use-compress-program=<执行指令> 通过指定的指令处理备份文件。
--version 显示版本信息。
--volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号。

文件操作:

1
2
3
4
5
6
7
8
9
ls      # 查看目录中的文件
ls -F # 查看目录中的文件
ls -l # 显示文件和目录的详细资料
ls -a # 显示隐藏文件
ls *[0-9]* # 显示包含数字的文件名和目录名
rm go.tar # 删除go.tar文件
find mt.cgi # 查找文件名为mt.cgi的文件
df ?h # 查看磁盘剩余空间
find / -name xxx -print # 查找xxx文件

压缩与解压缩:

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
tar -zcvf nginx.tar.gz nginx # 压缩nginx文件夹
tar xvf wordpress.tar # 解压tar格式的文件
tar -tvf myfile.tar # 查看tar文件中包含的文件
tar cf toole.tar tool # 把tool目录打包为toole.tar文件
tar cfz xwyme.tar.gz tool # 把tool目录打包且压缩为xwyme.tar.gz文件,因为.tar文件几乎是没有压缩过的,MT的.tar.gz文件解压成.tar文件后差不多是10MB
tar jcvf /var/bak/www.tar.bz2 /var/www/ # 创建.tar.bz2文件,压缩率高
tar xjf www.tar.bz2 # 解压tar.bz2格式

rar a file1.rar test_file # 创建一个叫做 ‘file1.rar’ 的包
rar a file1.rar file1 file2 dir1 # 同时压缩 ‘file1′, ‘file2′ 以及目录 ‘dir1′
rar x file1.rar # 解压rar包
unrar x file1.rar # 解压rar包
tar -cvf archive.tar file1 # 创建一个非压缩的 tarball
tar -cvf archive.tar file1 file2 dir1 # 创建一个包含了 ‘file1′, ‘file2′ 以及 ‘dir1′的档案文件
tar -tf archive.tar # 显示一个包中的内容
tar -xvf archive.tar # 释放一个包
tar -xvf archive.tar -C /tmp # 将压缩包释放到 /tmp目录下
tar -cvfj archive.tar.bz2 dir1 # 创建一个bzip2格式的压缩包
tar -xvfj archive.tar.bz2 # 解压一个bzip2格式的压缩包
tar -cvfz archive.tar.gz dir1 # 创建一个gzip格式的压缩包
tar -xvfz archive.tar.gz # 解压一个gzip格式的压缩包

gzip -d ge.tar.gz # 解压.tar.gz文件为.tar文件
unzip phpbb.zip # 解压zip文件,windows下要压缩出一个.tar.gz格式的文件

bunzip2 file1.bz2 # 解压一个叫做 ‘file1.bz2′的文件
bzip2 file1 # 压缩一个叫做 ‘file1′ 的文件
gunzip file1.gz # 解压一个叫做 ‘file1.gz’的文件
gzip file1 # 压缩一个叫做 ‘file1′的文件
gzip -9 file1 # 最大程度压缩
zip file1.zip file1 # 创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 # 将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip # 解压一个zip格式压缩包
unzip -n test.zip -d /tmp # 压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。
unzip -o test.zip -d /tmp # #将压缩文件test.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令覆盖原先的文件。

参考:

Linux tar 命令

CentOS7 jenkins配置.Net Core持续部署

jenkins安装

Jenkins官网

1.创建Dockerfile

1
2
3
# 使用touch创建空文件
sudo touch Dockerfile
sudo vim Dockerfile

2.填充一下内容

注:提前更新Docker镜像源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM jenkins

USER root
#更新源并安装缺少的包
RUN apt-get update && apt-get install -y libltdl7 && apt-get update

# 使 jenkins 运行 docker 不需要 sudo
RUN groupadd -o -g 999 docker && usermod -aG docker jenkins
ARG dockerGid=999

RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group

# 解决Docker时区问题
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

USER jenkins
# 解决时区问题
ENV JAVA_OPTS -Duser.timezone=Asia/Shanghai

USER root
# 安装 docker-compose 因为等下构建环境的需要
RUN curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

RUN chmod +x /usr/local/bin/docker-compose

注:可能出现

1
2
3
4
5
[root@localhost Desktop]# curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
curl: (35) Peer reports incompatible or unsupported protocol version.

需要运行以下命令更新:

1
yum update nss curl nss-util nspr

等待时间可能有点长,请耐心等待

运行结果:

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
[root@localhost Desktop]# docker build . -t auto-jenkins
Sending build context to Docker daemon 2.56kB
Step 1/8 : FROM jenkins
---> 7b210b6c238a
Step 2/8 : USER root
---> Using cache
---> 9ce15bde1415
Step 3/8 : RUN apt-get update && apt-get install -y libltdl7 && apt-get update
---> Using cache
---> 3d428282a736
Step 4/8 : RUN groupadd -o -g 999 docker && usermod -aG docker jenkins
---> Using cache
---> 94f6440d5fae
Step 5/8 : ARG dockerGid=999
---> Using cache
---> 3cce8ba121fe
Step 6/8 : RUN echo "docker:x:${dockerGid}:jenkins" >> /etc/group
---> Using cache
---> a0f4fdd6cf3f
Step 7/8 : RUN curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
---> Running in fcdb1deaf0bf
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 617 0 617 0 0 226 0 --:--:-- 0:00:02 --:--:-- 226
100 10.3M 100 10.3M 0 0 591k 0 0:00:17 0:00:17 --:--:-- 1622k
Removing intermediate container fcdb1deaf0bf
---> 1909e02c39da
Step 8/8 : RUN chmod +x /usr/local/bin/docker-compose
---> Running in 409184886de5
Removing intermediate container 409184886de5
---> b0f1c2c53301
Successfully built b0f1c2c53301
Successfully tagged auto-jenkins:latest

出现以上 Successfully 内容代表安装Jenkins成功

启动Jenkins

需要先创建一个Jenkins的配置目录,并且挂载到docker 里的Jenkins目录下

1
mkdir -p /var/jenkins_home

运行

1
2
3
4
5
docker run --name jenkins -p 8080:8080 -p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $(which docker):/bin/docker \
-v /var/jenkins_home:/var/jenkins_home \
-d auto-jenkins

第一行构建一个名称为jenkins的容器,需要使用的 8080 跟 50000 端口,-p 是容器运行开放端口

第二行将宿主机上的 docker.sock 挂载到容器中的相应位置,使得容器中的 docker cli 能跟宿主机的 docker 通信

第三行将宿主机上面的 docker 命令行工具挂载到容器中,使 jenkins 用户能够执行 docker 命令

第四行挂载我们之前创建的配置文件存放目录到 jenkins 用户的 home(对的,jenkins 用户的 home 目录在 /var 下面),建立宿主机的配置目录,挂载进docker容器里,这样容器里的Jenkins配置目录文件就会映射出来

第五行:使用auto-jenkins Image 并且后台启动

运行完这条指令后,出现一串很长的字符串以后,我们的jenkins已经成功启动,可以访问本机的 8080 端口来登录 Jenkins

通过命令docker ps查看运行的镜像

1
2
3
[root@localhost Desktop]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0c63f3ce79b5 auto-jenkins "/bin/tini -- /usr/l…" 12 seconds ago Up 5 seconds 0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp jenkins

删除docker

1
docker rm -f jenkins

配置jenkins

进入容器内

1
docker exec -it jenkins /bin/bash

查看密码:

1
cat /var/jenkins_home/secrets/initialAdminPassword
1
2
3
4
5
oot@localhost Desktop]# docker exec -it jenkins /bin/bash
root@0c63f3ce79b5:/# cat /var/jenkins_home/secrets/initialAdminPassword
fc648ef222a54ac690bec031834885f2
root@0c63f3ce79b5:/# exit
exit

复制输出的内容,粘贴到Administrator password,输入 exit 退出容器,此时进行下一步你会看到此界面,点击 Install suggested plugins

重启:

1
docker restart jenkins

最后,安装推荐插件

忘记管理员密码

1
2
3
4
5
6
7
[root@localhost Desktop]# cd /var/jenkins_home/users/admin/
[root@localhost admin]# ls
config.xml
[root@localhost admin]# vim config.xml
[root@localhost admin]# docker restart jenkins
jenkins
[root@localhost admin]#

<passwordHash>节点的内容(图中黑色的那一串)换成

#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS

重启,默认密码为:111111

参考网址:

http://www.cnblogs.com/LongJiangXie/p/7517909.html

http://www.cnblogs.com/stulzq/p/8627360.html

http://www.cnblogs.com/JacZhu/p/6814848.html

单机安装

1、首先去官网下载zookeeper的包 zookeeper-3.4.10.tar.gz

2、用FTP文上传到/usr/local下

3、解压文件 tar -zxvf zookeeper-3.4.10.tar.gz

4、在conf文件夹下新建zoo.cfg文件,或者使用里面自带的zoo_sample.cfg,重新拷贝

cp zoo_sample.cfg zoo.cfg

zoo.cfg文件内容:

1
2
3
4
tickTime=2000
dataDir=/usr/local/zookeeper/zookeeper-3.4.10/data
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.10/logs
clientPort=4180

5、运行server脚本

需要在root账户下启动:

1
[root@localhost zookeeper-3.4.10]# ./bin/zkServer.sh start

6、Server启动之后, 就可以启动client连接server了, 执行脚本:

1
[root@localhost zookeeper-3.4.10]# ./bin/zkCli.sh -server localhost:4180

7,检查状态

1
[root@localhost zookeeper-3.4.10]# ./bin/zkServer.sh start

8,停止

1
[root@localhost zookeeper-3.4.10]# ./bin/zkServer.sh stop

伪集群模式

所谓伪集群, 是指在单台机器中启动多个zookeeper进程, 并组成一个集群. 以启动3个zookeeper进程为例

  • 复制三份zookeeper,(权限需要使用root帐号)
1
2
3
4
5
[toor@localhost zookeeper]$ su root
Password:
[root@localhost zookeeper]# cp -r zookeeper-3.4.10 zookeeper-3.4.10-1
[root@localhost zookeeper]# cp -r zookeeper-3.4.10 zookeeper-3.4.10-2
[root@localhost zookeeper]# cp -r zookeeper-3.4.10 zookeeper-3.4.10-3
  • 配置每个zookeeper文件夹中对应的配置文件

1,zookeeper-3.4.10-1中的zoo.cfg文件

1
2
3
4
5
6
7
8
9
10
tickTime=2000
initLimit=5
syncLimit=2
tickTime=2000
dataDir=/usr/local/zookeeper/zookeeper-3.4.10-1/data
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.10-1/logs
clientPort=4180
server.0=127.0.0.1:8880:7770
server.1=127.0.0.1:8881:7771
server.2=127.0.0.1:8882:7772

2,zookeeper-3.4.10-2中的zoo.cfg文件

1
2
3
4
5
6
7
8
9
10
tickTime=2000
initLimit=5
syncLimit=2
tickTime=2000
dataDir=/usr/local/zookeeper/zookeeper-3.4.10-2/data
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.10-2/logs
clientPort=4180
server.0=127.0.0.1:8880:7770
server.1=127.0.0.1:8881:7771
server.2=127.0.0.1:8882:7772

3,zookeeper-3.4.10-3中的zoo.cfg文件

1
2
3
4
5
6
7
8
9
10
tickTime=2000
initLimit=5
syncLimit=2
tickTime=2000
dataDir=/usr/local/zookeeper/zookeeper-3.4.10-3/data
dataLogDir=/usr/local/zookeeper/zookeeper-3.4.10-3/logs
clientPort=4180
server.0=127.0.0.1:8880:7770
server.1=127.0.0.1:8881:7771
server.2=127.0.0.1:8882:7772

发现只有dataDir和dataLogDir还有clientPort这三个参数不一致,其他参数完全一致。

  • 配置myid

    在这三个datadir配置的路径下/Users/zookeeper0、1、2上增加myid文件,里面依次填上0、1、2。

    数字0、1、2和每个conf/zoo.cfg中的server.0、server.1、server.2的数字一一对应,让zookeeper知道你是哪个server

  • 依次启动zookeeper节点服务

1
./bin/zkServer.sh start

检查状态

1
./bin/zkServer.sh status

客户端连接

1
./bin/zkCli.sh -server localhost:4180

看到输出显示有下列信息,表示启动,配置成功!

1
Welcome to ZooKeeper!

集群模式

集群模式, 各server部署在不同的机器上, 因此各server的conf/zoo.cfg文件可以完全一样(是所有都一样)

他们的zookeeper的conf下的zoo.cfg文件为:

1
2
3
4
5
6
7
8
9
tickTime=2000
initLimit=5
syncLimit=2
dataDir=/home/zookeeper/data
dataLogDir=/home/zookeeper/logs
clientPort=4180
server.1=192.168.1.130:2888:3888
server.2=192.168.1.131:2888:3888
server.3=192.168.1.132:2888:3888

部署了3台zookeeper server, 分别部署在192.168.1.130, 192.168.1.131, 192.168.1.132上。

各server的dataDir目录下的myid文件中的数字必须不同。

  192.168.1.130 server的myid为1

  192.168.1.131 server的myid为2

  192.168.1.132 server的myid为3

至此,所有的安装与部署就都搞定了。

ZooKeeper服务命令:

在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作

  1. 启动ZK服务: sh bin/zkServer.sh start
  2. 查看ZK服务状态: sh bin/zkServer.sh status
  3. 停止ZK服务: sh bin/zkServer.sh stop
  4. 重启ZK服务: sh bin/zkServer.sh restart

zoo.cfg配置详解:

tickTime:Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,每个tickTime 时间就会发送一个心跳。

dataDir:Zookeeper 保存数据的目录,默认情况下,Zookeeper 将写数据的日志文件也保存在这个目录里。

clientPort:客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。

initLimit:Leader和Follower初始化连接时最长能忍受多少个心跳时间间隔数。总的时间长度就是 5*2000=10 秒。

syncLimit:Leader 与 Follower之间发送消息,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。

server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。

myid文件:

除了修改 zoo.cfg 配置文件,集群模式下还要配置一个文件 myid,这个文件在 dataDir 目录下,这个文件里面就有一个数据就是 A 的值,Zookeeper 启动时会读取这个文件,拿到里面的数据与 zoo.cfg 里面的配置信息比较从而判断到底是哪个server。

server.1=10.1.39.43:2888:3888,很多人不理解为啥后面有两个端口?解释一下:

2888:标识这个服务器与集群中的leader服务器交换信息的端口

3888:leader挂掉时专门用来进行选举leader所用的端口

参考:

http://www.cnblogs.com/hzg110/p/6921886.html

使用ab进行站点压力测试

压力测试相关概念

  • 吞吐率(Requests per second)

    概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
    计算公式:总请求数 / 处理完成这些请求数所花费的时间,即
    Request per second = Complete requests / Time taken for tests

  • 并发连接数(The number of concurrent connections)

    概念:某个时刻服务器所接受的请求数目,简单的讲,就是一个会话。

    并发用户数(The number of concurrent users,Concurrency Level)

    概念:要注意区分这个概念和并发连接数之间的区别,一个用户可能同时会产生多个会话,也即连接数。

  • 用户平均请求等待时间(Time per request)

    计算公式:处理完成所有请求数所花费的时间/ (总请求数 / 并发用户数),即
    Time per request = Time taken for tests /( Complete requests / Concurrency Level)

  • 服务器平均请求等待时间(Time per request: across all concurrent requests)

    计算公式:处理完成所有请求数所花费的时间 / 总请求数,即
    Time taken for / testsComplete requests
    可以看到,它是吞吐率的倒数。
    同时,它也=用户平均请求等待时间/并发用户数,即
    Time per request / Concurrency Level

下载工具

官网下载网址

解压压缩包,进入到httpd-2.4.25-win64-VC14\Apache24\bin目录下,
打开命令行,输入命令

运行测试

1
ab -n 100 -c 10 http://baidu.com/

其中-n表示请求数,-c表示并发数

测试结果

测试结果

完整测试报告

服务器信息

显示服务器为apache,域名,端口;
1
2
3
Server Software:        Apache
Server Hostname: baidu.com
Server Port: 80

文档信息

所在位置“/”,文档的大小为338436 bytes(此为http响应的正文长度)
1
2
Document Path:          /
Document Length: 81 bytes

重要信息

1
2
3
4
5
6
7
8
9
10
Concurrency Level:      10
Time taken for tests: 2.584 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 38100 bytes
HTML transferred: 8100 bytes
Requests per second: 38.70 [#/sec] (mean)
Time per request: 258.374 [ms] (mean)
Time per request: 25.837 [ms] (mean, across all concurrent requests)
Transfer rate: 14.40 [Kbytes/sec] received
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
//并发请求数
Concurrency Level: 10

//整个测试持续的时间
Time taken for tests: 2.584 seconds

//完成的请求数
Complete requests: 100

//失败的请求数
Failed requests: 0

//整个场景中的网络传输量
Total transferred: 13701482 bytes

//整个场景中的HTML内容传输量
HTML transferred: 13197000 bytes

//吞吐率,大家最关心的指标之一,相当于 LR 中的每秒事务数,后面括号中的 mean 表示这是一个平均值
Requests per second: 38.70 [#/sec] (mean)

//用户平均请求等待时间,大家最关心的指标之二,相当于 LR 中的平均事务响应时间,后面括号中的 mean 表示这是一个平均值
Time per request: 258.374 [ms] (mean)

//服务器平均请求处理时间,大家最关心的指标之三
Time per request: 25.837 [ms] (mean, across all concurrent requests)

//平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题
Transfer rate: 14.40 [Kbytes/sec] received

网络上消耗的时间的分解

1
2
3
4
5
6
Connection Times (ms)
min mean[+/-sd] median max
Connect: 12 25 38.9 20 408
Processing: 8 223 120.3 196 591
Waiting: 8 142 124.9 120 574
Total: 29 248 125.7 217 609

网络消耗时间

这段是每个请求处理时间的分布情况,50%的处理时间在217ms内,66%的处理时间在224ms内…,重要的是看90%的处理时间

1
2
3
4
5
6
7
8
9
10
Percentage of the requests served within a certain time (ms)
50% 217
66% 224
75% 246
80% 249
90% 595
95% 604
98% 609
99% 609
100% 609 (longest request)

登录的问题

有时候进行压力测试需要用户登录,怎么办?
请参考以下步骤:

先用账户和密码登录后,用开发者工具找到标识这个会话的Cookie值(Session ID)记下来
如果只用到一个Cookie,那么只需键入命令:
ab -n 100 -C key=value http://baidu.com/

如果需要多个Cookie,就直接设Header:
ab -n 100 -H “Cookie: Key1=Value1; Key2=Value2” http://baidu.com/

同类型的压力测试工具还有:webbench、siege、http_load等

参考:

http://www.cnblogs.com/lpfuture/p/5740831.html