Docker多容器连接 以Nginx+Php为例

Docker提供了多个容器直接访问的方法,最简单的方式是直接使用端口映射-p参数指定映射的端口或者-P映射所有端口,多个容器直接通过网络端口进行访问。

但网络端口映射方式并不是Docker中连接多个容器的唯一方式,还可以使用Docker的连接系统(--link)连接多个容器,当容器连接到一起时,接受者容器就可以看到源容器的信息。

建立容器之间的连接 – 以Nginx+PHP为例

在容器直接建立连接要使用--link选项

--link <name or id>:alias

这里我们通过建立一个 nginx/php-fpm 的服务,示例一下如何在两个或者多个容器之间建立连接。

Continue reading →

Time_Wait详解(译文)

在构建基于 TCP 协议的 C/S 系统的时候,经常会因为一些简单的错误而导致严重的影响系统的可扩展性。 其中一些错误是因为对TIME_WAIT状态不理解导致的。 在本文中,我将会讲解为什么要存在TIME_WAIT 状态,它的存在所造成的一些问题以及如何解决这些问题。

TIME_WAIT在 TCP 的状态流程图中是一个很容易被误解的状态。它是表示socket可以进入和留存相当长一段时间的状态,如果你的系统中有很多 socket 处于TIME_WAIT状态,那么当你需要创建新的 socket 连接的时候可能会受到影响,这也会影响到你的程序的扩展性。很多人对于如何以及为何 socket 关闭连接的时候要在第一个地方以TIME_WAIT状态结束感到困惑,这里没有什么神秘的,从下面的 TCP 状态流程图中可以看出,TIME_WAIT状态是TCP 客户端断开连接之后的最终状态。

Continue reading →

常用Linux命令 (二)

查看Linux的版本(Red Hat/Cent OS)

在RedHat和Cent OS下,使用如下命令查看当前系统的版本。

$ cat /etc/centos-release
CentOS release 6.3 (Final)

time命令: 统计程序执行时间

用于统计程序执行时间,这些事件包含程序从被调用到终止的时间,用户CPU时间,系统CPU时间。

Continue reading →

常用Linux命令 (一)

top命令

监控系统的运行状态,并且可以按照cpu、内存、执行时间进行排序。

top

第一行中,03:30:22是当前时间,up 39 min是系统运行的运行了多长时间,1 user指出了当前有几个用户登录到系统,load average指的是系统负载,这后面的三个值分别是1分钟,5分钟,15分钟的系统负载平均值。

如果仅仅需要第一行中的信息,可以使用uptime命令。

第二行中,Task指出了当前系统有多少个进程,以及各种状态的进程统计信息。

Continue reading →

PHP命令行下的世界

PHP作为一门web开发语言,通常情况下我们都是在Web Server中运行PHP,使用浏览器访问,因此很少关注其命令行操作以及相关参数的使用,但是,特别是在类Unix操作系统上,PHP可以作为一门脚本语言执行与shell类似的处理任务。

php命令行(CLI)参数详解

查看PHP的所有命令行参数,使用php -h命令。我们将会对大部分常用的命令行参数进行一一解释,以加深对PHP能力的认识,更加快捷的在服务端命令行下使用PHP或者调试各种因为对环境不熟悉而出现的问题。

-a               以交互式shell模式运行
-c <path>|<file> 指定php.ini文件所在的目录
-n               指定不使用php.ini文件
-d foo[=bar]     定义一个INI实体,key为foo,value为'bar'
-e               为调试和分析生成扩展信息
-f <file>        解释和执行文件<file>.
-h               打印帮助
-i               显示PHP的基本信息
-l               进行语法检查 (lint)
-m               显示编译到内核的模块
-r <code>        运行PHP代码<code>,不需要使用标签 <?..?>
-B <begin_code>  在处理输入之前先执行PHP代码<begin_code>
-R <code>        对输入的没一行作为PHP代码<code>运行
-F <file>        Parse and execute <file> for every input line
-E <end_code>    Run PHP <end_code> after processing all input lines
-H               Hide any passed arguments from external tools.
-S <addr>:<port> 运行内建的web服务器.
-t <docroot>     指定用于内建web服务器的文档根目录<docroot>
-s               输出HTML语法高亮的源码
-v               输出PHP的版本号
-w               输出去掉注释和空格的源码
-z <file>        载入Zend扩展文件 <file>.

