Jenkins~通过WebDeploy实现自动部署

Jenkins以之前的文章中已经有所介绍,主要集成了自动化部署的功能,而对于自动化部署来说是由多个组件组成的,每个组件负责自己的事,如今天说的webDeploy,它主要实现将网站文件动态发布到另一台IIS服务器,并且它是决断安全的,最起始比net use要安全!

Jenkins自动化发布的一些组件

--------------------------jenkins核心功能-----------------

建立项目

配置项目的源代码路径(svn,git,tfs)

配置工作区里相对路径(工作区就是你的项目,相对目录就是在项目路径下再建立一个子文件夹)

获取源代码

发布源代码(配置web.config生产环境参数,iis用户,网络目录权限(local_service),msbuild)

将发布后的目标网络(msbuild+webDeploy 或者 powershell)

---------------------------------------------------

WebDeploy实现过程(IIS服务器)

  • 安装IIS管理工具
  • 开启远程连接,设置对应端口
  • 添加权限用户
  • 配置网站目录权限
  • 打开项目,配置发布,选择IIS/FTP
  • 输入发布参数,IIS服务器地址,用户名和密码,网站名称等

1、安装IIS管理工具

未分类

2、开启远程连接,设置对应端口

未分类

3、添加权限用户

未分类

4、配置网站目录权限

未分类

打开项目,配置发布,选择IIS/FTP

未分类

6、输入发布参数,IIS服务器地址,用户名和密码,网站名称等

未分类

然后发布已经后,就可以发到我们的IIS服务器了!

现在webDeploy和jenkins合并,确实有点双剑合并的感觉!

Ubuntu 16.04 安装 Jenkins

安装、启动并配置jenkins服务

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
systemctl status jenkins.service
● jenkins.service - LSB: Start Jenkins at boot time
Loaded: loaded (/etc/init.d/jenkins; bad; vendor preset: enabled)
Active: failed (Result: exit-code) since 一 2017-09-18 20:02:02 CST; 5min ago

 Docs: man:systemd-sysv-generator(8)

9月 18 20:02:02 DH9K45ER2 systemd[1]: Starting LSB: Start Jenkins at boot time...
9月 18 20:02:02 DH9K45ER2 jenkins[4785]: ERROR: No Java executable found in current PATH: /bin:/usr/bin:/sbin:/usr/sbin
9月 18 20:02:02 DH9K45ER2 jenkins[4785]: If you actually have java installed on the system make sure the executable is in the aforementioned path and that 't
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Control process exited, code=exited status=1
9月 18 20:02:02 DH9K45ER2 systemd[1]: Failed to start LSB: Start Jenkins at boot time.
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Unit entered failed state.
9月 18 20:02:02 DH9K45ER2 systemd[1]: jenkins.service: Failed with result 'exit-code'.
cat /etc/services | grep 8080 
http-alt 8080/tcp webcache # WWW caching service
http-alt 8080/udp

从日志看出Jenkins在默认情况下从8080端口启动。在这个系统端口中,8080已经在使用中了。所以在/etc/default/jenkins.修改Jenkins默认端口设置

修改/etc/default/目录下面的jenkins文件,将以下内容

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8080

修改为:

# port for HTTP connector (default 8080; disable with -1)
HTTP_PORT=8089

启动停止Jenkins

sudo service jenkins start
sudo service jenkins stop

访问路径:http://localhost:8089

其他说明

  • 安装路径:/var/lib/jenkins
  • 日志路径:/var/log/jenkins/jenkins.log

Jenkins初始化配置

1、解锁Jenkins

这里需要/var/lib/jenkins/secrets/initialAdminPassword的密码解锁Jenkins
然后把密码复制进去。

说明:按照弹框提示,找到该initialAdminPassword文件,我这里使用Docker启动Jenkins,并且把jenkins_home目录挂载到我磁盘指定目录,所以这里我只需要复制/Users/wanyang3/jenkins_home/initialAdminPassword即可,如果非挂载方式Docker启动,则需要进入容器内根据提示路径找到该文件。

2、定制 Jenkins

说明:这里若选择Install suggested plugins安装,那么jenkins就会给你推荐安装一些很有用的插件,若选择Select plugins to install安装,那么就需要自己根据业务需要选择性安装某些插件。

3、创建第一个管理员用户

说明:这里创建第一个管理员用户,也可以不设置,直接点击“Continue as admin”,进入jenkins以后再设置。

新建Pipeline Job Demo

创建一个pipeline job

/var/lib/jenkins/config.xml
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.GlobalMatrixAuthorizationSt
rategy">

<permission>hudson.model.Computer.Configure:admin</permission> 
<permission>hudson.model.Computer.Connect:admin</permission> 
<permission>hudson.model.Computer.Create:admin</permission>
<permission>hudson.model.Computer.Delete:admin</permission>
<permission>hudson.model.Computer.Disconnect:admin</permission> 
<permission>hudson.model.Hudson.Administer:admin</permission> 
<permission>hudson.model.Hudson.Read:admin</permission> 
<permission>hudson.model.Hudson.Read:anonymous</permission> 
<permission>hudson.model.Hudson.RunScripts:admin</permission> 
<permission>hudson.model.Item.Build:admin</permission> 
<permission>hudson.model.Item.Cancel:admin</permission> 
<permission>hudson.model.Item.Configure:admin</permission> 
<permission>hudson.model.Item.Create:admin</permission> 
<permission>hudson.model.Item.Delete:admin</permission> 
<permission>hudson.model.Item.Discover:admin</permission> 
<permission>hudson.model.Item.Read:admin</permission> 
<permission>hudson.model.Item.Workspace:admin</permission> 
<permission>hudson.model.Run.Delete:admin</permission> 
<permission>hudson.model.Run.Update:admin</permission> 
<permission>hudson.model.View.Configure:admin</permission> 
<permission>hudson.model.View.Create:admin</permission> 
<permission>hudson.model.View.Delete:admin</permission> 
<permission>hudson.model.View.Read:admin</permission> 
<permission>hudson.scm.SCM.Tag:admin</permission> 
</authorizationStrategy> 

</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">

<disableSignup>false</disableSignup> 
<enableCaptcha>false</enableCaptcha> 

修改用户密码

/var/lib/jenkins/users/user/config.xml
<hudson.security.HudsonPrivateSecurityRealm_-Details>
<passwordHash>#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS</passwordHash>
</hudson.security.HudsonPrivateSecurityRealm_-Details>

注:密码为111111

Jenkins详细安装配置

使用docker安装Jenkins

安装docker

yum install -y docker

启动docker

service docker start

创建一个目录保存Jenkins数据

mkdir /home/data
chmod -R 777 /home/data
docker run --name myjenkins -p 8080:8080 -p 50000:50000 -v /home/data:/var/jenkins_home jenkins

启动成之后,开始配置Jenkins

使用游览器访问

http://IP:8080

这时候出现如下画面,需要输入Administrator password

未分类

执行命令

docker exec -it myjenkins cat /var/jenkins_home/secrets/initialAdminPassword

就能查到Administrator password

未分类

开始安装插件

标准安装和自定义安装,可以点击标准安装,直接开始安装

未分类

这里等的时间会比较长一点

安装成功之后,设置用户名和密码

未分类

安装成功之后显示

未分类

在Linux上安装与配置GitLab

一、简介

  • GitLab是一个开源的版本管理系统,提供了类似于GitHub的源代码浏览,管理缺陷和注释等功能,你可以将代码免费托管到GitLab.com,而且不限项目数量和成员数;
  • 最吸引人的一点是允许在自己的服务器上搭建GitLab CE(社区免费版)版本,方便内部团队协作开发和代码管理;
  • 本文将介绍如何在Linux服务器上使用包管理器搭建GitLab CE版本,以及一些基本的配置;

二、资源

GitLab官网: https://about.gitlab.com/installation/
Gmail: https://about.gitlab.com/installation/

三、CentOS系统

1、更新软件源

  • 配置国内的软件源,请详见 https://www.xiaocoder.com/2017/02/21/resource-1/ ;
  • 需要配置CentOS Base源与epel源;

2、添加GitLab源

$ vim /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
$ yum makecache fast && yum update -y

3、安装邮件服务

$ yum install -y postfix
$ systemctl enable postfix
$ systemctl start postfix

4、安装GitLab

  • GitLab自带了Web服务器(Nginx),若需要使用服务器已有的Nginx,需要额外的配置;
$ yum install -y gitlab-ce

未分类

四、Docker

1、更新软件源

  • 配置国内的软件源,请详见《CentOS/Ubuntu的国内软件源》;

2、安装Docker服务

  • 在服务器上安装Docker CE,安装指南请参考《在Linux上安装Docker》;

3、GitLab镜像

  • 官网资源: https://docs.gitlab.com/ce/install/docker.html

五、配置GitLab

1、配置服务端口

external_url 'http://ip_address:new-port'

2、邮件服务

Gmail

  • 请自行更改smtp_user_name与smtp_password;
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.gmail.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp.gmail.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = false
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'

QQ exmail(腾讯企业邮箱)

  • 请自行更改smtp_user_name、smtp_password与gitlab_email_from;
gitlab_rails['smtp_enable'] = true 
gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp.exmail.qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true 
gitlab_rails['smtp_tls'] = true 
gitlab_rails['gitlab_email_from'] = 'smtp user'

Outlook

  • 请自行更改smtp_user_name、smtp_password与gitlab_email_from;
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp-mail.outlook.com"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "smtp user"
gitlab_rails['smtp_password'] = "smtp password"
gitlab_rails['smtp_domain'] = "smtp-mail.outlook.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
gitlab_rails['gitlab_email_from'] = 'smtp user'

其他邮件服务

  • 其他邮件服务的设置,请参照官网: https://docs.gitlab.com/omnibus/settings/smtp.html ,此处就不再赘述了;

测试操作

$ gitlab-rails console
irb(main):001:0> Notify.test_email('[email protected]', 'Hello', 'Hello, World').deliver_now

3、重新生成配置

  • 每一次修改配置文件,都要执行此操作;
$ gitlab-ctl reconfigure

六、界面使用

1、设置密码

  • 首次访问,http://172.18.20.100,页面会提示设置管理员的密码;
  • 管理员:root,密码:<自定义>;

未分类

2、关闭头像

  • 点击Admin area(小扳手),然后点击Settings,取消勾选Gravatar enabled;

未分类

3、禁用注册

  • 点击Admin area(小扳手),然后点击Settings,取消勾选Sign-up enabled;

未分类

4、自定义页面布局

  • 点击个人的Settings,然后点击Preferrences,就可以自定义页面布局了;
  • 建议配置:
    • Syntax highlighting theme:Solarized Dark;
    • New Navigation:New;
    • Layout width:Fluid;

七、命令使用

1、启动服务

$ gitlab-ctl start

2、停止服务

$ gitlab-ctl stop

3、获取运行状态

$ gitlab-ctl status

4、获取帮助信息

$ gitlab-ctl --help

脚本:将不属于属于Linux默认用户找出来

导读:将不属于linux默认模板的用户找出来,虽然可以直接查看/etc/passwd文件,不过,如果用户多了不觉得繁琐吗?

最近在工作中,需要将生产服务器中所有不是默认的账户进行统计。额、用 计划生育的话来说:”给所有的生产服务器进行一次账户普查”。如果说,使用cat /etc/passwd 固然也能很好的完成任务。但是,在一些复杂的系统当中,用户名千奇百怪。为了不遗漏,也为了偷懒。就小小的搞了一段shell脚本来完成这个工作。

使用过程中也出现了各种问题,例如:某个用户叫aadm,有个系统默认的用户交adm。悲剧的事情发生了,grep开始未做精确匹配(-w),导致遗漏掉。在这里主要吐槽某些开发者,能不能别起一些相似度很高的名字来混淆视听。

未分类

貌似,这样还可以定时排查下,是否有莫名账户存在于你的系统中。提高系统安全。

脚本代码

#!/bin/bash

#作者:shengbao

#时间:20170330

#作用:将不属于系统默认的用户查找出来

#更新记录

#更新时间:20170331

#更新内容:grep 添加参数-w,精确匹配。

userlist=`cat <<eof

root

bin

daemon

adm

lp

sync

shutdown

halt

mail

uucp

operator

games

gopher

ftp

nobody

dbus

rpc

usbmuxd

oprofile

vcsa

rtkit

abrt

hsqldb

avahi-autoipd

saslauth

postfix

rpcuser

nfsnobody

haldaemon

gdm

ntp

apache

pulse

sshd

tcpdump

yunwei

eof`

cat /etc/passwd | awk -F ':' '{print $1}'|grep -Fvw "$userlist"

rm -rf $0

Linux设置环境变量的方法和区别

设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别。

通过文件设置 Linux 环境变量

首先是设置全局环境变量,对所有用户都会生效:

  • etc/profile: 此文件为系统的每个用户设置环境信息。当用户登录时,该文件被执行一次,并从 /etc/profile.d 目录的配置文件中搜集shell 的设置。一般用于设置所有用户使用的全局变量。
  • /etc/bashrc: 当 bash shell 被打开时,该文件被读取。也就是说,每次新打开一个终端 shell,该文件就会被读取。

接着是与上述两个文件对应,但只对单个用户生效:

  • ~/.bash_profile 或 ~/.profile: 只对单个用户生效,当用户登录时该文件仅执行一次。用户可使用该文件添加自己使用的 shell 变量信息。另外在不同的LINUX操作系统下,这个文件可能是不同的,可能是 ~/.bash_profile, ~/.bash_login 或 ~/.profile 其中的一种或几种,如果存在几种的话,那么执行的顺序便是:~/.bash_profile、 ~/.bash_login、 ~/.profile。比如 Ubuntu 系统一般是 ~/.profile 文件。
  • ~/.bashrc: 只对单个用户生效,当登录以及每次打开新的 shell 时,该文件被读取。

此外,修改 /etc/environment 这个文件也能实现环境变量的设置。/etc/environment 设置的也是全局变量,从文件本身的作用上来说, /etc/environment 设置的是整个系统的环境,而/etc/profile是设置所有用户的环境。有几点需注意:

  • 系统先读取 etc/profile 再读取 /etc/environment(还是反过来?)
  • /etc/environment 中不能包含命令,即直接通过 VAR=”…” 的方式设置,不使用 export 。
  • 使用 source /etc/environment 可以使变量设置在当前窗口立即生效,需注销/重启之后,才能对每个新终端窗口都生效。

修改 Linux 环境变量实例

以 Ubuntu 为例,修改 ~/.profile 文件:

vim ~/.profile

如果该文件存在,则在文件的最后看到如下代码,PATH 变量的值使用冒号(:)隔开的:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi

在最后加上代码 PATH=”$PATH:/usr/local/hadoop/bin”,注意等号(=)两边不要有空格,即:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
PATH="$PATH:/usr/local/hadoop/bin"

因为这个文件是在用户登陆是才读取一次的,所以需要重启才会生效(修改 /etc/profile、/etc/environment 也是如此)。但可以使用命令 source ./.profile 使其立即生效。通过 echo $PATH 可以看到修改后的变量值:

source ./.profile
echo $PATH

通过 Shell 命令 export 修改 Linux 环境变量

另一种修改 Linux 环境变量的方式就是通过 Shell 命令 export,注意变量名不要有美元号 $,赋值语句中才需要有:

export PATH=$PATH:/usr/local/hadoop/bin
  • export 方式只对当前终端 Shell 有效
  • 使用 export 设置的变量,只对当前终端 Shell 有效,也就是说如果新打开一个终端,那这个 export 设置的变量在新终端中使无法读取到的。适合设置一些临时变量。

根据变量所需,选择设置方式,例如 JAVA_HOME 这类变量,就适合将其设为为全局变量,可在 /etc/environment 中设置。

9个Linux系统常用监控命令

我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的。但是这不是打开机器电源然后放任不管就可以得到的。所以我们要监视系统的运行状况,发现问题及时处理。

对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作。监控和保持系统启动并运行是很不容易的一件事。因此实验楼介绍部分linux的系统监控命令。

(1)Linux进程监控:TOP

Linux下的Top命令是一个性能监控程序,许多系统管理员常常用它来监控Linux性能,在许多Linux或者类Unix操作系统里都有这个命令。

Top命令用于按一定的顺序显示所有正在运行而且处于活动状态的实时进程,而且会定期更新显示结果。这条命令显示了CPU的使用率、内存使用率、交换内存使用大小、高速缓存使用大小、缓冲区使用大小,进程PID、所使用命令以及其他。它还可以显示正在运行进程的内存和CPU占用多的情况。

$ top

操作截图:

未分类

在图中依次可以看到进程PID,进程用户,CPU使用率,内存使用率、交换内存使用大小等等信息。top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.

通过man top可以查看到详细的top命令使用方式。

$ man top

操作截图:

未分类

(2)虚拟内存统计 : vmstat

