pure-ftpd 530 Login authentication failed

在服务器上,我一直使用的是 vsftpd,但由于 vsftpd 不支持 MLSD ,我开始转向 pure-ftpd

简单配置完毕后,登录一直出现错误。

-> % ftp ssi@xxxx.xx
Connected to xxxx.xx.
220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
220-You are user number 1 of 50 allowed.
220-Local time is now 12:08. Server port: 21.
220-This is a private system - No anonymous login
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 User ssi OK. Password required
Password:
530 Login authentication failed
ftp: Login failed

那么,下面是解决方案。 继续阅读

在 IDE 中使用 Vim

作为一个 Vimer ,很可能不会习惯其他的 IDE 中的编辑功能。

但作为一个理性的 Vimer,我们也应该知道并非所有的东西都适合用 Vim 来写。

例如,写后端或许可以只用 Vim(或许 JAVA 除外),但写跨平台的游戏前端,就不太可能了。

作为 cocos2d-x 的使用者,我必须在 Windows/Mac OS X 下不断切换,在 Visual Sudio/Xcode/Eclipse 三个 IDE 中不断辗转。那些坑爹的快捷键,我经常记错。那些纠结的键绑定,我经常搞混。

所以还不如把编辑模式都都改成 Vim 方便。下面是分别针对这三个 IDE 的 Vim 支持插件: 继续阅读

Good Bye, Flash!

最近才在 Robin 的介绍下读到 Keith Peters 的 Flash and Me ,细读后当真是感慨万千。

Robin 在邮件中写道:

从刚接触Flash时看的小小动画、大话三国、小破孩等动画,到闪客帝国、闪吧和后来的瑞研社区、天地会, 岁月好是把快刀啊, 更觉KP的话实在。

人生逆旅,且行且珍惜

既然已经开始感慨了,那就感慨一下: 继续阅读

从 Lighttpd 到 OpenResty

两年前,我写了 从Apache到Lighttpd。现在,是时候又发生改变了。

前段时间,我写了许多关于 OpenResty 的文章,并在公司内网服务器和自己的电脑上开始使用 OpenResty。

现在,我开始在外网部署 OpenResty。

编译和安装

OpenResty 的编译和安装就是老三套:

tar xzvf ngx_openresty-VERSION.tar.gz
cd ngx_openresty-VERSION/
./configure
make
make install

默认情况下,OpenResy 会安装到 /usr/local/openresty 中,编译时会默认使用 luajit。 继续阅读

lua 协程(coroutine)分析

这是一段分析 lua 协程(协同程序,coroutine)的代码,来自 Lua reference manual interface (略有修改):

function foo (a)
    print("foo", a)
    return coroutine.yield(2*a)
end

co = coroutine.create(function (a,b)
   print("co-body1", a, b)
   local r = foo(a+1)
   print("co-body2", r)
   local r, s = coroutine.yield(a+b, a-b)
   print("co-body3", r, s)
   return b, "end"
end)

print("1----")
print("main", coroutine.resume(co, 1, 10))
print("2----")
print("main", coroutine.resume(co, "r"))
print("3----")
print("main", coroutine.resume(co, "x", "y"))
print("4----")
print("main", coroutine.resume(co, "x", "y"))

运行效果如下: 继续阅读

rsyslog/Python/LogAnalyzer 记录和查看日志

在新的项目中,我希望服务端、客户端的所有信息都通过独立的日志系统记录。这样的好处是:

  • 日志可以使用单独的服务器存储和管理,实现权限分离,增强生产服务器的安全性;
  • 使用通用的格式方便分析日志;
  • 所有日志统一处理;
  • 客户端可以直接和日志服务器对话。

RSYSLOG 是一个高效的日志系统,也是目前 Ubuntu 和 CentOS 默认使用的日志系统。

LogAnalyzer 是一个 PHP 写成的 Web 前端,使用它可以分析和查看 RSYSLOG 生成的日志。

经过研究,我准备直接使用这两个系统。本文记录了我在配置这两个系统中遇到的问题。

本文不会详细从头开始介绍 RSYSLOG 的配置,若希望得到这些信息,请参考下面的文章:

我的系统配置:

  • CentOS 6.3
  • RSYSLOG 5.8.10
  • LogAnalyzer 4.1.1(v4-beta)

继续阅读