args...          传递给要运行的脚本的参数. 当第一个参数以-开始或者是脚本是从标准输入读取的时候,使用--参数

--ini            显示PHP的配置文件名

--rf <name>      显示关于函数 <name> 的信息.
--rc <name>      显示关于类 <name> 的信息.
--re <name>      显示关于扩展 <name> 的信息.
--rz <name>      显示关于Zend扩展 <name> 的信息.
--ri <name>      显示扩展 <name> 的配置信息.

上面列出了PHP命令所有的参数及其注释,接下来,我们将对其中比较常用的参数举例说明。

Continue reading →

Linux免密码登陆

在Linux(MAC)下,每次登录远程Linux服务器都使用帐号密码是非常麻烦的,使用SSH公钥登录,可以免去输入密码的麻烦。

首先,使用ssh-keygen命令创建自己的公私密钥

ssh-keygen

执行成功后,在~/.ssh目录下,会创建名为id_rsa的私钥和id_rsa.pub的公钥。

接下来,对需要使用公钥进行管理的服务器,使用ssh-copy-id命令将公钥上传到服务器即可。

Continue reading →

Linux 实现端口转发

本文讲述了如何在Linux下实现端口转发,以实现通过VPN连接至远端开放给VPN连接的计算机后,如何通过该计算机代理访问远端内网中其它计算机。

情景是这样的,A公司给B公司开发了项目,之后需要对B公司的项目进行维护,而该项目是在B公司内网中才能访问的,A公司需要有办法能够连接到B公司才能对项目进行维护,因此,B公司管理员给A公司开放了VPN,但是限制只能访问项目所在服务器,而不能访问其他服务器,现在A公司需要对B公司的该项目进行维护,需要维护数据库中的一些信息,但是数据库与项目不再同一个服务器上,因此,无法直接访问数据库服务器。

于是就有了下面的办法,用B公司开放的服务器做端口转发,将A公司对B公司数据库服务器的访问请求,通过开放服务器转发到数据库服务器,间接实现对数据库服务器的访问。

Continue reading →

Vagrant使用技巧

1.1 如何调试

在使用Vagrant过程中,难免会出现一些不稳定的因素而造成一些使用上的bug,因此,Vagrant提供了Debug日志的方式用于调试,可以方便的查找错误的原因,以便快速解决问题。

要允许启用日志功能,需要在主机上设置环境变量VAGRANT_LOG为需要的日志级别,包含debug, info, warn, error。当你需要查找错误产生的原因的时候,通常使用日志级别info,这种情况下你可以得到包含重要信息的比较干净的日志。

在Linux和Mac系统上,你可以通过下面的方式设置:

$ VAGRANT_LOG=info vagrant up

在Windows下,你需分开写:

$ set VAGRANT_LOG=info
$ vagrant up

当然,你也可以不用这种方式,只需要在启动的时候增加参数--debug即可。

$ vagrant up --debug

1.2 如何使用插件

Vagrant中提供了很多可以直接使用的插件,使用这些插件,可以极大的减少配置开发环境的工作量,Vagrant的大部分核心功能都是基于插件实现的。

Vagrant使用命令vagrant plugin install安装插件。

$ vagrant plugin install vagrant-example-plugin

插件安装完成后,将会在Vagrant启动的时候自动加载,如果插件加载过程中出现错误,不会影响Vagrant的启动,而是会输出插件加载失败的错误信息。