Linux 的 VmStat 命令用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 块、中断、CPU 活动 等的统计信息。

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,

$ vmstat 2 1
$ vmstat 2 2

操作截图:

未分类

如果要求vmstat每2秒采集数据,一直采集,直到结束程序(Ctrl+c)。则省略采集次数:

$ vmstat 2

测试参数讲解:

  • r :表示运行队列,如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高
  • b :表示阻塞的进程数swpd :虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器
  • free :空闲的物理内存的大小
  • buff : 系统占用的缓存大小
  • cache :直接用来记忆我们打开的文件,给文件做缓冲
  • si :每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了
  • us :用户CPU时间
  • sy :系统CPU时间
  • so : 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
  • sy : 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
  • id : 空闲 CPU时间,一般来说,id + us + sy = 100
  • wt : 等待IO CPU时间。

(3)列出打开的文件:lsof

它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。

使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。使用这条命令,你可以很容易地看到正在使用哪个文件。

$ lsof

操作截图:

未分类

此命令运行的结果较长,截图部分。

(4)网络包分析器:tcpdump

Tcpdump是最广泛使用的网络包分析器或者包监控程序之一,它用于捕捉或者过滤网络上指定接口上接收或者传输的TCP/IP包。

它还有一个选项用于把捕捉到的包保存到文件里,以便以后进行分析。

  • -h:查看命令帮助
  • -i:网络接口
  • -c :需要输出包数量
$ sudo apt-get update
$ sudo apt-get install tcpdump 
$ tcpdump -h
$ sudo tcpdump -i eth0 -c 3

操作截图:

未分类

(5)网络状态统计:netstat

Netstat是一个用于监控进出网络的包和网络接口统计的命令行工具。它是一个非常有用的工具,系统管理员可以用来监控网络性能,定位并解决网络相关问题。

  • -h: 查看帮助
  • -r:
  • -i:查看网络接口
$ netstat -h
$ netstat -r
$ netstat -i

操作截图:

未分类

未分类

(6)进程监控:Htop

Htop 是一个非常高级的交互式的实时linux进程监控工具。 它和top命令十分相似,但是它具有更丰富的特性,例如用户可以友好地管理进程,快捷键,垂直和水平方式显示进程等等。

Htop是一个第三方工具,它不包含在linux系统中,你需要使用管理工具去安装它。

$ sudo apt-get install htop
$ htop

未分类

(7)监控Linux磁盘I/O :iotop

iotop命令同样也非常类似于top命令和Htop程序,不过它具有监控并显示实时磁盘I/O和进程的统计功能。在查找具体进程和大量使用磁盘读写进程的时候,这个工具就非常有用。

这个命令只有在kernelv2.6.20及以后的版本中才有。python版本需要 python2.7及以上版本。由于系统原因,实验环境并不支持此命令。此处仅做介绍。

(8)输入/输出统计:iostat

iostat是一个用于收集显示系统存储设备输入和输出状态统计的简单工具。这个工具常常用来追踪存储设备的性能问题,其中存储设备包括设备、本地磁盘,以及诸如使用NFS等的远端磁盘。

$ sudo apt-get install sysstat
$ iostat

操作截图:

未分类

各项含义: avg-cpu段:

  • %user: 在用户级别运行所使用的CPU的百分比.
  • %nice:优先进程消耗的CPU时间,占所有CPU的百分比.
  • %system: 在系统级别(kernel)运行所使用CPU的百分比.
  • %iowait: CPU等待硬件I/O时,所占用CPU百分比.
  • %steal: 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比.
  • %idle: CPU空闲时间的百分比.

Device段:

  • tps: 每秒钟发送到的I/O请求数.
  • KB_read /s: 每秒读取的block数.
  • KB_wrtn/s: 每秒写入的block数.
  • KB_read: 启动到现在 读入的block总数.
  • KB_wrtn: 启动到现在写入的block总数.

查看帮助:

$ man iostat

(9)实时局域网IP监控:IPTraf

IPTraf是一个在Linux控制台运行的、开放源代码的实时网络(局域网)监控应用。它采集了大量信息,比如通过网络的IP流量监控,包括TCP标记、ICMP详细信息、TCP/UDP流量分离、TCP连接包和字节数。同时还采集有关接口状态的常见信息和详细信息:TCP、UDP、IP、ICMP、非IP,IP校验和错误,接口活动等。

$ sudo apt-get install iptraf
$ sudo iptraf

操作截图(注意图片中下面的提示操作信息。):

未分类

未分类

查看命令帮助信息,根据需要选择合适的参数,进行监控。此处便不再赘述命令参数:

$ sudo iptraf -h

Linux如何查看端口被哪个进程占用

lsof -i:端口号

lsof -i:端口号,用于查看某一端口的占用情况,比如查看22号端口使用情况,lsof -i:8080,如下图

[root@master bin]# lsof -i:8080
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
java    4509 root  241u  IPv6  35534      0t0  TCP *:webcache (LISTEN)

netstat -tunlp|grep 端口号

netstat -tunlp|grep 端口号,用于查看指定端口号的进程情况,如查看22端口的情况,netstat -tunlp|grep 8080,如下图

[root@master bin]# netstat -tunlp | grep 8080
tcp        0      0 :::8080                     :::*                        LISTEN      4509/java

Nginx+uWSGI+Mysql+Django+Virtualenv环境部署

安装软件包

我的Linux是Ubuntu,需要安装Python3,如果你需要安装其他版本替换即可

sudo apt-get install mysql-server python3 python-dev python3-pip virtualenv

配置Virtualenv及Python环境

首先,这个Virtualenv并不是必须的,他的作用就是创建一个“隔离”的Python运行环境。

我想大家都碰到过在一台电脑上同时开发多个应用程序,如果应用A需要Python 2.7,而应用B需要Python 2.6怎么办?有时还会碰到不只是Python版本的不一致,比如Django等软件包版本。

这种情况下,每个应用可能需要各自拥有一套“独立”的Python运行环境。

1、新建独立运行环境,命名为pyblog_env

virtualenv pyblog_env --python=python3.5 --no-site-packages

–python指定Python版本 –no-site-packages不复制系统已安装Python包

2、进入pyblog_env环境

source pyblog_env/bin/activate

这时会发现命令提示符前面多了一个(pyblog_env),变成(pyblog_env)user@hostname:~$ 这种形式,这表示我们已经进入到刚刚创建的虚拟环境。 然后再通过pip安装包,都会安装到这个环境下,不会对系统环境造成影响。 退出虚拟环境命令:deactivate

3、安装项目依赖

pip3 install django PyMySQL mysqlclient Pillow
#如果有需求文件,比如requirements.txt,则执行
pip3 install -r requirements.txt

Django项目配置

1、上传Django项目,我的项目在GitHub。

git clone https://github.com/zytx/pyblog.git

2、配置项目的数据库信息

3、数据迁移

python manage.py makemigrations
python manage.py migrate

4、建立超级用户:

python manage.py createsuperuser

5、收集静态文件:

python manage.py collectstatic

6、测试项目 运行开发服务器看项目能否正常运行

python manage.py runserver 0.0.0.0:8000

访问ip:8000看是否出错

uWSGI 配置

退出刚才进入的虚拟环境,使用命令:deactivate

1、安装uWSGI

pip3 install uwsgi

2、运行测试:

uwsgi --http :8000 --home /home/zytx/pyblog_env/ --chdir /home/zytx/pyblog_env/pyblog -w pyblog.wsgi

–home Virtualenv的虚拟环境目录 –chdir Django项目目录

如果访问IP:8000可以看到项目,就说明Python环境和uWSGI是没有问题的

3、创建配置文件 接下来在项目里新建一个配置文件uwsgi.ini

[uwsgi]
# 项目根目录路径(full path)
chdir           = /home/zytx/pyblog_env/pyblog/
# Django的 wsgi 文件
module          = pyblog.wsgi:application
# virtualenv目录 (full path)
home            = /home/zytx/pyblog_env/

master          = true
# 最大工作进程数(CPU密集型建议设为CPU核心数,IO密集型建议设为CPU核心数的两倍)
processes       = 2
# unix套接字文
socket          = /home/zytx/pyblog_env/pyblog.sock
# socket文件权限
chmod-socket    = 777
# 退出时清空环境
vacuum          = true

4、后台启动uWSGI

uwsgi /home/zytx/pyblog_env/pyblog/uwsgi.ini&

Nginx 配置

1、创建配置文件

sudo vi /etc/nginx/sites-available/pyblog

加入如下内容:

server {
    listen 80;
    server_name www.immrz.com;
    root /home/zytx/pyblog_env/pyblog/;

        location /media/  {
            #如果你的media目录不在root里,可以配置 alias /path/to/your/mysite/media;
        }

        location  /static/ {
            #如果你的static目录不在root里,可以配置 alias /path/to/your/mysite/static;
        }

        location / {
            uwsgi_pass  unix:///home/zytx/pyblog_env/pyblog.sock;
            include uwsgi_params; # the uwsgi_params file you installed
        }
}

软连接到sites-enabled

sudo ln -s /etc/nginx/sites-available/pyblog /etc/nginx/sites
enabled/

2、重新加载Nginx配置

sudo service nginx reload

如果配置无误我们就可以让uWSGI开机运行

#编辑/etc/rc.local,在exit0之前加入
/usr/local/bin/uwsgi --ini /home/zytx/pyblog_env/pyblog/pyblog.uwsgi.ini&

基于Flask实现后台权限管理系统 – Flask

一、Flask

1、简介

Flask是使用Python编写的轻量级Web应用框架,其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权,Flask也被称为“microframework”,因为它使用简单的核心,用extension增加其他功能,用户可以随意地进行组合,满足自己的要求。

一段最简单的Flask代码如下:

from flask import Flask

app = Flask(__name__)



@app.route('/')

def hello_world():

    return 'Hello World!'



if __name__ == '__main__':

    app.run()

那么,这段代码做了什么?

首先,我们导入了Flask类。这个类的实例将会是我们的WSGI应用程序。

接下来,我们创建一个该类的实例,第一个参数是应用模块或者包的名称。 如果你使用单一的模块(如本例),你应该使用name,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main‘ 或实际的导入名)。这是必须的,这样 Flask才知道到哪去找模板、静态文件等等。详情见Flask的文档。

然后,我们使用route()装饰器告诉Flask什么样的URL能触发我们的函数。

这个函数的名字也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。

最后我们用run()函数来让应用运行在本地服务器上。 其中if name == ‘main‘: 确保服务器只会在该脚本被Python解释器直接执行的时候才会运行,而不是作为模块导入的时候。

2、Flask-SQLAlchemy

Flask-SQLAlchemy是对Flask的一个插件,是Flask对SQLAlchemy的封装,SQLAlchemy提供非常强大ORM(Object Relation Model 对象关系模型)功能。

常见情况下对于只有一个Flask应用,所需要做的事情就是创建Flask应用,选择加载配置,接着创建SQLAlchemy对象时候,把Flask应用传递给它作为参数。

一旦创建,这个对象就包含 sqlalchemy 和 sqlalchemy.orm 中的所有函数和助手。此外它还提供一个名为 Model 的类,用于作为声明模型时的 delarative 基类:

class User(db.Model):

  id = db.Column(db.Integer, primary_key=True)

  username = db.Column(db.String(80), unique=True)



  def __init__(self, username, email):

    self.username = username



  def __repr__(self):

    return'<User %r>' % self.username

2.1 一对多关系

以资源类型和资源举例说明,它们之间关系是一对多关系,一个资源类型下可以有多个资源,而资源只属于一种类型,如果前面介绍,资源只能是菜单类型或功能类型的一种。

class ResourceType(db.Model):

  __tablename__ = 'SYRESOURCETYPE'

  ID = db.Column(db.String(36), primary_key=True)

  CREATEDATETIME = db.Column(db.DateTime, index=True, default=datetime.now)

  UPDATEDATETIME = db.Column(db.DateTime, index=True, default=datetime.now)

  NAME = db.Column(db.String(100))

  DESCRIPTION = db.Column(db.String(200))

  resources = db.relationship('Resource', backref='type', lazy='dynamic')
class Resource(db.Model):

    __tablename__ = 'SYRESOURCE'

    ID = db.Column(db.String(36), primary_key=True)

    # 省略部分内容

    NAME = db.Column(db.String(100))

    SYRESOURCETYPE_ID = db.Column(db.String, db.ForeignKey('SYRESOURCETYPE.ID'))

ResourceType类通过relationship关联到Resource类,给自己定义了resources集合属性,代表本类型下的所有资源。db.relationship关联到Resource类,通过backref动态地给Resource类增加了type属性,代表Resource所属的资源类型。

2.2 多对多关系

以用户和角色为例,它们之间的关系是多对多关系,一个用户可以有多个角色,一个角色也可以被多个用户所用。

user_role_table = db.Table(‘SYUSER_SYROLE’, db.Model.metadata

, db.Column(‘SYUSER_ID’, db.String, db.ForeignKey(‘SYUSER.ID’))

, db.Column(‘SYROLE_ID’, db.String, db.ForeignKey(‘SYROLE.ID’)))

class User(db.Model):

    __tablename__ = 'SYUSER'

    ID = db.Column(db.String(36), primary_key=True)

    LOGINNAME = db.Column(db.String(100), unique=True, index=True)

    PWD = db.Column(db.String(100))

    NAME = db.Column(db.String(100))



    roles = db.relationship('Role',secondary=user_role_table,

    backref=db.backref('users', lazy='dynamic'))
class Role(db.Model):

    __tablename__ = 'SYROLE'

    ID = db.Column(db.Integer, primary_key=True)

    NAME = db.Column(db.String(100))

User类中通过db.relationship定义了和Role类之间的关系,它们之间连接的桥梁就是user_role_table,user_role_table定义了两张关联表之间主键的对应关系。User对象含有roles集合属性,代表角色的集合,而通过backref动态地给Role对象增加了users属性,代表本角色所从属的用户有哪些。

注:ORM将对象映射到数据表,对象之间的关系映射到表之间的关系,通过操作对象及其之间的关系即可以操作数据库表,非常方便,不需要写SQL语句。

3、集成Python Shell

Flask-Script的shell命令可以导入指定的对象,这样就可以在控制台操作Python对象,譬如用户对象、资源对象等等,即时测试对象的属性和方便,使用起来比较方便。

###########################manager.py####################

from app.models import User, Role, Resource, ResourceType, Organization

from flask_script import Manager, Shell

from flask_migrate import Migrate, MigrateCommand



def make_shell_context():

    return dict(app=app, db=db, User=User, Role=Role, Resource=Resource,

ResourceType=ResourceType, Organization=Organization)



manager.add_command("shell", Shell(make_context=make_shell_context))

manager.add_command('db', MigrateCommand)



@manager.command

def myprint():

    print 'hello world'

代码使用flask_script下的Manager模块,通过add_command方法将一些对象注册到shell上下文中。注册的方法有两种:

  • add_command。直接调用Manager模块下的add_command方法;
> python manager.py shell

>>> db

<SQLAlchemy engine='mysql://root:@127.0.0.1/authbase?charset=utf8'>

>>> app

<Flask 'app'>

>>> User.query.all()

[<User u'u8d85u7ea7u7ba1u7406u5458'>

, <User u'u7ba1u7406u5458'>

]

>>>
  • 装饰器方式。使用manager.command装饰器,装饰的方法名称就会成为shell环境中的一条命令。
python manager.py myprint

hello world

4、蓝图

蓝图实现了应用的模块化,使用蓝图使得应用层次更加清楚,开发者可以更容易地开发和维护项目。蓝图通常作用于相同的URL前缀,譬如/admin/user, /admin/resource等等,将一类相同的功能组合到一起,如果URL前缀发生变化,只需要修改蓝图即可。

举例说明,通常网站分为用户网站部分和管理后台部分,如博客类网站,管理后台可以编辑文章等操作,编辑后的文章会在用户网站部分显示,其它用户可以阅读、评论等,同时,管理后台可以评论进行管理等等。按照模块划分:

Blog -------|

| 前台网站

  ------------|app/blog/:id

  ------------|app/blog/:id/comment/:id

| 管理后台

         |admin/user/:id

         |admin/role/:id

                 |admin/siteinfo

上述Blog将网站分为两个部分:前台网站和管理后台,如果按照蓝图实现,即将应用划分为两个蓝图。

from flask import Blueprint

app  = Blueprint('app', __name__, url_prefix='/app')

admin = Blueprint('admin', __name__, url_prefix='/admin')



@app.route('/blog/:id', methods=['POST'])

defapp_blog():

    #查询指定编号博客赋值给blog对象

    returnrender_template(blog/index.html', blog=blog)



@admin.route('/role/:id', methods=['POST'])

defadmin_role():

     #查询指定编号角色赋值给role对象

    return render_template(role/index.html', role=role)