Redis Server 连接端口-随手记

安装完 redis server 后,发现 telnet 127.0.0.1 6379 报 connetion failed 错误,也无法提供外网访问。查看 redis.conf 里的确实 bind 127.0.0.1 没错呀。

其实是防火墙的原因,测试服的话,可以直接关闭:

/etc/init.d/iptables stop 或 service iptables stop

输入 /usr/local/redis/bin/redis-cli 即可连上。

如果不想这么粗鲁,那么可以打开指定端口:

iptables -I INPUT -p tcp --dport 6379 -j ACCEPT

# 查看当前防火墙状态:
/etc/init.d/iptables status

# 记得改完要保存,否则重启了就无效
/etc/init.d/iptables save

# 重启防火墙策略
/etc/init.d/iptables restart

如果执行 redis-cli 时看到以下错误:

Could not connect to Redis at 127.0.0.1:6379: Connection refused

那一定是 redis server 忘记启动了 =_=!

/etc/init.d/redis start

Memcached Server 一样的道理,端口变成 11211,可以用 telnet 绑定IP 11211 来测试通不通。

附上:在 CentOS 自建 Redis/Memcached Server 的一些注意事项:

Redis

# 修改绑定的IP(默认127.0.0.1)为内网IP,如:10.117.38.193
vi /usr/local/redis/etc/redis.conf

Memcached

# 修改绑定的IP(默认127.0.0.1)为内网IP,如:10.117.38.193
# 以及调整缓存大小(默认64M)
vi /etc/init.d/memcached

设置开机启动

vi /etc/rc.local

# 加入以下两行
/etc/init.d/memcached start
/etc/init.d/redis start

PHP Composer 如何创建、发布自己的包

Composer 本身不托管代码,代码放在 GitHub,Composer 只负责管理版本和依赖。

例如我们要发布一个 SilverQ 队列组件到 Composer,步骤如下:

1、前往 https://github.com 建立仓库 silverq

  1. 克隆代码到目录 ~/home/wwwroot/_git_sth/silverd/silverq
  2. 进入目录执行 composer init 按提示依次填写,示例:
{
    "name": "silverd/silverq",
    "type": "library",
    "description": "Queue Library for Yaf Framework",
    "keywords": ["yaf", "queue"],
    "homepage": "http://silverd.cn",
    "license": "MIT",
    "authors": [
        {
            "name": "silverd",
            "email": "silverd29@gmail.com",
            "homepage": "http://silverd.cn"
        }
    ],
    "require": {
        "php": ">=5.3"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0"
    },
    "autoload": {
        "psr-4": {"SilverQ\\": "src/SilverQ"}
    }
}
  1. 编写其他代码并创建好 README.md 提交

2、前往 http://packagist.org

  1. 用 GitHub 帐号登录
  2. 点击 [Submit Package],在 Repository URL 处填写 GitHub 的仓库地址 https://github.com/silverd/silverq
  3. 点击 [Check],系统自动检测项目中 composer.json 是否合格,合格则成功发布
  4. 设置 GitHub Webhooks 更新指南 ,这样只要在 GitHub 发布新版本后,可自动推送到 Packagist
    • 进入 GitHub.com -> silverd/silverq -> Settings -> Webhooks 或 Installed integrations 页面
    • 点击 Add service -> 选择 Packagist,按提示填写并提交
      • User: silverd
      • Token: 在 https://packagist.org/profile/ 看到的 API Token
      • Domain: 可不填
      • 底部 Active 复选勾上
  5. 此时访问 https://packagist.org/packages/silverd/silverq 可以看到包已经可以访问并被拉取了

Note: 也可以不设置钩子,每次发布后手动推送下:

curl -X POST -H 'content-type:application/json' 'https://packagist.org/api/update-package?username=silverd&apiToken=XXXXXX' -d '{"repository":{"url":"https://github.com/silverd/silverq"}}'

3、项目中如何使用?

紧接上一步,到项目中执行以下命令:

composer require silverd/silverq

会提示组件版本找不到:

[InvalidArgumentException]
Could not find package silverd/silverq at any version for your minimum-stability (stable). Check the package spelling or your minimum-stability

