使用 awstats 分析 Nginx 的访问日志[转]

前言
在我的上一篇文章《使用 Nginx 提升网站访问速度》中介绍了 Nginx 这个 HTTP 服务器以及如何通过它来加速网站的访问速度。在实际的网站运营中,我们经常需要了解到网站的访问情况,例如每天有多少 IP 在访问、PV 数是多少、哪个 URL 访问量最大、用户使用最多的浏览器是哪个、都是通过什么方式知道这个网站的以及有多少用户访问出错等等,通过掌握这些信息来提高用户的体验,从而改善网站的质量。一般我们可以通过一些免费的访问统计网站例如 Google Analytics 来或者这些信息。但不足之处是这类网站只能对页面进行分析,不包括静态文件;另外可能有很多的站长不愿意使用这类工具来暴露自己的数据,种种的这些因素使站长希望自己来分析访问日志。而 awstats 就可以满足所有的这些需求。
Awstats 是在 SourceForge 上发展很快的一个基于 Perl 的 WEB 日志分析工具,一个充分的日志分析让 Awstats 显示您下列资料:
访问次数、独特访客人数,
访问时间和上次访问,
使用者认证、最近认证的访问,
每周的高峰时间(页数,点击率,每小时和一周的千字节),
域名/国家的主机访客(页数,点击率,字节,269域名/国家检测, geoip 检测),
主机名单,最近访问和未解析的 IP 地址名单
大多数看过的进出页面,
档案类型,
网站压缩统计表(mod_gzip 或者 mod_deflate),
使用的操作系统 (每个操作系统的页数,点击率 ,字节, 35 OS detected),
使用的浏览器,
机器人访问(检测 319 个机器人),
蠕虫攻击 (5 个蠕虫家族),
搜索引擎,利用关键词检索找到你的地址,
HTTP 协议错误(最近查阅没有找到的页面),
其他基于 URL 的个性报导,链接参数, 涉及综合行销领域目的.
贵网站被加入"最喜爱的书签".次数.
屏幕大小(需要在索引页补充一些 HTML 标签).
浏览器的支持比例: Java, Flash, RealG2 reader, Quicktime reader, WMA reader, PDF reader.
负载平衡服务器比率集群报告.
Awstats 的运行是需要 PERL 环境的支持,从 awstats 的文档来看,它对 Apache HTTP Server 的支持是非常完美的,而当我们把 Web 服务器换成 Nginx 后,要运行 awstats 变得很麻烦。首先 Nginx 本身对 Perl 的支持是比较弱的,甚至官方也不建议使用;另外在日志格式上有需要修改后才能运行。
本文主要介绍通过让 awstats 对日志统计的结果生成静态页面,然后通过 Nginx 输出以达到统计 Nginx 访问日志的效果,其中还包括如何让 Nginx 自动切割日志文件。
回页首
配置 Nginx 自动切割日志
跟 Apache HTTP Server(以下称 Apache)不同的是,Apache 可以将日志输出通过管道的方式进行重新定向,依此来进行自动的日志切割。Nginx 在现今版本上还没能跟 Apache 一样,通过%YY等参数按日期分批创建日志,但是通过给 nginx 进程发送一个特定的信号,可以使 nginx 重新生成日志文件。我们可以定期执行一个 Shell 脚本来切换日志,重新命名或转移,具体的脚本如下:
# mv  /opt/nginx/logs/access.log /opt/nginx/logs/access_`date +%Y%m%d`.log
# killall –s USR1 nginx    #使用USR1参数通知Nginx进程切换日志文件

将以上脚本内容保存为文件名为 logcron.sh 存到自定的目录中,例如 /opt/nginx/sbin/logcron.sh
使用 Crontab 让该脚本程序在每天晚上 11 点 59 分自动执行,即可做到按天创建日志。
回页首
安装和配置 Awstats
安装之前,必须确认你的服务器上 Perl 的环境已经就绪。
查看当前环境 Perl 版本的命令是 perl –version
我们还需要对 Nginx 的日志格式做个小修改,不然 awstats 将无法进行统计。
例子如下(加粗部分):
# vi /opt/nginx/conf/nginx.conf

server {
listen       80;
server_name  localhost;

location ~ ^/web/ {
root   /data/web;
index  index.html;
error_log off;
charset gb2312;
}

log_format  new_log    #格式代称 (注意,如果有多个虚拟主机,代称不能一样)
‘$remote_addr – $remote_user [$time_local] $request ‘
        ‘"$status" $body_bytes_sent "$http_referer" ‘
        ‘"$http_user_agent" "$http_x_forwarded_for"’;
        access_log  logs/access.log new_log;    #日志生成路径

}

下载最新版本的 awstats 包,下载地址请见文章最后的参考资料。把下载后的 tar 包解压到任意目录中,例: /usr/local/awstats 。然后执行 tools 目录中的 awstats_configure.pl 配置向导,创建一个新的统计。
—–> Check for web server install

Enter full config file path of your Web server.
Example: /etc/httpd/httpd.conf
Example: /usr/local/apache2/conf/httpd.conf
Example: c:\Program files\apache group\apache\conf\httpd.conf
Config file path (‘none’ to skip web server setup):
#> none  #因为我们这里用的是 Nginx,所以写 none,跳过。

回车
Your web server config file(s) could not be found.
You will need to setup your web server manually to declare AWStats
script as a CGI, if you want to build reports dynamically.
See AWStats setup documentation (file docs/index.html)

—–> Update model config file ‘/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf’
  File awstats.model.conf updated.

—–> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ?
#> y    #y 创建一个新的统计配置

回车
—–> Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
#> www.moabc.net        #统计网站的域名 例:
www.moabc.net

回车
—–> Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
#>    

使用默认直接回车,接下来便会出现以下的提示
—-> Add update process inside a scheduler
Sorry, configure.pl does not support automatic add to cron yet.
You can do it manually by adding the following command to your cron:
/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net 
               #回头把该命令填入crontab 按指定时间执行
Or if you have several config files and prefer having only one command:
/usr/local/awstats/tools/awstats_updateall.pl now
Press ENTER to continue…        回车继续

A SIMPLE config file has been created: /etc/awstats/awstats.www.moabc.net.conf 
            #新配置文件所在的路径
You should have a look inside to check and change manually main parameters.
You can then manually update your statistics for ‘www.moabc.net’ with command:
> perl awstats.pl -update -config=www.moabc.net
You can also build static report pages for ‘www.moabc.net’ with command:
> perl awstats.pl -output=pagetype -config=www.moabc.net

Press ENTER to finish…       

回车完成向导,接下来修改 www.moabc.net 的统计配置
#vi /etc/awstats/awstats.www.moabc.net.conf
找到统计的日志文件的路径
LogFile="/var/log/httpd/mylog.log"
改为
LogFile="/opt/nginx/logs/access_%YYYY-0%MM-0%DD-0.log
对应上边 Nginx 日志切割程序的所生成的目录存放结构,要注意 Awstats 的年月日格式的跟 Nginx 的写法有所不同。我们现在执行统计的顺序是:
Nginx 产生日志 –> 日志切割 –> Nginx 继续产生日志 –> 另存切割日志 –> 交由Awstats统计 –> 生成结果
在本文中 Awstats 所统计的日志,是已切下来的那部分。也能调转顺序,先统计完了再切。不过这比较容易造成统计的遗漏。配置修改完成后,保存退出。然后我们可以开始试一下手动执行。
先执行日志切割脚本 logcron.sh 把 Nginx 的日志切下来。
然后执行 Awstats 日志更新程序开始统计分析。

# /opt/nginx/sbin/logcron.sh
# /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.moabc.net

Create/Update database for config "/etc/awstats/awstats.www.moabc.net.conf"
        by AWStats version 6.7 (build 1.892)
From data in log file "/opt/nginx/logs/access_20080804.log"…
Phase 1 : First bypass old records, searching new record…
Direct access after last parsed record (after line 450421)
Jumped lines in file: 450421
Found 450421 already parsed records.
Parsed lines in file: 120
Found 0 dropped records,
Found 0 corrupted records,
Found 0 old records,
Found 120 new qualified records.

看到以上显示,证明日志切割和 Awstats 都已经运行无误了。统计分析完成后,结果还在 Awstats 的数据库中。在 Apache 上,可以直接打开 Perl 程序的网页查看统计。 但本文开始时已经提到,Nginx 对 Perl 支持并不好,所以我们要换个方法,利用 awstats 的工具将统计的结果生成静态文件,具体的步骤如下:
首先在 webroot 目录下创建一个文件夹。例:/data/webroot/awstats
然后让 Awstats 把静态页面生成到该目录中

# mkdir  /data/webroot/awstats

# /usr/local/awstats/tools/awstats_buildstaticpages.pl -update  \
-config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats  \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl

上述命令的具体意思如下:
/usr/local/awstats/tools/awstats_buildstaticpages.pl    Awstats 静态页面生成工具
-update -config=www.moabc.net     更新配置项
-lang=cn     语言为中文
-dir=/data/admin_web/awstats    统计结果输出目录
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl    Awstats 日志更新程序路径。
接下来,只需在nginx.conf 中,把该目录配置上去即可。 例子如下:(加粗部分):

server {
listen       80;
server_name  localhost;

location ~ ^/web/ {
root   /data/web;
index  index.html;
error_log off;
charset gb2312;
}

location ~ ^/awstats/ {        # html 静态页面目录
        root   /data/webroot/awstats;
        index  index.html;
        access_log off;
        error_log off;
        charset gb2312; #最好把默认编码改成 gb2312避免浏览器因自动编码出现乱码的情况
}

location ~ ^/icon/ {             # 图标目录
        root   /usr/local/awstats/wwwroot;
        index  index.html;
        access_log off;
        error_log off;
        charset gb2312;
        }
}

用浏览器查看到统计的详细结果 http://youhostname/awstats/awstats.www.moabc.net.html
至此,使用 awstats 已能完全支持 Nginx 的日志统计。
回页首
配置 Awstats 自动运行
为了让整个日志的统计过程自动完成,我们需要设置 crontab 计划任务,让 Nginx 日志切割以及 Awstats 自动运行,定时生成结果页面。
#vi /etc/crontab

11 59 * * * /opt/nginx/sbin/logcron.sh            #半夜11:59  进行日志切割

00 1 * * * /usr/local/awstats/tools/awstats_buildstaticpages.pl  \
-update -config=www.moabc.net -lang=cn -dir=/data/admin_web/awstats \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl 

#凌晨00:01  Awstats进行日志分析

:wq保存退出
#crontab /etc/crontab    指定cron所执行的配置档路径

回页首
保护日志统计结果页面
一般站长都不愿随便让人知道自己站的真实流量,所以要把 Awstats 统计结果页面进行密码保护。Nginx 使用的是跟 Apache 一样的密码加密格式,这里需要用到 apache 自带的工具 htpasswd。
如果你在本机上默认装有 Apache,这你就只需在它的程序目录下运行
例:
#/usr/local/apache2/bin/htpasswd -c admin.pass admin #用户名为admin

New password:            输入密码
Re-type new password:        重复输入
Adding password for user admin    创建成功

然后把 admin.pass 这个密码包找个的地方藏起来.
修改 nginx.conf 在 location 中加入(加粗部分):

server {
     listen       80;
     server_name  localhost;
     location ~ ^/web/ {
     root   /data/web;
     index  index.html;
     error_log off;
     charset gb2312;
     }

     location ~ ^/awstats/ {        # html 静态页面目录
        root   /data/admin_web;
        index  index.html;
        access_log off;
        error_log off;
        charset gb2312;   
        auth_basic     "admin"; #用户名
     /opt/ngx/conf/admin.pass; #密码包路径
        }

        location ~ ^/icon/ {             # 图标目录
        root   /usr/local/awstats/wwwroot;
        index  index.html;
        access_log off;
        error_log off;
        charset gb2312;
        }
}

修改 Nginx 配置完毕后,执行命令 killall –s HUP nginx 让 Nginx 重新加载配置即可。

回页首
总结
尽管跟 Apache HTTP Server 相比较而言,Nginx 的功能是比较弱的,但是我们依然可以利用一些技巧来规避这些弱点,Nginx 的设计者肯定也是充分考虑到这个问题。现在也越来越多的第三方开发的模块在逐渐的扩展 Nginx 的功能。但是从应用本身的角度而言,Nginx 更倾向于卓越的性能,而非大而全的功能,因而在一些附加方面的功能,我们也不能对之要求过高。

Linux Debian中设置时区和时间

命令:tzselect  //更改系统时区,根据提示选择即可。
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
sudo ntpdate cn.pool.ntp.org

修改时间
RedHat中:
    date -s MMDDhhmmYYYY
Debian中:
    date -s "YYYY/MM/DD hh:mm:ss"

    date -s ‘YYYY/MM/DD hh:mm:ss’

    date -s MM/DD/YYYY
    date -s hh:mm:ss

关于nginx环境无法设置display_errors的问题

在Apache平台里设置display_errors只需要修改php.ini文件就可以,但是在nginx环境中修改php.ini并不起作用,还需要修改同目录下的php-fpm.conf文件。vi开php-fpm.conf找到<value name="display_errors">0</value>内容,将此处的0改成“1”或“0”,“1”即显示PHP错误信息(相当display_errors = On),“0” Nginx 会报状态为500的空白错误页(相当display_errors = Off)

httpd.ini 实现 301跳转

目前大多虚拟主机空间均支持Rewrite伪静态,在目录下默认会有一个伪静态规则的配置文件,Windows的iis6/iis7下是httpd.ini,Linux下的apache2为.htaccess。.htaccess直接实现301相当简单,略过不表,这里主要介绍下httpd.ini的实现方法。因为httpd.ini中语法最多仅能实现302跳转,对seo极其不友好(网上好多文章声称RewriteRule (.*) http\://www\.zyc\.me$1 [R,I]可以实现301,但事实上它返回的是302)。

这里介绍的是基于大多数的php网站的方法。最典型的是不带www跳转到带www的域名上。

方法如下:

一、建立具有301跳转功能的页面,暂命名为301.php

<?php  
$the_host = $_SERVER['HTTP_HOST'];
$request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ”;
if($the_host !== ‘www.zyc.me’)
{
  header(‘HTTP/1.1 301 Moved Permanently’);
  header(‘Location: http://www.zyc.me’.$request_uri);
}
?>

二、添加伪静态规则
RewriteCond Host: ^zyc\.me$
RewriteRule (.*) /301.php [L]

[ php ] 过滤xml中的无效字符

一般XML中如果含有&等字符,可以通过CDATA来过滤,但是含有一些不认识的特殊字符时候就会不起作用,下面是从别人那儿拿来的一个过滤方法,过滤xml中的无效字符

//XML标准规定的无效字符为:
/* 0×00 – 0×08 0x0b – 0x0c 0x0e – 0x1f */ 
//所以很简单,输出的时候过滤这些字符就万无一失了,下面是PHP的实现。
/*******PHP 实现*******/
function XmlSafeStr($s)
{
       return preg_replace("/[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f]/","",$s);
}

W3C的XML规范中关于字符的定义请参看这里:http://www.w3.org/TR/2004/REC-xml-20040204/#charsets

 

还有可能,在php开发中遇到了这样的问题。utf-8编码的字符保存到数据库时可能因为字符串过长被截取保存了,截取后的数据很可能就包含非法字符了。这样的字符放到xml中,会导致整个xml不合法,无法被解析,程序对数据的依赖性太大。即使是放到cdata中也是如此。所以必须对可能的非法字串进行预处理。

发现php有个函数mb_check_encoding,可以判断是否是某个编码的合法字串:

function validutf($str){
if( mb_check_encoding($str,"utf-8") )
return $str;
else
return "unknow data";
}

用上面的函数,返回的就一定是合法的utf-8字串了,可用于组装xml。非法数据毕竟是少数,用unknow data代替。

电脑上使用SuperOneClick破解安卓手机Root权限

许多机友新购来的Android手机没有破解过Root权限,无法进行一些高权限的操作,以及使用一些需要高权限的软件,其实破解手机Root权限是比较简单及安全的,破解Root权限的原理就是在手机的/system/bin/或/system/xbin/目录下放置一个可执行文件“su”,这是一个二进制文件,相当于电脑上的exe文件,仅仅在系统中置入这个“su”文件是不会给手机的软件或硬件造成任何故障。

本章讲解使用SuperOneClick这款电脑上的软件来破解系统,因为它相对安全可靠,可破解很多的机型,官方给出支持的机型有:Acer Liquid Metal,Dell Streak,HTC Magic (Sapphire) 32B,HTC Bee,LG Ally,Motorola Atrix4G,Motorola Charm,Motorola Cliq,Motorola Droid,Motorola Flipside,Motorola Flipout,Motorola Milestone,Nexus One,Samsung Captivate,Samsung Galaxy 551 (GT-I5510),Samsung Galaxy Portal/Spica I5700,Samsung Galaxy S 4G,Samsung Galaxy S I9000,Samsung Galaxy S SCH-I500,Samsung Galaxy Tab,Samsung Transform M920,Samsung Vibrant,Sony Ericsson Xperia E51i X8,Sony Ericsson Xperia X10,Sprint Hero,Telus Fascinate,Toshiba Folio 100,v880,u880

Root方法
一、如果你使用的是Windows XP的操作系统,首先得在电脑上安装.NET Framework v2.0版或更高版本,不然会无法运行此软件。微软官方下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5
二、安装手机驱动,由于Android机型众多,你使用的是什么品牌的手机,就去这个品牌的官方网站上下载相应的套件或驱动安装在你的电脑上,记住是你手机的官方网站,然后找到你的机型再下载,不是百度出来的下载地址,某些型号的手机连上电脑后有一个CD盘,里面就包含手机驱动了。
三、完成前面两步,准备手机数据线,在 手机设置>>应用程序>>开发 中勾上 USB调试
四、百度搜索“最新版SuperOneClick”,然后解压缩(如果多次严格按教程操作无法破解,请点这里下载老版本SuperOneclick进行破解)

破解:
完成以上四步后,将手机与电脑连接,选择USB充电模式,解压SuperOneClickv1.9.1-ShortFuse.zip,找到里面的SuperOneClick.exe,双击运行,界面就出来了,以下图片均可点击放大

1

不要看界面上的按钮很多,其实你只要点最左边的Root就行了!就是这个按钮

2 

然后静待,如果超过两分钟都没有提示,请拔掉手机数据线,彻底关掉电脑上的91助手或其它管理软件,重新连上手机,再点Root。
下面是笔者破解实测,点击Root后,稍等一会儿,出来提示,见下图

3

提示的意思是,没有检测出手机上android的版本,你使用的是否是Android 2.0或更高?有可能你的手机不会有提示, 这里按照你手机系统来确定,我们这里是破解Android 2.2.1,所以选择“是(Y)”,然后几秒钟就会出来新提示,root文件已安装,是否要运行测试看看?可随便选“是(Y)”或“否(N)”,我们这里选择“是(Y)”,然后出来下面的图,提示你是否要捐赠,随便你选择,选择后完成操作!见下图

4

最主要是看这里:

5
显示成这样就成功了!在提示你不要忘记重启你的手机!重启手机,完成Root权限破解

Chainfire3D:让普通Android手机玩上高通/Tegra专属游戏

  由于Android系统的硬件差别很大,因此有不少游戏开发商就设置了机型限制或者3D加速模块的局限性,让其它很多非专属平台的机器无法运行他们的游戏,这是一直困扰着很多机油的问题…… 现在,Chainfire3D 成功解决了这个问题!这是Android手机上首个实现模拟跨平台GPU驱动的软件。用户只需在普通Android手机(平板电脑)上安装 Chainfire3D,并设置对应该平台的插件,就可以直接玩 德州仪器/高通/NVIDIA Tegra 2 平台的专属游戏了。

注意:

1、你的Android设备必须已获得ROOT权限;(电脑上使用SuperOneClick破解安卓手机Root权限
2、目前Chainfire3D还不太成熟,无法保证所有游戏都能运行或完美运行;
3、如果你的手机配置比较低,本来就玩不了大型游戏,那么Chainfire3D也帮不了你;

已通过测试的可用机型:

Nexus S
MOTO DEFY (ME525)
MOTO Milestone
中兴 U880
i9000
HTC G7
(还有市面上多数主流机型都可以)

目前在主流机中唯一已证实:魅族M9无法使用Chainfire3D

使用Chainfire3D教程

一、准备工作  
1、安装Chainfire3D

该软件有两种版本:Chainfire3D 与 Chainfire3D Pro(专业版)。建议您使用 Chainfire3D 的最新汉化版本。
版本差别:普通版每次进入不同平台的游戏之前,要重新设置与之对应的插件;而Chainfire3D Pro 则支持为每个游戏做单独配置。
点击下载:最新版 Chainfire3D PRO 2.8 (专业版/汉化版)
先安装Chainfire 3D 2.8汉化版.apk,再安装Chain_fire_3D_Pro.apk(增加PRO功能)
2、安装插件包:插件包(软件包里已包含)里的3个文件(.zip格式)直接放到手机内存卡任意目录(不要将插件的.zip继续解压)。

二、【使用教程】

1.安装好Chainfire3D并运行,弹出【授权请求】窗口,点击『允许』。
2.进入『CF3D driver』菜单
3.点击『Install』安装模拟GPU的驱动程序;
4.手机自动重启!
5.重启完毕,再次运行Chainfire3D,进入『安装插件』菜单;
6.把那三个插件都安装一次(点击安装)
7.后退返回主界面,进入『默认OpenGL设置』菜单;
8.进入『管理插件』菜单;
9.选择你需要模拟的平台,然后尽情游戏吧!

提醒:请根据你要运行的游戏的要求选择模拟环境

NVIDIA 为:NVIDIA Tegra2 平台
POWERVR 为:三星&德州仪器平台
QUALCOMM 为:高通平台

特别注意:
当你不再玩跨平台游戏,或要运行普通程序的时候,请记得将『管理插件』重新设置为“无”。

有了Chainfire3D,我们就可以运行一些以前受平台限制而不能玩的游戏啦~

debian安装配置vsftpd虚拟用户并实现不同用户使用不同目录

之前成功配置了基于debian的用虚拟用户登录的vsftpd(文本方式),体会到了使用虚拟用户的好处及灵活性(即:用不同用户使用不同目录拥有不同权限),下面是配置步骤。

一、各种安装
首先创建ftpuser.txt,内容如下:

admin
adminpassword
test
testpassword
奇数行为用户名,偶数行为密码。

安装数据库 db(最新版为db4.8)

apt-get install db4.8-util

生成数据库

db4.8_load -T -t hash -f  ftpuser.txt /etc/vsftpd_login.db

设置权限

chmod 600 /etc/vsftpd_login.db

二、各种配置
配置PAM
修改/etc/pam.d/vsftpd 内容如下:

auth required /lib/security/pam_userdb.so db=/etc/vsftpd_login
account required /lib/security/pam_userdb.so db=/etc/vsftpd_login

为虚拟用户创建本地用户

useradd -d /home/ftpsite  -s /sbin/nologin virtual
mkdir /home/ftpsite
chown virtual.virtual /home/ftpsite

查看一下:

ls -ld /home/ftpsite
drwxr-sr-x 2 virtual virtual 48 2011-09-24 05:48 /home/ftpsite

根据需要创建/etc/vsftpd.conf,但要确保含有以下设置:

anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
chroot_local_user=YES
guest_enable=YES
guest_username=virtual
listen=YES
listen_port=21
pasv_min_port=30000
pasv_max_port=30999

重启 vsftpd   OK

注:若vsftp默认匿名不能在根目录上传建立文件并提示500错误时,一般为/home/ftp的权限问题;ftp用户不能有写的权限,如果需要匿名上传,在/home/ftp目录下建立一个ftp:ftp所有的 目录,即可使用匿名上传。

例:
mkdir upload
chown  ftp:ftp upload

虚拟用户无法登录,请注释掉  /etc/pam.d/vsftpd里的

#@include common-account
#@include common-session
#@include common-auth
#auth   required    pam_shells.so

—————–憂鬱的debian分割线———————-

现在使不同虚拟用户使用不同的目录 

首先 编辑vsftp.conf 增加

user_config_dir=/etc/vsftpd/vsftpd_user_conf

然后

mkdir /etc/vsftpd
mkdir /etc/vsftpd/vsftpd_user_conf

建立虚拟用户名字的文本文件(例如:你一个虚拟用户名字为test)

touch /etc/vsftpd/vsftpd_user_conf/test

编辑test 加入test的目录

local_root=/home/test

再注一下:test的目录要更改为virtual用户的权限!

mkdir test
chown virtual:virtual  test

用SSH备份/恢复MySQL数据库

目前,多数主机已经开始支持或者部分支持SSH(Shell)了,SSH的功能非常强大,要是能有效的学习和利用,确实是站长们的利器。
这里要讲述的是:如何通过SSH(Shell)来备份和恢复(导入)MySQL数据库
首先你需要先了解一系列SSH相关的知识以及命令,这里就不说了,在网上搜一下,一堆。。。
之后,确认你的空间支持SSH。连通SSH可以通过去下载一个Putty搞定后,下面就是具体的步骤了:
注意:需要先登录SSH,登陆以后,一路cd到自己觉得合适操作的目录下(确认当前目录可写)。这个目录就是用来下载我们要备份的数据库用的,将来可以作为数据备份存储目录,所以慎重选择,注意安全!
备份数据的过程
选好目录以后,在命令行输入以下命令来备份数据库:
mysqldump -h mysql.caopeng.net -p mysql_dbname -u mysql_dbuser >bak.sql
 
注意:这里的zyc.me是您的数据库服务器地址,mysql_dbname是您的数据库名称,mysql_dbuser 是您的数据库用户名,bak.sql是你备份的数据库的脚本文件名称(将来可用来恢复数据)。
然后回车,提示你输入数据库登陆密码,输入完密码后回车即可,Liunx下输入密码是不回显的,所以你只管输入,注意别错了就行啦!
这时数据库就备份到当前目录下了,备份文件是bak.sql ,回车后输入密码,Liunx下输入密码是不回显的
导入(恢复)数据的过程
依然还是在之前SSH的命令行模式下,输入以下命令进入数据库:

mysql -h zyc.me -p mysql_dbname -u mysql_dbuser
然后回车,提示你输入数据库登陆密码,输入密码后,回车会出现MySQL操作提示符号,之后输入下面的命令:

source bak.sql
注意要先确认bak.sql这个文件在当前目录下哦,没问题后点击 回车,这是就开始恢复数据啦,耐心等待一会儿吧。。。
详细的过程如下

[root@ip-97-26-74-88 mysql]# mysql -h zyc.me -p mysql_dbname -u mysql_dbuser

Enter password:

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g.

Your MySQL connection id is 57

Server version: 5.0.45 Source distribution

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the buffer.

mysql> source bak.sql

……………………..省略……………………

mysql> exit

Bye

注意:数据库比较大的话,需要的时间会长一点,也取决于空间数据库的写入速度。
实际上,任何支持SSH并且没有屏蔽MySQL/MySQLDUMP/SOURCE命令的空间,都可以用本方法。即使数据库版本不一样,99%也不会出现乱码现象!

用XML-RPC协议读写WordPress上的文章

PHP语言: 用XML-RPC协议读写WordPress上的文章

使用Incutio的XML-RPC库和Blogger API发布文章的例子,其中IXR库也是Wordpress自身所用的库,可以在“wp-includes/class-IXR.php”找到。

<?php
$xmlrpcurl='http://zyc.me/xmlrpc.php';
$blogid='1';
$username='admin';
$password='pass';
$postTitle='标题';
$postContent='正文内容';
<?php
include(“xmlrpc.inc”); // 这里要改成xmlrpc.inc所在的路径
$GLOBALS['xmlrpc_internalencoding'] = ‘UTF-8′;

define (‘DOMAIN’, ‘zyc.me’); // 博客的域名
define (‘BLOGID’, 1); // 博客ID,一般为1
define (‘USER’, ‘admin’); // 博客登录的用户名
define (‘PASSWORD’, ‘pass’); // 博客登录的密码

// 创建 xml-rpc client
$cl = new xmlrpc_client ( “/xmlrpc.php”, DOMAIN, 80);

// 准备请求
$req = new xmlrpcmsg(‘metaWeblog.newPost’);
// 逐个列出请求的参数:
$req->addParam ( new xmlrpcval ( BLOGID, ‘int’)); // 博客ID
$req->addParam ( new xmlrpcval ( USER, ‘string’ )); // 用户名
$req->addParam ( new xmlrpcval ( PASSWORD, ‘string’ )); // 密码
$struct = new xmlrpcval (
array (
“title” => new xmlrpcval ( ‘标题’, ‘string’ ), // 标题
“description” => new xmlrpcval ( ‘正文内容’, ‘string’), // 内容
), “struct”
);
$req->addParam ( $struct );
$req->addParam ( new xmlrpcval (1, ‘int’)); // 立即发布

// 发送请求
$ans = $cl->send($req);

var_dump ( $ans );
?>

//注意一定要加上:$GLOBALS['xmlrpc_internalencoding'] = ‘UTF-8′;这一句,否则不能正确处理中文。

//另一段也是用phpxmlrpc库和metaWeblog接口发表文章的例子代码,该代码使用了返回类型为“phpvals”,这样可以直接用返回结果的$r->val来获取文章ID号。


<?php
include("xmlrpc.inc");
$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
$c = new xmlrpc_client("/xmlrpc.php", "zyc.me", 80);
$content['title']="标题"; //标题
$content['description']="正文内容"; //内容
$content['mt_keywords']="标签1,标签2"; //标签
$content['wp_password']=""; //文章密码,输入后显示加密
$content['categories'] = array("分类1","分类2"); //分类名
$x = new xmlrpcmsg("metaWeblog.newPost",
array(php_xmlrpc_encode("1"), //BLOG ID
php_xmlrpc_encode("admin"), //用户名
php_xmlrpc_encode("pass"), //密码
php_xmlrpc_encode($content),
php_xmlrpc_encode("1"))); //立即发表

$c->return_type = 'phpvals';
$r =$c->send($x);
if ($r->errno=="0")
echo "发表成功,文章序号为:".$r->val;
else {
echo "出错了";
print_r($r);
}
?>

//以下是读取最新一篇文章的例子代码:


<?php
include("xmlrpc.inc");
$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
$c = new xmlrpc_client("/xmlrpc.php", "zyc.me", 80);
$msg = new xmlrpcmsg('metaWeblog.getRecentPosts',
array(php_xmlrpc_encode("1"),
php_xmlrpc_encode("admin"),
php_xmlrpc_encode("pass"),
php_xmlrpc_encode("1")) );
$res = $c->send($msg);
$val = $res->value();

$val->arraymem(0)->structreset();
while (list($key, $v) = $val->arraymem(0)->structeach())
{
echo "Element: $key; Type: ".$v->kindOf()."; Value:".$v->scalarval()."\n";
}
?>


require('class-IXR.php'); // /wordpress/wp-includes/class-IXR.php
$client = new IXR_Client($xmlrpcurl);
$params=array(
'',
'blog_ID'=>$blogid,
'user_login'=>$username,
'user_pass'=>$password,
'post_content'=>'' . $postContent,
'publish'=>true
);
$params=array_values($params);

$client->query("blogger.newPost",$params);
$response=$client->getResponse();

if ($response['faultCode']==0){
print 'Success';
} else {
print 'Fail:' . $response['faultString'];
}
?>

//以下是用XML-RPC for PHP库和metaWeblog接口发布文章的例子。要先下载phpxmlrpc库取出其中的xmlrpc.inc来用。