插件安装完成后,你应该查看插件开发文档获取如何使用该插件,一般可以通过vagrant命令使用插件的命令,如果插件提供了provision的话,可以通过config.vm.provision进行配置。

插件的更新比较简单,使用命令vagrant plugin update即可更新全部插件,使用vagrant plugin update NAME可以更新指定插件。

插件卸载使用命令vagrant plugin uninstall

$ vagrant plugin uninstall vagrant-example-plugin

查看安装了哪些插件:

vagrant plugin list

1.3 如何配置网络

在Vagrant中,所有的网络配置都在Vagrantfile中的config.vm.network方法中。

Vagrant.configure("2") do |config|
  # other config here

  config.vm.network "forwarded_port", guest: 80, host: 8080
end

每一种网络类型都有一个标识符如:forwarded_port,它后面跟着一串配置选项。在端口跳转的例子中,提供了两个参数,虚拟机中的端口号和主机中映射的端口号。

如果需要多个网络配置,使用多个config.vm.network即可。

如何进行端口跳转

端口跳转功能允许你通过TCP或者是UDP直接访问主机上的指定端口,该端口的请求会被转发到虚拟机上的指定端口。

Vagrant.configure("2") do |config|
  config.vm.network "forwarded_port", guest: 80, host: 8080
end

上面的配置将会主机上对8080端口的访问转发到虚拟机上的80端口。

下面是该配置(forwarded_port)支持的参数:

  • guest (int) 希望暴漏给主机的虚拟机端口
  • guest_ip(string) 希望绑定的IP,该IP与guest指定的端口暴漏给主机,默认为空,所有网卡接口。
  • host(int) 希望使用来访问虚拟机的guest端口的主机端口号
  • host_ip(string) 主机的IP地址,用于绑定到跳转的端口,如果不指定,则使用所有IP。
  • protocol(string) 可选tcp或者udp,默认为tcp.

    Vagrant.configure("2") do |config|
    config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'tcp'
    config.vm.network "forwarded_port", guest: 2003, host: 12003, protocol: 'udp'
    end

1.4 如何配置同步目录

使用config.vm.synced_folder方法配置同步目录。

Vagrant.configure("2") do |config|
  # other config here

  config.vm.synced_folder "src/", "/srv/website"
end

以上配置中,synced_folder方法的第一个参数为主机上要跟虚拟机同步的目录,第二个参数为要挂载到虚拟机上的路径。

可以配置参数disabled: true禁止目录同步。

Vagrant.configure("2") do |config|
  config.vm.synced_folder "src/", "/srv/website", disabled: true
end

默认情况下,Vagrant设置同步文件夹的属主/组为SSH用户,如果需要修改的话,使用下面配置:

config.vm.synced_folder "src/", "/srv/website",
    owner: "root", group: "root"

Vagrant入门

Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。

1.1 项目初始化

Vagrant使用Vagrantfile文件作为配置文件,该文件中定义了项目的根目录,Vagrant的很多配置都是基于这个配置的根目录进行的,同时,该文件也描述了项目运行所需要的机器类型以及其它资源(比如安装哪些软件等)。

要初始化一个Vagrant项目,使用命令vagrant init命令,使用该命令后,会在当前目录创建一个名为Vagrantfile的配置文件,修改该文件改变Vagrant项目的行为。

$ mkdir vagrant_getting_started
$ cd vagrant_getting_started
$ vagrant init

Continue reading →

Python安装PIL图片处理库

开发平台是Mac,需要用到Python的图像处理库PIL,下面记录了安装过程以及出现的问题。

基本安装过程是这样的,使用命令pip进行安装

$ pip install PIL
Downloading/unpacking PIL
  Could not find any downloads that satisfy the requirement PIL
  Some externally hosted files were ignored (use --allow-external PIL to allow).
Cleaning up...
No distributions at all found for PIL
Storing debug log for failure in /Users/mylxsw/.pip/pip.log

Continue reading →

Scroll Up