使用 git post-receive 钩子部署服务端代码

在 git 中提交服务器源码的时候,如果能够直接更新到测试服务器,并且重启服务使其生效,会节省懒惰的程序员们大量的时间。

git 的 Server-side hook (服务端钩子/挂钩)可以用来做件事。

本文以部署基于 OpenResty 的服务端程序为例来介绍我的做法。

技术信息

  • OS: CentOS 6.3
  • 服务器软件: OpenResty
  • 开发语言: Lua

名词解释

  • 服务器: 服务器硬件 + OS
  • 服务端程序: OpenResty 在服务器中的进程
  • 服务端代码: 部署在 OpenResty 中的 Lua 源程序

一、git 服务端钩子类型

Pro git 中介绍了 git 钩子的几种类型,其中和服务端相关的有: 继续阅读

将 nginx 注册为系统服务

nginx 提供了 -s signal 命令行参数让我们对其进行操作。我们可以很方便地利用 -p prefix 参数指定启动路径来启动多个完全隔离的 master 进程;还可以使用 -c filename 显式指定不同的配置文件。

由于 prefix 的路径一般都比较长, reload 或者 reopen nginx master 进程就会比较不方便。此时可以采用我在 在 OS X 中使用 OpenResty – 3.快捷方式 中提到的自建快捷方式的形式来简化这些操作。

更一般的,在服务器上我们会采用操作系统提供的标准服务的方式来进行这些简化。当然,这种方法一般仅针对一个 nginx master 进程进行操作。

本文将介绍在多个操作系统上将 nginx 注册为服务的方式(其实,也没有那么多啦)。

1. Mac OS X

参照 在 OS X 中使用 OpenResty – 2. 配置 OpenResty 环境 进行配置即可。

2. CentOS

根据 CentOS Nginx的一个初始化脚本(用于启动、停止、查看状态) 一文提供的方法,我整理了代码到 gist 上,只需要将 nginxd 下载到 /etc/init.d 并执行 addnginxservice 脚本即可。

下面的代码自动帮你做了上面的事:

wget --no-check-certificate https://gist.githubusercontent.com/zrong/9c7dfce8f274ee451188/raw/77eada5f92dd5583838390f26cc9790b00e63137/nginxd
wget --no-check-certificate https://gist.githubusercontent.com/zrong/9c7dfce8f274ee451188/raw/a0084d1ae6d5175c913e4593c99d493487d14c75/addnginxservice && source addnginxservice

3. Ubuntu

已经都是 Ubuntu了,自然是直接 apt-get 啦。这个没什么好说的。

4. Windows

nginx 的 Windows 二进制包并没有提供注册成为服务的功能。官方提供的方法和 Linux 相同,都是使用命令行参数进行操作。例如下面的 来自官方wiki 的方法,进入 nginx 文件夹,启动nginx进程:

cd nginx/
start nginx.exe

使用下面的命令查看 nginx 进程是否正在运行:

tasklist /fi "imagename eq nginx.exe"

关闭 nginx 进程:

nginx.exe -s quit

nginx 并不是为 windows 开发的,windows 版本的作用是为了方便在 windows 上工作的程序员们使用 nginx 。因此,nginx 好像并没有什么需要成为一个服务的动力。尽管 Running as a service. 出现在了 Possible future enhancements 列表中。

如果一定要在 windows 下将其注册为服务的话,把 Nginx 创建为 Windows 的一个服务原文)一文提供了一种方式。这是一篇写于 2009 年的文章,我并没有在我的 Windows 8.1 上尝试,因为我直接使用 Vagrang 了。

(全文完)

在 OS X 中使用 OpenResty

我曾经写过 在 Mac OS X 上安装lighttpd ,从那时起,我的 Mac 上的 HTTP 服务器一直是 lighttpd。

现在,为了学习 OpenResty ,我将 lighttpd 进行了替换。下面记录这个过程。

1. 移除 lighttpd

在 Mac OS X 上安装lighttpd 的时候,我使用 launchctl 来实现 lighttpd 的自动启动。现在,只需要 unload 即可。

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.lighttpd.plist

这会立即停止 lighttpd 的运行。接下来,将 homebrew.mxcl.lighttpd.plist 从~/Library/LanuchAgents 目录中移除。否则下次启动系统的时候,lighttpd 又会启动。

继续阅读

可能是一个程序员