首页 › 月度存档 › 3月 2014

CentOS下搭建NGINX+SVN

因为没有什么可以定制的, 所以svn直接使用系统自带的包管理软件安装,
以centos系列为例, 命令如下:

然后是nginx的安装:

root 指定到/data/wwwroot

创建svn仓库:

修改配置文件:

启动svnserv

也可以使用–listen-port参数指定端口,启动多个仓库
导入项目,假如项目目录为svn://host/test ,创建svn仓库副本(nginx的读取目录)

设置svn更新后自动更新nginx的读取目录:

给脚本增加可执行权限

大功告成, 现在可以测试一下了,svn更新后nginx读取到的内容(访问http)也随之变化, 是不是比apache还有简单

nginx rewrite规则和参考

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址

一些可用的全局变量有,可以用做条件判断(待补全)

$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

结合QeePHP的例子

多目录转成参数

目录对换

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

目录自动加“/”

禁止htaccess

禁止多个目录

禁止以/data开头的文件
可以禁止/data/下多级目录下.log.txt等请求;

禁止单个目录
不能禁止.log.txt能请求

禁止单个文件

给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

设定某个文件的过期时间;这里为600秒,并不记录访问日志

文件反盗链并设置过期时间

只充许固定ip访问网站,并加上密码

将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html

将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/

上面例子有个问题是访问/shanghai 时将不会匹配

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。

那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

知道原因后就好办了,让我手动跳转吧

文件和目录不存在的时候重定向:

域名跳转

多域名转向

三级域名跳转

域名镜向

某个子目录作镜向

discuz ucenter home (uchome) rewrite

discuz 7 rewrite

给discuz某版块单独配置域名

discuz ucenter 头像 rewrite 优化

jspace rewrite

wordpress rewrite

VC++七种延时方式

方式一:VC中的WM_TIMER消息映射能进行简单的时间控制。首先调用函数SetTimer()设置定时间隔,如SetTimer(0,200,NULL)即为设置200ms的时间间隔。然后在应用程序中增加定时响应函数OnTimer(),并在该函数中添加响应的处理语句,用来完成到达定时时间的操作。这种定时方法非常简单,可以实现一定的定时功能,但其定时功能如同Sleep()函数的延时功能一样,精度非常低,最小计时精度仅为30ms,CPU占用低,且定时器消息在多任务操作系统中的优先级很低,不能得到及时响应,往往不能满足实时控制环境下的应用。只可以用来实现诸如位图的动态显示等对定时精度要求不高的情况。如示例工程中的Timer1。   

方式二:VC中使用sleep()函数实现延时,它的单位是ms,如延时2秒,用sleep(2000)。精度非常低,最小计时精度仅为30ms,用sleep函数的不利处在于延时期间不能处理其他的消息,如果时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。如示例工程中的Timer2。   

方式三:利用COleDateTime类和COleDateTimeSpan类结合WINDOWS的消息处理过程来实现秒级延时。如示例工程中的Timer3和Timer3_1。以下是实现2秒的延时代码:

 

方式四:在精度要求较高的情况下,VC中可以利用GetTickCount()函数,该函数的返回值是DWORD型,表示以ms为单位的计算机启动后经历的时间间隔。精度比WM_TIMER消息映射高,在较短的定时中其计时误差为15ms,在较长的定时中其计时误差较低,如果定时时间太长,就好象死机一样,CPU占用率非常高,只能用于要求不高的延时程序中。如示例工程中的Timer4和Timer4_1。下列代码可以实现50ms的精确定时:   

为使GetTickCount()函数在延时或定时期间能处理其他的消息,可以把代码改为:

  

虽然这样可以降低CPU的占有率,并在延时或定时期间也能处理其他的消息,但降低了延时或定时精度。   

方式五:与GetTickCount()函数类似的多媒体定时器函数DWORDtimeGetTime(void),该函数定时精度为ms级,返回从Windows启动开始经过的毫秒数。微软公司在其多媒体Windows中提供了精确定时器的底层API持,利用多媒体定时器可以很精确地读出系统的当前时间,并且能在非常精确的时间间隔内完成一个事件、函数或过程的调用。不同之处在于调用DWORDtimeGetTime(void)函数之前必须将Winmm.lib和Mmsystem.h添加到工程中,否则在编译时提示DWORDtimeGetTime(void)函数未定义。由于使用该函数是通过查询的方式进行定时控制的,所以,应该建立定时循环来进行定时事件的控制。如示例工程中的Timer5和Timer5_1。   

方式六:使用多媒体定时器timeSetEvent()函数,该函数定时精度为ms级。利用该函数可以实现周期性的函数调用。如示例工程中的Timer6和Timer6_1。函数的原型如下:

该函数设置一个定时回调事件,此事件可以是一个一次性事件或周期性事件。事件一旦被激活,便调用指定的回调函数,成功后返回事件的标识符代码,否则返回NULL。函数的参数说明如下:   
uDelay:以毫秒指定事件的周期。   
Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。
LpTimeProc:指向一个回调函数。   
DwUser:存放用户提供的回调数据。   
FuEvent:指定定时器事件类型:   
TIME_ONESHOT:uDelay毫秒后只产生一次事件   
TIME_PERIODIC:每隔uDelay毫秒周期性地产生事件。   

具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在LpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是,任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。   

方式七:对于精确度要求更高的定时操作,则应该使用QueryPerformanceFrequency()和QueryPerformanceCounter()函数。这两个函数是VC提供的仅供Windows95及其后续版本使用的精确时间函数,并要求计算机从硬件上支持精确定时器。如示例工程中的Timer7、Timer7_1、Timer7_2、Timer7_3。   
QueryPerformanceFrequency()函数和QueryPerformanceCounter()函数的原型如下:   
BOOLQueryPerformanceFrequency(LARGE_INTEGER*lpFrequency);    BOOLQueryPerformanceCounter(LARGE_INTEGER*lpCount);   
数据类型ARGE_INTEGER既可以是一个8字节长的整型数,也可以是两个4字节长的整型数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:

在进行定时之前,先调用QueryPerformanceFrequency()函数获得机器内部定时器的时钟频率,然后在需要严格定时的事件发生之前和发生之后分别调用QueryPerformanceCounter()函数,利用两次获得的计数之差及时钟频率,计算出事件经历的精确时间。
下列代码实现1ms的精确定时:   

其定时误差不超过1微秒,精度与CPU等机器配置有关。
下面的程序用来测试函数Sleep(100)的精确持续时间:

由于Sleep()函数自身的误差,上述程序每次执行的结果都会有微小误差。
下列代码实现1微秒的精确定时:

其定时误差一般不超过0.5微秒,精度与CPU等机器配置有关。

Linux服务器下配置exif功能

DZ程序中支持图片附件显示 EXIF
信息,但是我们的服务器一般都不支持此功能,现在就简单介绍一下如果在LINUX服务器上配置exif功能,最后提供一个exif压缩包的下载地址(如果你服务器上没有这个文件的话可以下载使用)

先找一下LINUX服务器上php的安装目录,例如为:/root/lnmp0.4-full/php-5.2.10/

则执行:

C++ 发送邮件(C++源码)

 

 

 

效果

001

这里是类的代码 CSendMail .h

CSendMail.cpp

测试代码

代码说明:
SMailer 是网上流传最广泛的一个C++发送邮件的类。但是我在测试的时候并没有发送成功。没有找出原因在哪里。
CSendMail 是在CSDN上找到的一个发送邮件的类。经测试可用。
我写了一个测试的工程
TestEMail

对virtualbox虚拟机进行网络配置,实现内网外网互通!桥接!

实验环境如下:
virtualbox上运行的虚拟机:windows 2008 en
实体机IP:192.168.18.99 内网段:192.168.18.X
实体机:Red Hat Enterprise Linux Server release 5 (Tikanga)

virtualbox主要有下面几种方式(不同版本称法不一样,但实质是一样的):
1、Intelnal Network:利用主机上的所有的虚拟机构建一个虚拟网络
2、NAT:能访问互联网,不能访问主机(或局域网)
3、Host Interface:能访问主机(或局域网),不能访问互联网

本教程运用NAT+interface的方法。
首先打开virtualbox>设置>网络,启用网络连接,并按如下配置。

001