可能是因为我们的 Composer 使用的国内镜像没有及时同步的原因,把“源”还原回去试试:

composer config -g repo.packagist composer https://packagist.org

仍然不行。

原来是我们还没有在 GitHub 正式 release 一个版本。此时只能拉 dev-master 主分支开发版本,重新执行:

composer require silverd/silverq:dev-master

那么如何在 GitHub 上发布正式版本?

进入 https://github.com/silverd/silverq/releases,或点击仓库导航里的 Release Tab,然后按提示操作。

有了正式的 release 版本后,再执行 composer require silverd/silverq 就可正常拉取包内容了。

PHP Composer 使用指南

Composer 是 PHP 的一个依赖管理工具。类似 Node 的 npm/yarn。以下记录一些注意点,详细的文档这里说得比较清楚:http://docs.phpcomposer.com/

安装

brew install homebrew/php/composer

或

curl -sS https://getcomposer.org/installer | php
mv composer.phar /usr/local/bin/composer

# 启用 Packagist 中国镜像
composer config -g repo.packagist composer https://packagist.phpcomposer.com

第一次使用(创建 composer.json)

# 它会以交互方式填写信息,同时聪明的使用一些默认值
composer init

根据 composer.json 拉取包

定义好包版本后,别的同学可以直接通过以下命令拉取(相当于 Node 的 npm install

composer install

执行后会生成 vendor 文件夹(相当于 node_modules)和一个 composor.lock 锁文件(这点比 npm 高级,作用类似于 yarn 里的 yarn.lock 文件)

composor.lock 锁文件的作用

在第一次安装依赖后,Composer 将把安装时精确的版本号列表写入 composer.lock 文件。 别的同学 composer install 时将会检查锁文件是否存在,如果存在,它将下载指定的版本,而忽略 composer.json 文件中的定义。这样保证任何人都将下载与指定版本完全相同的依赖。

如果不存在 composer.lock 文件,Composer 将读取 composer.json 并创建锁文件。 所以 composer.lock 一定要和 composer.json 一起提交到项目的 Git 代码仓库中。

安装指定包并自动写入 composer.json

composer require foo/bar

更新依赖版本

根据 composer.json 中的定义升级、更新各依赖版本,并重建 composer.lock 文件。

# 更新所有
composer update

# 更新某个特定的库
composer update foo/bar

手动改了 composer.json,只想刷新下 composer.lock

composer update nothing 或者 composer update --lock

优化自动加载,生成类名&文件路径的映射关系

composer dump-autoload --optimize

软件包的版本号

假设 composer.json 中引入的 monolog 版本指定为 1.0.*。这表示任何从 1.0 开始的开发分支,它将会匹配 1.0.0、1.0.2 或者 1.0.20。

版本约束可以用几个不同的方法来指定。

下一个重要版本(波浪号运算符)

~1.2 相当于 >=1.2 且 <2.0。

~1.2.3 相当于 >=1.2.3 且 <1.3。

通俗地说,~ 意思是只允许版本号的最后一位数字上升。

注意: 虽然 2.0-beta.1 严格地说是早于 2.0,但是,根据版本约束条件,例如 ~1.2 却不会安装这个版本。就像前面所讲的 ~1.2 只意味着 .2 部分可以改变,但是 1. 部分是固定的。

下一个重要版本(尖角^运算符)

^1.2.3 相当于 >=1.2.3 且 < 2.0

类似于波浪线运算符,但假设语义版本和直到下一个主要版本的所有变更都应该被允许。

关于版本的定义详细参见:http://docs.phpcomposer.com/01-basic-usage.html#Package-Versions

使用私有资源库

Composer 默认是使用 Packagist https://packagist.org 上的资源。 也可以让你使用你 GitHub 和 BitBucket 上的私人代码库进行工作:

{
    "require": {
        "vendor/my-private-repo": "dev-master"
    },
    "repositories": [
        {
            "type": "vcs",
            "url":  "git@bitbucket.org:vendor/my-private-repo.git"
        }
    ]
}

参考文档:

公司内网服务器配置-随手记

1、登进 http://tplogin.cn 路由器管理面板

- 关闭 DHCP 功能
- WAN口网段也修改为可主路由不同
- 重启路由器

2、把主路由的网线插 TPLink-More 的 LAN 口上。

这样就实现了主路由下的电脑能和子路由下通过 wifi 连接的手机在同一网段,可以互连了


修改公司内网服务器的静态IP

1、修改 /etc/sysconfig/network-scripts/ifcfg-eth0

IPADDR=192.168.103.112 GATEWAY=192.168.103.253

2、修改 redis.conf 里的绑定IP

bind 127.0.0.1 192.168.103.112

待解决:bind 这一行文档里说可以删掉(即向所有网卡接口开放,不用指定IP),但试下来client会报如下错:

Notice: Redis::set(): send of 43 bytes failed with errno=32 Broken pipe in /Users/silverd/home/wwwroot/staylife_server/system/Com/Cache/Redis.php on line 109

公司内网服务器无法连接外网?

修改 /etc/resolv.conf 增加DNS解析服务

nameserver 114.114.114.114 nameserver 8.8.8.8

什么是 CGI/FastCGI/PHP-FPM?

什么是 CGI?

CGI 全称是“公共网关接口”(Common Gateway Interface),定义了一套协议。HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。 CGI 可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如 php,perl,tcl 等

Nginx 只是内容的分发者。比如,如果请求 index.html,那么 Nginx 会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。 如果现在请求的是 index.php,根据配置文件,nginx知道这个不是静态文件,则启动对应的CGI程序,找到PHP解析器来处理(PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。Nginx 再把结果返回给浏览器)。

Nginx 会传哪些数据给PHP解析器呢?URL+QueryString+PostData+HttpHeader。

好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的一套协议。

什么是 FastCGI

FastCGI 相当于定义了一套管理办法。FastCGI 是一套跟语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能

1. CGI程序的性能问题在哪呢?

CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受 FastCGI 进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。即一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次 (这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

2. FastCGI 如何优化性能?

FastCGI 会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。master和children之间通过共享内存来共享配置文件

什么是 PHP-FPM?

FastCGI 是一个协议,PHP-FPM 实现了这个协议。 PHP-FPM 是一个 PHP FastCGI 管理器,可以有效控制内存和进程、平滑重载PHP配置,已被PHP官方收录。在 ./configure 的时候带 –enable-fpm 参数即可。

什么是 PHP-CGI?

PHP-CGI 与 PHP-FPM 一样,是 PHP 自带的FastCGI管理器,PHP-CGI 的问题在于:

  1. PHP-CGI 变更 php.ini 配置后需重启 PHP-CGI 才能生效,不可以平滑重启。
  2. 直接杀死 PHP-CGI 进程,php 就不能运行了。(PHP-FPM 和 Spawn-FCGI 就没有这个问题,守护进程会平滑从新生成新的子进程。)

针对 PHP-CGI 的不足,PHP-FPM 应运而生。

什么是 Spawn-FCGI?

Spawn-FCGI 也是一个FastCGI管理器,它是 lighttpd 中的一部份。 PHP-FPM 控制的进程CPU回收的速度比较慢,内存分配的很均匀。 Spawn-FCGI 控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。导致了总体响应速度的下降。

参考文章

搭建 ued.morecruit.cn 笔记(Nginx Basic Auth)

1、先按照上篇文章利用 GitWebHook 自动部署代码

2、设置允许目录浏览

vi /usr/local/nginx/conf/vhost/ued.morecruit.cn.conf 在 server {} 段中增加:

autoindex on;
autoindex_exact_size off;
autoindex_localtime on;
charset utf-8, gbk;

3、给站点增加 Nginx Basic Auth

vi /usr/local/nginx/conf/vhost/ued.morecruit.cn.conf 在 server {} 段中增加:

auth_basic "plz input password:";
auth_basic_user_file vhost/ued.morecruit.cn.htpasswd;

注意 auth_basic_user_file 的相对目录是 /usr/local/nginx/conf

新增一对用户和密码

printf "用户名:$(openssl passwd -crypt 密码)\n" >> /usr/local/nginx/conf/vhost/ued.morecruit.cn.htpasswd

重启 Nginx 即可

/etc/init.d/nginx reload

参考文章: