关于网站运营方面一些小看法
一直从事偏技术工作,年末了对公司网站运营的状态做了一点分析,将自己对于网站运营的一些看法整理了一下。
网站运营目标一般来说应该是侧重于两个方面
- 提高PV量
- 提高注册用户量
不用说了,目前大家都看重这个数据,大致可以简单分为站内注册用户带来的PV和非注册的站外用户带来的PV。
尽量增加网站注册用户数量,让更多的人来使用网站,对注册的用户进行分析分类,进而提供针对性的服务。
其他衍生出一些Alex排名,PageRank之类的
网站用户来源看,访问网站的用户一般分为:
- 注册的站内用户
- 非注册的站外用户
- 合作网站用户
- 搜索引擎用户
一般通过这种方式过来的用户要么看到的是首页要么是一个特定合作页面
一般通过这种方式过来的用户看到的是网站上具体信息的页面
注册用户,一般会有一个关于自己账号的控制台
一般会采用如下一些网站运营方式来达到以上的目标
- 提升站内内容质量
- 开发新的功能
- 发展合作网站
- 广告/Email/活动 等
依据SEO的一些原则,对网站进行优化,在注重信息质量的基础上再细心处理信息页面上的页面链接关系,做出恰当的页面导。
对用户的使用行为以及心理做分析,开发出新的能够吸引用户使用的功能。
利用吸引合作网站上的用户过来使用
在开发一个新功能或做一次具体营销时要考虑的问题
- 针对的目标群是什么? 站内注册用户 ? 非注册的站外用户?…
- 所要达到结果是什么?增加注册用户数?增加站内用户PV?增加站外用户PV?…
- 开发本新功能(实施本次营销)所需要花费的时间和成本各是多少?
Popularity: 5% [?]
Random Posts
如何计算网站访问的有效PV量
为了更好的分析得到的PV量, 使自己由日志文件得到的PV量更接近Google
由日志中统计出的PV量要排除掉如下一些:
- 1. 搜索引擎爬虫过来的
- 2. 中间跳转页面
- 3. 页面中内嵌的页面
- 4. Ajax数据交换使用过的接口页面
- 5. 内部数据接口交互使用的PV
搜索引擎,爬虫这些访问不是用户行为,应该排除
处理方法: 一般有异常IP地址的访问量和UA信息的判断获得,排除这些因素的PV量
中间跳转页面,对用户来说只能看到跳转后的页面信息,之前发起跳转的页面对用户不可见,应该排除
处理方法: 找出设计中存在的跳转页面,排除跳转前的页面或跳转后的页面所汇集的PV量。
最好在业务设计和程序设计时做考虑处理,减少中间页面跳转这类的处理。
这类是使用Frame或Div等形式,嵌在一个页面中的一小块信息,
处理方法:找出这类地址,对其做访问量排除
如果内嵌的是广告信息等,可以考虑单独做分析
这类地址一般用户看不到,应该排除,
处理方法:找出这类的地址,然后在统计量中排除对这些地址的访问,最好在程序设计上将其放到一个目录下,这样可以直接排除对某个目录的访问。
这个不是针对用户的,也应该排除
处理方法:找出这类的地址,然后在统计量中排除对这些地址的访问,最好在程序设计上将其放到一个目录下,这样可以直接排除对某个目录的访问。
注意点: 以上排除项对一些地址会有重复,比如既是搜索引擎的访问,又是内嵌的小页面地址,这样在处理时要注意,以防造成PV量的重复剔除
Popularity: 5% [?]
Related
Nginx服务器的upload上传模块
在Nginx网站的模块列表页中发现一个Nginx服务器的上传模块http://www.grid.net.ru/nginx/upload.en.html
该模块通过Nginx服务器来接受用户上传的文件,在Nginx接受完文件以后再转给后端的程序做处理。
它自动分析客户端的上传请求,将上传的文件保存到 upload_store 所指向的目录位置. 然后这些文件信息将被从原始的请求中剔除,重新组装好上传参数后转到后端由 upload_pass 指定的位置去处理,这样就可以任意处理上传的文件。
每一个上传的 file 字段值将可以由upload_set_form_field 指定的值替换. 文件的内容可以由$upload_tmp_path 变量读到或简单的移到其他位置. 将文件删除由 upload_cleanup 指定控制。
upload_set_form_field可以使用的几个变量
- $upload_field_name
- $upload_content_type
- $upload_file_name
- $upload_tmp_path
原始的文件字段
上传文件的类型
客户端上传的原始文件名称
上传的文件保存在服务端的位置
upload_aggregate_form_field 可以多使用的几个变量,文件接收完毕后生成的
- $upload_file_md5
- $upload_file_md5_uc
- $upload_file_sha1
- $upload_file_sha1_uc
- $upload_file_crc32
- $upload_file_size
文件的MD5校验值
大写字母表示的MD5校验值
文件的SHA1校验值
大写字母表示的SHA1校验值
16进制表示的文件CRC32值
文件大小
官方的设置举例
-
# 上传表单应该提交到这个地址
-
location /upload {
-
# 将请求体转到这个位置
-
upload_pass /test;
-
-
# 将上传的文件保存到这个目录下
-
# 目录是被散列化的,应该存在子目录 0 1 2 3 4 5 6 7 8 9
-
upload_store /tmp 1;
-
-
# 允许上传的文件被用户 user 只读
-
upload_store_access user:r;
-
-
# 设置请求体的字段(添加自己后端处理的信息)
-
upload_set_form_field "${upload_field_name}_name" $upload_file_name;
-
upload_set_form_field "${upload_field_name}_content_type" $upload_content_type;
-
upload_set_form_field "${upload_field_name}_path" $upload_tmp_path;
-
-
# 指示后端关于上传文件的md5值和文件大小
-
upload_aggregate_form_field "${upload_field_name}_md5" $upload_file_md5;
-
upload_aggregate_form_field "${upload_field_name}_size" $upload_file_size;
-
-
# 指示原样转到后端的参数,可以正则表达式表示
-
upload_pass_form_field "^submit$|^description$";
-
}
-
-
# 将请求转到后端的地址处理
-
location /test {
-
proxy_pass http://localhost:8080;
-
}
-
}
将模块添加到Nginx中的方法
下载源代码解压后
为nginx配置额外模块(需要重新编译):
-
tar xvzf nginx_upload_module-2.0.7.tar.gz
-
cd nginx631
-
./configure –add-module=/usr/local/nginx_upload_module-2.0.7
-
make
-
make install
Popularity: 6% [?]
Related
November 25, 2008 | Filed Under LAMP, My Projects, Productivity, WebServer | Comments Off
几种常见WEB日志分析方法中被统计的用户访问量差异产生原因分析
这几天一直根据原始的weblog文件做日志分析,发现如下一些ip访问量和页面访问量方面的问题。
通常我们会用如下的一些工具来做WEB网站访问日志的分析。
- 1. 免费的google/yahoo 分析的ip地址量,访问人次和页面访问量
- 2. awstats 分析出的访问人次和页面访问量
- 3. 自己通过shell脚本做的原始weblog统计得到的ip量和页面访问量
这几者之间方法机制的存在着差别,就需要好好分析一些,提升一下自己在通过方式 3 得到的数据的精确性,同时也有助于发现一些存在的问题。
- 1.google/yahoo是通过页面脚本来做统计,这样就使得那些被浏览器加载并被用户看到的页面被统计到(当然不是绝对的,但基本上就是这样了),而那些在服务器端通过发送 Header Location: /xxxurl 跳转的页面不会被统计,同时那些使用ajax和服务器进行数据交互的访问也不会被统计记录。
- 2.awstats分析的是日志文件,采用方法基本上是基于对日志记录行的 正则表达式 匹配所进行的分析统计。这样一些不被google/yahoo统计的中间页面访问也会被当作pv进入统计。
- 3.自己的方式比较灵活,采用的分析机制基本同于awstats,但是更具有灵活性,自己想怎么分析就怎么分析(当然前提是weblog可以提取那些信息供分析)
工具 | ip量 | 唯一访问者数 | 访问人次 | pv量 |
– | X | X | X | |
awstat | – | X | X | X |
yahoo | X | X | X | X |
注: awstats也有唯一访问数的统计,不过只能在摘要和按月历史统计中才能看到,不能以按天的方式看到,为了方便这边对比看到某一天的数据,我单独以某天的日志做一个配置,得到的按月数据等同于按天。
对几种工具的统计的情况对比(以实际统计中某几天的数据做对比)
统计结果呈现出: ip量 < 唯一人数 < 访问人次
对PV量的统计
google 和 yahoo 差不多, awstats 统计出的 页面数 比google和yahoo统计出来的数量要多出约两倍左右。产生这个现象的原因: google和yahoo都是采用的在页面嵌入脚本的方式,这样统计出来的就都是在用户浏览器上显示的页面,所以他们统计出的结果差不多。和awstat统计结果发生大偏差的原因:
- 1.这个页面有可能是通过中间跳转过来的,被awstats分析了,但是没有浏览器的页面统计脚本执行,不会被google/yahoo记录。
- 2.是在一个页面里面还嵌入了一个另外的页面,对google/yahoo还只是一个页面执行了统计脚本。
- 3.还有就可能是这个页面中忘记放用来统计的js代码。
访问人次:
这个项只有 google和awstas有,其中google得到的人次要比awstats多。这个可以解释为他们用来识别两次访问间的时间间隔不同。google的判断时间间隔小,所以得到的总访问次数多。
唯一人数:
这个的结果是 yahoo < awstats < google
这个结果的不同可能是由于采用了不同的鉴别唯一用户的算法。估计采用了公网ip+ua+内网ip等的不同组合,从而得到的唯一用户数也不同。
IP访问量
这个只有 yahoo 提供,其他方式中没有该项,但是是可以反映出 ip地址量少于 唯一用户数的 。
对方式3自己写shell脚本做分析,在pv上得到的数据和awstats更接近一些,因为所使用的数据源和分析方式类似。
awstats使用缓冲记录运算获得的用户停留时间等信息不好获得,但是可以做出其他的一些按照ip为基准而awstat等工具未提供的统计,比如
- 某个业务模块下的ip访问量
- 只有一次web日志的ip量,有两,三,四次日志记录的ip量,5-10次,10次以上日志记录的ip量等
- 有文件访问但是没有正常网页访问的ip量
- 全部是失败访问确没有成功访问的ip量
- 其他一些 awstats和google/yahoo统计上没有的数据
Popularity: 6% [?]
Related
NotPageList的设置会引起Awstats用户访问量统计发生变化
为了方便业务做分析,给awstats添加了一下 ExtraSection 的设置, 结果隔天同事反映awstats统计的访问用户数量一下子少掉好多。
想想ExtraSection的设置不应该影响到Awstats的访问用户数统计,但是打开看awstats的统计量,pv,文件数都没有什么变化,但确实用户访问量发生了大的变化。
于是努力回想在给Awstats设置ExtraSection的时候,还对awstats配置的什么地方做了改动,终于在对比后想起来是修改了 NotPageList 的设置,将zip, swf, wma 等后缀的也做了NotPageList的过滤。
于是猜想是否由于这个选项的设置变化导致了awstat的统计结果不一样,立马开始做验证,将其中几天的日志转到测试服务器上,建立两个配置,一个NotPageList是使用默认的设置,另外一个NotPageList中添加了额外扩展名的设置。
然后分别对两个配置做 update 后再对数据进行查看比较,发现添加额外的扩展名后,访问用户数变少,网页数的统计有变少,文件数没有太大变化。
结论: NotPageList的设置确实会影响AWSTATS对 访问用户数, 页面数,文件数等的统计结果。
带来的问题: AWstats是怎么计算用户访问数的?
根据以上对比和对其中部分代码的分析有如下一些初步结论:
参与访问用户量分析的只有那些被识别为网页的记录
唯一用户数: 用ip 地址 + ua 信息的组合来识别不同的用户访问
访问人次: 被识别的唯一用户在最后一次页面访问后又间隔一定时间(30分钟?)后再次访问,算是该用户的第二次访问。
根据这个分析回过来看前面由于NotPageList的设置变化而导致的统计用户数上差别的原因就可能是:
网页上有对额外添加的这些扩展名文件的连接,对这些文件的打开采用了不同于浏览器ua的插件或工具打开,造成新的ip+ua的组合和用户正在打开页面的ip+浏览器ua不一样,被awstats识别为一个新的用户访问。
Popularity: 5% [?]
Related
http返回代码的一般含义
因为要做web日志做分析,http的返回代码所代表的意思也要再搞清一下,方便分析。
1XX 代码
这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个1xx 响应
- 100 – 继续
- 101 – 切换协议
2XX 代码
这类状态代码表明服务器成功地接受了客户端请求,一般日志中记录下的应该200的为多
- 200 – 客户端请求已成功
- 201 – 已创建
- 202 – 已接受
- 203 – 非权威性信息
- 204 – 无内容
- 205 – 重置内容
- 206 – 部分内容
3XX 代码
表示重定向,客户端浏览器必须采取更多操作来实现请求,比如 header Location: /anotherurl 这样的命令。
- 302 – 对象已移动
- 304 – 未修改
- 307 – 临时重定向
4XX 代码
表示客户端有问题,比如请求了一个不存在的文件。
- 400 – 错误的请求
- 401 – 访问被拒绝
- 403 – 禁止访问
- 404 – 文件未找到
- 405 – 用来访问页面的HTTP方法不被允许
- 406 – 客户端浏览器不接受所请求页面的 MIME 类型
- 407 – 要求进行代理身份验证
- 412 – 前提条件失败
- 413 – 请求实体太大
- 414 – 请求URI太长
- 415 – 不支持的媒体类型
- 416 – 所请求的范围无法满足
- 417 – 执行失败
- 423 – 锁定的错误
5XX 代码
表示服务器端有问题,比如服务器端内存不足,响应超时等。
- 500 – 内部服务器错误
- 501 – 页眉值指定了未实现的配置
- 502 – Web 服务器用作网关或代理服务器时收到了无效响应
- 503 – 服务不可用
- 504 – 网关超时
- 505 – HTTP 版本不受支持
红颜色的代码是我们经常看到的。
更细的含义这边有一份HTTP返回代码表
Popularity: 5% [?]
Related
根据weblog分析某个业务下的ip访问量
目标:
对日志做分析,获取各个模块的ip访问量。
计划方法:
1. 首先获得符合条件的访问日志记录
2. 对符合条件的记录做排序做uniq得到模块目录下唯一ip列表
3. 再使用uniq 获得各个模块的ip数量
实施步骤:
1. 提取符合条件的日志行,输出ip地址和url
-
cat www.access.log |awk '($7 ~ /\.php/|| $7 ~/\/mod1\//){print $1 " " $7}'
2. 通过sed从url中提取模块目录的名称
-
|sed -e 's/\(^\/[^\/?"]*\).*/\1/'
3. 排序求每个模块下唯一的ip
-
| awk '{print $2 " " $1}' |sort |uniq
4. 对每个模块做统计倒序排列
-
| awk '{print $1}' | uniq -c |sort -nr
合起来:
-
cat www.access.log |awk '($7 ~ /\.php/|| $7 ~/\/mod1\//){print $1 " " $7}' \
-
|sed -e 's/\(^\/[^\/?"]*\).*/\1/' \
-
| awk '{print $2 " " $1}' |sort |uniq
-
| awk '{print $1}' | uniq -c |sort -nr
Popularity: 5% [?]
Related
为了Awstats给Nginx添加FastCGI方式的Perl支持
有个应用(awstats)需要Perl脚本支持,但是用的Nginx服务器,对Perl支持不好,于是通过FastCGI方式来使用Perl。
首先安装Perl的FCGI模块
-
wget http://www.cpan.org/modules/by-module/FCGI/FCGI-0.67.tar.gz
-
tar -zxvf FCGI-0.67.tar.gz
-
cd FCGI-0.67
-
perl Makefile.PL
-
make && make install
还可以使用如下方法安装:
perl -MCPAN -e 'install FCGI'
安装FCGI-ProcManager
-
wget http://search.cpan.org/CPAN/authors/id/G/GB/GBJK/FCGI-ProcManager-0.18.tar.gz
-
tar -xzxf FCGI-ProcManager-0.18.tar.gz
-
cd FCGI-ProcManager-0.18
-
perl Makefile.PL
-
make
-
make install
Perl的FastCGI启动脚本
参考这篇文章 http://bbs.chinaunix.net/archiver/?tid-1224968.html
vi fcgi_perl
-
#!/usr/bin/perl -w
-
use FCGI;
-
use Socket;
-
use FCGI::ProcManager;
-
sub shutdown { FCGI::CloseSocket($socket); exit; }
-
sub restart { FCGI::CloseSocket($socket); &main; }
-
use sigtrap 'handler', \&shutdown, 'normal-signals';
-
use sigtrap 'handler', \&restart, 'HUP';
-
require 'syscall.ph';
-
use POSIX qw(setsid);
-
-
#&daemonize; we don't daemonize when running under runsv
-
#this keeps the program alive or something after exec'ing perl scripts
-
END() { }
-
BEGIN() { }
-
{
-
no warnings;
-
*CORE::GLOBAL::exit = sub { die "fakeexit\nrc=" . shift() . "\n"; };
-
};
-
eval q{exit};
-
if ($@) {
-
exit unless $@ =~ /^fakeexit/;
-
}
-
&main;
-
-
sub daemonize() {
-
chdir '/' or die "Can't chdir to /: $!";
-
defined( my $pid = fork ) or die "Can't fork: $!";
-
exit if $pid;
-
setsid() or die "Can't start a new session: $!";
-
umask 0;
-
}
-
-
sub main {
-
#如果使用 IP sockets
-
#$socket = FCGI::OpenSocket( "127.0.0.1:8999", 10 );
-
#如果使用 UNIX sockets
-
#$socket = FCGI::OpenSocket( "/var/run/perl_cgi-dispatch.sock", 10 );
-
-
#foreach $item (keys %ENV) { delete $ENV{$item}; }
-
#设置fastcgi进程数,默认四个
-
my $n_processes = $ENV{FCGI_NPROCESSES} || 4;
-
$proc_manager = FCGI::ProcManager->new( {n_processes => $n_processes} );
-
#使用unix socket
-
$socket = FCGI::OpenSocket( "$ENV{FCGI_SOCKET_PATH}", 10 );
-
#设置Socket权限
-
chmod 0777, $ENV{FCGI_SOCKET_PATH};
-
-
; #use UNIX sockets – user running this script must have w access to the 'nginx' folder!!
-
$request =
-
FCGI::Request( \*STDIN, \*STDOUT, \*STDERR, \%req_params, $socket,
-
&FCGI::FAIL_ACCEPT_ON_INTR );
-
$proc_manager->pm_manage();
-
if ($request) { request_loop() }
-
FCGI::CloseSocket($socket);
-
}
-
-
sub request_loop {
-
while ( $request->Accept() >= 0 ) {
-
$proc_manager->pm_pre_dispatch();
-
-
#processing any STDIN input from WebServer (for CGI-POST actions)
-
$stdin_passthrough = '';
-
{ no warnings; $req_len = 0 + $req_params{'CONTENT_LENGTH'}; };
-
if ( ( $req_params{'REQUEST_METHOD'} eq 'POST' ) && ( $req_len != 0 ) )
-
{
-
my $bytes_read = 0;
-
while ( $bytes_read < $req_len ) {
-
my $data = '';
-
my $bytes = read( STDIN, $data, ( $req_len – $bytes_read ) );
-
last if ( $bytes == 0 || !defined($bytes) );
-
$stdin_passthrough .= $data;
-
$bytes_read += $bytes;
-
}
-
}
-
-
#running the cgi app
-
if (
-
( -x $req_params{SCRIPT_FILENAME} ) && #can I execute this?
-
( -s $req_params{SCRIPT_FILENAME} ) && #Is this file empty?
-
( -r $req_params{SCRIPT_FILENAME} ) #can I read this file?
-
)
-
{
-
pipe( CHILD_RD, PARENT_WR );
-
pipe( PARENT_ERR, CHILD_ERR );
-
my $pid = open( CHILD_O, "-|" );
-
unless ( defined($pid) ) {
-
print("Content-type: text/plain\r\n\r\n");
-
print
-
"Error: CGI app returned no output – Executing $req_params{SCRIPT_FILENAME} failed !\n";
-
next;
-
}
-
$oldfh = select(PARENT_ERR);
-
$| = 1;
-
select(CHILD_O);
-
$| = 1;
-
select($oldfh);
-
if ( $pid > 0 ) {
-
close(CHILD_RD);
-
close(CHILD_ERR);
-
print PARENT_WR $stdin_passthrough;
-
close(PARENT_WR);
-
$rin = $rout = $ein = $eout = '';
-
vec( $rin, fileno(CHILD_O), 1 ) = 1;
-
vec( $rin, fileno(PARENT_ERR), 1 ) = 1;
-
$ein = $rin;
-
$nfound = 0;
-
-
while ( $nfound =
-
select( $rout = $rin, undef, $ein = $eout, 10 ) )
-
{
-
die "$!" unless $nfound != -1;
-
$r1 = vec( $rout, fileno(PARENT_ERR), 1 ) == 1;
-
$r2 = vec( $rout, fileno(CHILD_O), 1 ) == 1;
-
$e1 = vec( $eout, fileno(PARENT_ERR), 1 ) == 1;
-
$e2 = vec( $eout, fileno(CHILD_O), 1 ) == 1;
-
-
if ($r1) {
-
while ( $bytes = read( PARENT_ERR, $errbytes, 4096 ) ) {
-
print STDERR $errbytes;
-
}
-
-
if ($!) {
-
$err = $!;
-
die $!;
-
vec( $rin, fileno(PARENT_ERR), 1 ) = 0
-
unless ( $err == EINTR or $err == EAGAIN );
-
}
-
}
-
if ($r2) {
-
while ( $bytes = read( CHILD_O, $s, 4096 ) ) {
-
print $s;
-
}
-
if ( !defined($bytes) ) {
-
$err = $!;
-
die $!;
-
vec( $rin, fileno(CHILD_O), 1 ) = 0
-
unless ( $err == EINTR or $err == EAGAIN );
-
}
-
}
-
last if ( $e1 || $e2 );
-
}
-
close CHILD_RD;
-
close PARENT_ERR;
-
waitpid( $pid, 0 );
-
} else {
-
foreach $key ( keys %req_params ) {
-
$ENV{$key} = $req_params{$key};
-
}
-
-
# cd to the script's local directory
-
if ( $req_params{SCRIPT_FILENAME} =~ /^(.*)\/[^\/]+$/ ) {
-
chdir $1;
-
}
-
close(PARENT_WR);
-
-
#close(PARENT_ERR);
-
close(STDIN);
-
close(STDERR);
-
-
#fcntl(CHILD_RD, F_DUPFD, 0);
-
syscall( &SYS_dup2, fileno(CHILD_RD), 0 );
-
syscall( &SYS_dup2, fileno(CHILD_ERR), 2 );
-
-
#open(STDIN, "<&CHILD_RD");
-
exec( $req_params{SCRIPT_FILENAME} );
-
die("exec failed");
-
}
-
} else {
-
print("Content-type: text/plain\r\n\r\n");
-
print
-
"Error: No such CGI app – $req_params{SCRIPT_FILENAME} may not exist or is not executable by this process.\n";
-
}
-
}
-
}
再设置启动的脚本
vi startfcgiperl
-
export FCGI_SOCKET_PATH="/tmp/perl_fcgi.socket"
-
export FCGI_NPROCESSES=4
-
./fcgi_perl &
为Nginx添加FastCGI的Perl支持
编辑 nginx.conf 脚本,添加如下内容
location ~* .*\.pl$ { include awstats.conf; } location /awstatsicon/ { alias /var/www/awstats-6.8/wwwroot/icon/; }
vi awstats.conf
fastcgi_pass unix:/tmp/perl_fcgi.socket; fastcgi_index awstats.pl; #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #fastcgi_param SCRIPT_FILENAME /var/www/awstats-6.8/wwwroot/cgi-bin$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME /var/www/awstats-6.8/wwwroot/cgi-bin/awstats.pl; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_read_timeout 60;
配置Awstats
运行 /var/www/awstats-6.8/tools/awstats_configure.pl 设置好一些变量
mkdir -p /etc/awstats cp /var/www/awstats-6.8/wwwroot/awstats.model.conf /etc/awstats/awstats.my.site.com.conf
使用 vi /etc/awstats.my.site.com.conf 进行一些参数修改,设置icon目录,DirData数据存放目录,来源log日志文件路径等
使用 /var/www/awstats-6.8/tool/awstats_updateall.pl now -awstatsprog=/var/www/awstats-6.8/wwwroot/cgi-bin/awstats.pl 命令进行初始数据更新
使用 http://my.site.com/awstats.pl 查看数据
后续
将 ./awstats_updateall.pl now -awstatsprog=/var/www/awstats-6.8/wwwroot/cgi-bin/awstats.pl 放到crontab 中做定时更新,可以做一个脚本和日志文件的处理一起做。
碰到问题
在使用unix socket时,碰到两个问题
1.写socket的目录没有写权限,添加上解决
2.nginx连不上socket, 看日志提示没有权限,在创建了socket后添加一句
chmod 0777, $ENV{FCGI_SOCKET_PATH};
问题解决。
遗留对awstats.pl访问密码限制问题尚未解决好。
解决 在 nginx 中按如下配置方式
location /awstats { root /var/www/awstats-6.8/; include awstats.conf; auth_basic "awstats"; auth_basic_user_file /var/www/.passwd; }
其中 将 awstats-6.8 目录下的 wwwroot 修改为 awstats, /var/www/.passwd 为访问目录要用来验证的账号密码文件,用apache的提供的工具htpasswd制作而成
Popularity: 8% [?]
Related
安装配置Nginx 0.6.32 +php 5.2.6(fastcgi) + Mysql 5.0.51
安装过程参考: http://blog.s135.com/read.php/314.htm
安装 mysql 5.0.51
- 首先下载必须资源
-
wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.51b.tar.gz/from/ftp://ftp.iij.ad.jp/pub/db/mysql/
- 添加mysql 用户组和账号
-
/usr/sbin/groupadd mysql
-
/usr/sbin/useradd -d /var/lib/mysql -s /sbin/nologin -g mysql mysql
- 用源码包编译安装
-
tar zxvf mysql-5.0.51b.tar.gz
-
cd mysql-5.0.51b/
-
./configure –prefix=/usr/local/mysql5051 –without-debug –with-unix-socket-path=/usr/local/mysql5051/mysql.sock –with-client-ldflags=-all-static –with-mysqld-ldflags=-all-static –enable-assembler –with-extra-charsets=gbk,gb2312,utf8 –with-pthread –enable-thread-safe-client
-
make
-
make install
- 修改目录的权限
-
chmod +w /usr/local/mysql5051
-
chown -R mysql:mysql /usr/local/mysql5051
- 复制默认配置文件
-
cp support-files/my-medium.cnf /usr/local/mysql5051/my.cnf
-
cp support-files/mysql.server /etc/init.d/mysqld
-
chmod +x /etc/init.d/mysqld
-
cd ../
- 初始化mysql库
-
/usr/local/mysql5051/bin/mysql_install_db –defaults-file=/usr/local/mysql5051/my.cnf –basedir=/usr/local/mysql5051 –datadir=/usr/local/mysql5051/data –user=mysql –pid-file=/usr/local/mysql5051/mysql.pid –skip-locking –port=3306 –socket=/tmp/mysql.sock
- 开启MySQL数据库服务
-
/bin/sh /usr/local/mysql5051/bin/mysqld_safe –defaults-file=/usr/local/mysql5051/my.cnf &
-
chkconfig –add mysqld
-
chkconfig –level 3456 mysqld on
-
/sbin/service mysqld start
-
/sbin/service mysqld stop
- 验证MySQL服务器运行情况
mysql 5.0.51 源码包获取。
设定安装路径到 /usr/local/mysql5051
建立初始化的数据库表,数据库数据存放在 /usr/local/mysql5051/data目录下
直接的命令行方式开启
或通过服务控制方式开启关闭服务
1.ps -fe |grep mysql 查看运行的进程
2.netstat -na |grep mysql 查看开放的端口
3./usr/local/mysql5051/bin/mysql -u root -p 登陆mysql看一下,同时可以修改一下root密码。
安装 php 5.2.6
- 下载源码包
-
wget http://cn2.php.net/get/php-5.2.6.tar.gz/from/cn.php.net/mirror
-
wget "http://downloads.sourceforge.net/mcrypt/libmcrypt-2.5.8.tar.gz?modtime=1171868460&big_mirror=0"
- 安装依赖包
-
rpm -ivh libjpeg-devel-6b-33.i386.rpm
-
rpm -ivh libpng-devel-1.2.7-1.i386.rpm
-
rpm -ivh freetype-devel-2.1.9-1.i386.rpm
-
rpm -ivh gd-devel-2.0.28-4.i386.rpm
-
tar -xzvf libmcrypt-2.5.8.tar.gz
-
cd libmcrypt-2.5.8/
-
./configure
-
make
-
make install
-
/sbin/ldconfig
-
cd libltdl/
-
./configure –enable-ltdl-install
-
make
-
make install
-
cd ../../
- 编译安装源码包
-
tar -xzvf php-5.2.6.tar.gz
-
cd php-5.2.6
-
./configure –prefix=/usr/local/php526 –with-config-file-path=/usr/local/php526/etc –with-gd=/usr/ –enable-gd-native-ttf –with-ttf –with-freetype-dir –with-jpeg-dir=/usr/ –with-png-dir=/usr/ –with-zlib=/usr/ –with-mysql=/usr/local/mysql5051 –with-openssl=/usr/local/ssl –enable-mbstring –with-curl –with-curlwrappers –with-iconv-dir=/usr/local –with-libxml-dir –enable-xml –disable-debug –disable-rpath –enable-discard-path –enable-safe-mode –enable-bcmath –enable-shmop –enable-sysvsem –enable-inline-optimization –enable-mbregex –enable-fastcgi –enable-force-cgi-redirect –with-mcrypt
-
make
-
make install
-
cd ..
- 启动php的fast-cg进程
-
ulimit -SHn 51200
-
/usr/local/php526/spawn-fcgi -a 127.0.0.1 -p 10080 -C 30 -u www -f /usr/local/php526/bin/php-cgi
php 5.2.6
php 安装需要的一些配置包。
libmcrypt
先从RHEL安装盘上拷贝出如下一些rpm包用 rpm -ivh xxx.rpm 方式安装上。
在用源码方式安装下载下来的源码包
使用lighttpd带的 spwan-fcgi, 如下以www身份开启30个fast-cgi进程
安装 nginx
nginx的中文Wiki站点 http://wiki.codemongers.com/NginxChs
niginx的英文站点 http://nginx.net
- 下载需要的资源
-
wget http://sysoev.ru/nginx/nginx-0.6.32.tar.gz
-
wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.7.tar.gz
- 安装需要的库
-
tar -xzvf pcre-7.7.tar.gz
-
cd pcre-7.7/
-
./configure
-
make
-
make install
-
cd ../
- 从源码包编译安装Nginx
-
tar -xzvf nginx-0.6.32.tar.gz
-
cd nginx-0.6.32/
-
./configure –user=www –group=www –prefix=/usr/local/nginx632 –with-http_stub_status_module
-
make
-
make install
-
cd ../
- 建立WEB账号以及组
-
/usr/sbin/groupadd www -g 48
-
/usr/sbin/useradd -u 48 -g www www
- 建立相关网站目录
-
mkdir -p /var/www/xxt.igrow.cn
-
chmod +w /var/www/xxt.igrow.cn
-
chown -R www:www /var/www/xxt.igrow.cn
-
mkdir -p /var/www/logs
-
chmod +w /var/www/logs
-
chown -R www:www /var/www/logs
- 做Nginx参数配置
-
user www www;
-
-
worker_processes 8;
-
-
error_log /var/www/logs/nginx_error.log crit;
-
pid /usr/local/nginx632/nginx.pid;
-
-
worker_rlimit_nofile 51200;
-
-
events
-
{
-
use epoll;
-
worker_connections 51200;
-
}
-
-
http
-
{
-
include mime.types;
-
default_type application/octet-stream;
-
-
charset utf-8;
-
-
server_names_hash_bucket_size 128;
-
-
sendfile on;
-
tcp_nopush on;
-
-
keepalive_timeout 60;
-
tcp_nodelay on;
-
-
fastcgi_connect_timeout 60;
-
fastcgi_send_timeout 180;
-
fastcgi_read_timeout 180;
-
fastcgi_buffer_size 128k;
-
fastcgi_buffers 4 128k;
-
fastcgi_busy_buffers_size 128k;
-
fastcgi_temp_file_write_size 128k;
-
fastcgi_temp_path /dev/shm;
-
-
gzip on;
-
gzip_min_length 1k;
-
gzip_buffers 4 8k;
-
gzip_http_version 1.1;
-
gzip_types text/plain application/x-javascript text/css text/html application/xml;
-
-
server
-
{
-
listen 80;
-
server_name xxt.igrow.cn;
-
index index.html index.htm index.php;
-
root /var/www/xxt.igrow.cn;
-
-
if (-d $request_filename)
-
{
-
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;
-
}
-
-
location ~ .*\.php?$
-
{
-
include fcgi.conf;
-
fastcgi_pass 127.0.0.1:10080;
-
fastcgi_index index.php;
-
}
-
-
log_format access '$remote_addr – $remote_user [$time_local] "$request" '
-
'$status $body_bytes_sent "$http_referer" '
-
'"$http_user_agent" $http_x_forwarded_for';
-
access_log /var/www/logs/access.log access;
-
}
-
-
server
-
{
-
listen 80;
-
server_name status.xxt.igrow.cn;
-
-
location / {
-
stub_status on;
-
access_log off;
-
}
-
}
-
}
-
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
-
fastcgi_param SERVER_SOFTWARE nginx;
-
-
fastcgi_param QUERY_STRING $query_string;
-
fastcgi_param REQUEST_METHOD $request_method;
-
fastcgi_param CONTENT_TYPE $content_type;
-
fastcgi_param CONTENT_LENGTH $content_length;
-
-
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
-
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
-
fastcgi_param REQUEST_URI $request_uri;
-
fastcgi_param DOCUMENT_URI $document_uri;
-
fastcgi_param DOCUMENT_ROOT $document_root;
-
fastcgi_param SERVER_PROTOCOL $server_protocol;
-
-
fastcgi_param REMOTE_ADDR $remote_addr;
-
fastcgi_param REMOTE_PORT $remote_port;
-
fastcgi_param SERVER_ADDR $server_addr;
-
fastcgi_param SERVER_PORT $server_port;
-
fastcgi_param SERVER_NAME $server_name;
-
-
# PHP only, required if PHP was built with –enable-force-cgi-redirect
-
#fastcgi_param REDIRECT_STATUS 200;
- 启动Nginx
-
ulimit -SHn 51200
-
/usr/local/nginx632/sbin/nginx
-
the configuration file /usr/local/nginx632/conf/nginx.conf syntax is ok
-
the configuration file /usr/local/nginx632/conf/nginx.conf was tested successfully
获取nginx 0.6.32 源码包和所依赖的 pcre 源码包
设定安装目录到 /usr/local/nginx632
建立以 www:www 的账号和组用来运行网站服务。
存放网站的路径
日志路径
建nginx.conf文件
cat /usr/local/nginx632/conf/nginx.conf:
建fcgi.conf文件
cat /usr/local/nginx632/conf/fcgi.conf
在运行前可以通过 /usr/local/nginx632/sbin/nginx -t 检查一下看nginx的参数是否配置正确。
如果屏幕显示以下两行信息,说明配置文件正确:
配置开机启动Mysql+Phpcgi+Nginx
因为没有安装服务,需要添加一些命令到 /etc/rc.local 中用来开机启动
-
ulimit -SHn 51200
-
/bin/sh /usr/local/mysql5051/bin/mysqld_safe –defaults-file=/usr/local/mysql5051/my.cnf &
-
/usr/local/php526/spawn-fcgi -a 127.0.0.1 -p 10080 -C 30 -u www -f /usr/local/php526/bin/php-cgi
-
/usr/local/nginx632/sbin/nginx
设置iptables
在防火墙中放开相关服务端口。
-
#web port
-
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-
#fastcgi port
-
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 10080 -s 127.0.0.1 -j ACCEPT
-
#mysql 本地通过unix socket访问, 不用设置
-
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp -s 127.0.0.1 –dport 3306 -j ACCEPT
使用 /sbin/service iptables restart 重新应用防火墙规则
验证服务状态
验证 nginx + php 运行是否正常。
在 /var/www/xxt.igrow.cn 目录下建一个test.php,里面存放内容
-
<?
-
echo phpinfo();
-
?>
通过 curl http://127.0.0.1/test.php 可以看到输出的php信息,表示 nginx + php 运行正常。
Popularity: 4% [?]
Related
July 11, 2008 | Filed Under LAMP, MySQL, WebServer | 4 Comments
Nignx配合Memcached提升400%性能(阅读笔记)
原始文章: http://www.igvita.com/2008/02/11/nginx-and-memcached-a-400-boost/
原文引用了 http://nubyonrails.com/articles/about-this-blog-memcached
和 http://blog.leetsoft.com/2007/5/22/the-secret-to-memcached
都是讲述怎样在Rails中使用memcached的(主要是key的设定方式和怎样对memcached的使用做类的包装)
文章在两篇引用文章的基础上直接将memcached的使用提升到url层,通过nginx对memcached的原生支持,讲述了一种利用url rewrite机制来直接将url请求地址作为key给memcached做处理,用以提升访问速度。
首先在编译 nginx 时要添加 memcached 模块编译,nginx 的 memcached 模块配置参数说明见 http://wiki.codemongers.com/NginxHttpMemcachedModule
文章讲述利用 url rewrite 机制来做key validate 的自动化处理,主要讲了一下url rewrite和mime type的配合问题。
本文启发
1.网站url地址要好规划,这样可以将不同类别的资源做分组,方便以后的统一处理,添加缓冲之类的。
2.怎样确定内容的修改频度,自动话的处理?如果是动态的对数据敏感新强的页面。
3.有没有方法可以在url层做validate time 的规范话处理(资源的更新频度,每小时,每天等等)。
Popularity: 3% [?]