这里点确定,并运行虚拟机,本机系统会自动创建一个名为vboxnet0的虚拟网卡

002

IP为:192.168.56.1
进入虚拟机系统(本人安装的是winvows 2008 en),将网卡的IP设置为vboxnet0的虚拟网卡同网段IP,ouyaoxiazai.com,网关为vboxnet0的IP,192.168.56.1

003

这里你会发现可以ping 192.168.56.1 但无法连接到局域网。
这时回到实体机,
系统>管理>网络,打开网络配置>设备,双击当前设备,设置路由如下:

004

然后保存退出,打开终端,重启下网卡:
/etc/rc.d/init.d/network restart
这时你就可以正常访问内网了,但无法访问互联网,就是不能上网。
接下来进行NAT,很简单,先关闭虚拟机系统。
和上面一样,设置,网络。
选择网络连接2,启用NAT,如图:

005

然后启动系统,你会发现多了一块网卡,自动获取IP如下:

006

现在应该可以正常上网了,并能访问内网了。。。。

007

Linux下socket异步通讯聊天程序

Linux下socket异步通讯聊天程序(转)

网络课的project 1能用到的资料,程序结构比较清晰,转来学习一下

什么是异步通讯?
就是通讯任意一方可以任意发送消息,有消息来到时会收到系统提示去接收消息。

这里要用到select函数。使用步骤如下:
1、设置一个集合变量,用来存放所有要判断的句柄(file descriptors:即我们建立的每个socket、用open打开的每个文件等)
2、把需要判断的句柄加入到集合里
3、设置判断时间
4、开始等待,即select
5、如果在设定的时间内有任何句柄状态变化了就马上返回,并把句柄设置到集合里

服务器端源代码如下:

客户端源代码如下:

linux与windows间socket通信实例

linux端:

window端:

C语言SOCKET网络编程 根据主机名和域名获取IP地址

在C语言SOCKET编程中,往往需要通过 主机名/域名 来求得IP地址。比例说,我们想连接上百度服务器,但是不可能人工先去查它的IP,然后在写进代码里。万一IP变了呢,那代码不是要重写?所以,这一章,主要介绍如何通过主机名/域名来求服务器IP地址。
首先认识一个表示主机信息的结构体:

h_addrtype 这是表示主机所使用的地址类型的定义,在C语言winsock2.h头文件中以“AF_”开头的宏定义就是它的值。如果使用的是IPV4,则值为”AF_INET”,如果是IPV6,值为“AF_INET4”。
h_length 地址的长度,一般都用IPV4中,所以都是32位/4字节。
h_addr_list 在一个主机名中,往往有很多对应的IP地址。当我们通过使用主机名查IP时,就会把返回的所有IP地址保存在主机地址表中。我们一般使用h_addr来取得第一个地址就行了。
在C语言的SOCKET网络编程中,我们使用gethostbyname()函数来获取主机信息,它的函数原型如下:

struct hostent* gethostbyname(const char* hostname );

hostname是个包含主机名/域名的字符串,函数通过给定的主机名,返回一个包含主机名称和主机地址信息的指针结构体。
如果我们想要返回百度服务器的主机信息,则:


char baidu_hostname[]="www.baidu.com"
struct hostent* baidu_hostent;
baidu_hostent = gethostbyname( baidu_hostname );

取得IP地址后,使用下面方法把IP地址打印到标准输出上:

struct in_addr baidu_addr;
baidu_addr.s_addr = *(unsigned long * ) baidu_hostent->h_addr;
printf("baidu_IPV4 : %s " , inet_ntoa( baidu_addr ) );

in_addr 是一个用来表示32位IPV4网络地址的结构体,s_addr是个使用unsigned long数据格式来表示一个IPV4 地址的结构成员。
inet_ntoa() 将指定的网络地址转换成 以点隔字符串表示的IPV4地址,例如“192.168.1.101”就是个点隔字符串网络地址。


//函数原型
char* inet_ntoa( struct in_addr);

通过以上方法,以后就可以直接使用主机名/域名来获取IPV4地址,而再不用人工去查找。
下面是关于本期讲解内容的总结的源代码:

#include
#include
//通过改变以下宏定义来修改要解析的主机名
#define HOSTNAME "www.dingguofeng.com"

 

int main( int argc , char* argv[])
{
int ret;
struct hostent *host;
struct in_addr addr;
//启动socket服务
WSADATA wsaData;
ret = WSAStartup( 0x101 , &wsaData);
//如果启动成功 ,返回值为0
if( ret != 0 )
{
printf("WSAStartup error:%d " , WSAGetLastError() );
return 1;
}
//获取主机信息
host = gethostbyname( HOSTNAME );
if( host == NULL )
{
printf("gethostbyname error:%d" , WSAGetLastError() );
return 1;
}
addr.s_addr = *(unsigned long * )host->h_addr;
printf("主机名 :%sn" , host->h_name);
printf("主机地址: %sn " , inet_ntoa( addr ) );
WSACleanup();
return 0;
}

一个简单的UDP服务端和客户端程序

写来一个UDP发送和接受数据包的程序.

客户端代码:

client_main.c:
/*
* @file client_main.c
* @brief client of the UDP.
* @author xiaou
*/

#include // for sockaddr_in
#include // for socket
#include // for socket
#include // for close()
#include
#include
#include

int main(int argc, char *argv[])
{
if(argc < 2) { printf("One argument at least!\n"); return -1; } int res = 0; int sock_fd = socket(PF_INET, SOCK_DGRAM, 0); if(sock_fd < 0) { printf("error: Create Socket Failed!"); return -1; } struct sockaddr_in sock_addr; sock_addr.sin_family = AF_INET; sock_addr.sin_port = htons(4321); sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); memset(sock_addr.sin_zero, 0x00, 8); try { const char * tos = argv[1]; int toslen = strlen(tos) + 1; struct sockaddr_in to = sock_addr; uint32_t tolen = sizeof(struct sockaddr); printf("\nSending for data...\n"); if((toslen = sendto(sock_fd, tos, toslen, 0, (struct sockaddr *)&to, tolen)) == -1) { printf("error: Sending Failed!"); res = -1; throw res; } else { char s[256]; strncpy(s, tos, toslen); printf("Sended data:\n[%s]\n\n", s); } } catch(...) { printf("error catched~"); } close(sock_fd); return res; }

服务端代码:

server_main.c:

/*
* @file server_main.c
* @brief server of the UDP.
* @author xiaou
*/

#include // for sockaddr_in
#include // for socket
#include // for socket
#include // for close()
#include
#include
#include

int main(int argc, char *argv[])
{
int res = 0;
int sock_fd = socket(PF_INET, SOCK_DGRAM, 0);
if(sock_fd < 0) { printf("error: Create Socket Failed!"); return -1; } struct sockaddr_in sock_addr; sock_addr.sin_family = AF_INET; sock_addr.sin_port = htons(4321); sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); memset(sock_addr.sin_zero, 0x00, 8); try { if(bind(sock_fd, (struct sockaddr *)&sock_addr, sizeof(struct sockaddr)) != 0) { printf("error: Bind Socket Failed!"); res = -1; throw res; } char recvs[256]; int recvslen; struct sockaddr_in from; uint32_t fromlen; while(1) { printf("\nWaiting for data...\n"); fromlen = sizeof(struct sockaddr); if((recvslen = recvfrom(sock_fd, recvs, 256, 0, (struct sockaddr *)&from , &fromlen)) == -1) { printf("error: Receiving Failed!"); res = -1; throw res; } else { if(recvslen < 256) *(recvs+recvslen) = '\0'; else *(recvs+255) = '\0'; printf("Received data:\n[%s]\n",recvs); } } } catch(...) { printf("error catched~"); } close(sock_fd); return res; }

Makefile代码:

Makefile:

CC=g++
CFLAGS=-Wall

OutPath4UDPClient=$(HOME)/bin/test4UDPClient
OutPath4UDPServer=$(HOME)/bin/test4UDPServer

all:
$(CC) $(CFLAGS) -o $(OutPath4UDPClient) client_main.c
$(CC) $(CFLAGS) -o $(OutPath4UDPServer) server_main.c

clean:
rm -rf $(OutPath4UDPClient)
rm -rf $(OutPath4UDPServer)