LNAMP|LAMP|PHP团队(多人)开发环境搭建配置教程

    经常听到团队的小伙伴说:这个版本的扩展真难找,在本地运行正常的代码,上线之后却运行异常…诸如此类的问题大多是因为系统差异、扩展缺失、版本差异引起的。要解决此类问题搭建一个和线上一致的多人开发环境即可解决。
    思路:搭建一台本地开发服务器,开发服务器和线上服务器环境保持一致,用samba服务映射到本地电脑磁盘,团队中所有人的开发代码都存储在开发机上,所有人的代码都是在开发机器上运行;团队成员无需再单独搭建开发环境,只需要挂载远程目录到本地磁盘,加上DNS解析,开发机上apache根据域名绑定对应的目录即可。
搭建过程:
1.一台PC主机,U盘安装CentOS5.11;
2.安装lamp或lnamp或lnmp环境,网上有很多关于LNAMP或LAMP组合安装的教程(我写过的另一篇博文,有需要的请移步->:LAMP安装手记(CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug),安装过程不再赘述,本文主要讲如何配置多人开发环境。
3.配置步骤
修改防火墙规则
vi /etc/sysconfig/iptables
添加如下规则
#samba
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
service iptables restart
4.安装samba
yum install samba system-config-samba samba-client samba-common
编辑samba配置文件
vi /etc/samba/smb.conf
[homes]
        comment = Home Directories
        browseable = no
        writable = yes
        create mode = 0755
        force create mode = 0755
        directory mode = 0755
        force directory mode = 0755
;       valid users = %S
;       valid users = MYDOMAIN\%S
[share]
        workgroup = www
        netbios name = www
        path = /home/share
        browseable = yes
        writeable = yes

service smb restart
[home]目录是每个samba账号对应的个人目录,就是/home下的个人目录,这里也就是每个账号对应的挂载目录;
[share]是共享目录。

简单介绍一下这几个参数的含义:

  • create mode – 这个配置定义新创建文件的属性。Samba在新建文件时,会把dos文件的权限映射成对应的unix权限,在映射后所得的权限,会与这个参数所定义的值进行与操作。然后再和下面的force create mode进行或操作,这样就得到最终linux下的文件权限。
  • force create mode – 见上面的描述。相当于此参数所设置的权限位一定会出现在文件属性中。
  • directory mode – 这个配置与create mode参数类似,只是它是应用在新创建的目录上。Samba在新建目录时,会把dos–>linux映射后的文件属性,与此参数所定义的值相与,再和force directory mode相或,然后按这个值去设置目录属性。
  • force directory mode – 见上面的描述。相当于此参数中所设置的权限位一定会出现在目录的属性中。

说明一点,上面的create mode和create mask参数是同义词,用哪个都可以;而directory mode和directory mask参数是相同的。

创建账号:
useradd zhangsan   
passwd zhangsan
chmod -R 0755 /home/zhangsan
smbpasswd -a zhangsan                         创建samba账号
service smb reload

测试samba 快捷键 windows(开始键)+R 在弹出的框中输入 \\samba服务器地址  然后回车 输入账号密码 如下图所示即为搭建配置成功

映射磁盘驱动器:

映射成功。

5.配置apache

编辑apache配置文件httpd.conf 添加
vi httpd.conf
Include /usr/local/apache/conf/vhost/*.conf
在/usr/local/apache/conf/vhost目录中添加配置文件
vi test.data.house.sina.com.cn.conf 
添加如下内容
<VirtualHost *:88>
        ServerName test.house.sina.com.cn
        #ServerAlias localhost
        DocumentRoot /home/yangyi/test.house.sina.com.cn
        DirectoryIndex index.php index.html index.htm
        <Directory /home/yangyi/test.house.sina.com.cn>
                Options +Includes -Indexes
                AllowOverride All
                Order Deny,Allow
                Allow from All
                php_admin_value open_basedir /home/yangyi/test.house.sina.com.cn:/tmp:/proc
        </Directory>
</VirtualHost>
重启apache
service httpd restart
本地添加DNS解析
192.168.1.110 test.house.sina.com.cn

在映射目录创建文件夹 添加测试文件 如下所示:

test_web_service

搭建配置成功!

参考:

快速配置 Samba 将 Linux 目录映射为 Windows 驱动器,用于跨平台编程

CentOS6.3 Samba安装配置、多用户、加域

Centos搭建Samba

设置Samba服务器中新建文件/目录的权限

附可能遇到的问题及解决办法:

<1>.httpd: Could not reliably determine the server’s fully qualified domain name

    http://blog.csdn.net/aidenliu/article/details/6589040

<2>.防火墙配置

    http://bbs.51cto.com/thread-830123-1.html

<3>.PHP 配置文件中open_basedir选项作用

    http://www.jb51.net/article/19231.htm

<4>.phpnow:open_basedir restriction in effect;file is not within the allowed path

    http://blog.sina.com.cn/s/blog_6328fd3a0100rh5y.html

<5>.PHP 错误日志报告等级

    http://www.cnblogs.com/lost-1987/articles/2982380.html

<6>.PHP Fatal error: require_once(): Failed opening required 

    https://bbs.archlinux.org/viewtopic.php?id=57877 (参考这个解决了问题)

    http://superuser.com/questions/590208/phpmyadmin-symlinks-error-after-ubuntu-upgrade

    http://kb.odin.com/en/6065

未经授权请勿转载:怡然之乐 – FineYi

修改tomcat中JVM非堆内存默认配置解决内存溢出

 

系统CentOS6.4下yum安装了tomcat6和jdk1.6,安装配置过程如下:
tomcat中部署两个项目A、B,同时部署时报内存溢出错误,系统CPU负载飙升,而单独部署A、B 和 只部署多个A或者只部署多个B项目系统运行正常。
查看日志报错:OutOfMemoryError: PermGen space….   
查询资料得知:是非堆溢出(永久保存区域溢出)
这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。
解决办法:修改JVM非堆内存默认大小
网上提供的方法是:
修改tomcat是bin目录下的catalina.sh文件中的配置,但是yum安装的tomcat此文件的内容为空,将配置项 JAVA_OPTS=” -XX:PermSize=512M -XX:MaxPermSize=1024m” 加进 catalina.sh文件,重启tomcat,无效。
搜索JAVA_OPTS字符串找到tomcat的配置文件位置
find  /etc  |xargs grep “JAVA_OPTS”
[root@AY14070314494954704eZ tomcat6]# find /etc |xargs grep "JAVA_OPTS" 
/etc/tomcat6/tomcat6.conf:#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3" 
/etc/tomcat6/tomcat6.conf:# Use JAVA_OPTS to set java.library.path for libtcnative.so 
/etc/tomcat6/tomcat6.conf:#JAVA_OPTS="-Djava.library.path=/usr/lib" 
/etc/tomcat6/tomcat6.conf:JAVA_OPTS="${JAVA_OPTS} -Djavax.sql.DataSource.Factory=org.apache.commons.dbcp.BasicDataSourceFactory"
在/etc/tomcat6/tomcat6.conf文件中加入
JAVA_OPTS=" -XX:PermSize=512M -XX:MaxPermSize=1024m"
重启tomcat 项目运行正常。
PS:具体设置大小可以根据物理内存和项目实际运行需求进行调整。
yum安装tomcat的默认路径:/usr/share/tomcat6/
其它相关路径如下:(供参考)
clipboard

…………………………………………………………………………………………..

Tomcat中JAVA JVM内存溢出及合理配置

Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚拟机。Tomcat的内存溢出本质就是JVM内存溢出,所以在本文开始时,应该先对Java JVM有关内存方面的知识进行详细介绍。

一、Java JVM内存介绍

JVM管理两种类型的内存,堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中,它和堆不同,运行期内GC不会释放其空间。

(1). 堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指 定,默认是物理内存的1/4。默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、 -Xmx相等以避免在每次GC 后调整堆的大小。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行堆内存设置,一般的要将-Xms和-Xmx选项设置为相同,而-Xmn为1/4的-Xmx值,建议堆的最大值设置为可用内存的最大值的80%。

初始化堆的大小是JVM在启动时向系统申请的内存的大小。一般而言,这个参数不重要。但是有的应用程序在大负载的情况下会急剧地占用更多的内存,此时这个参数就是显得非常重要,如果JVM启动时设置使用的内存比较小而在这种情况下有许多对象进行初始化,JVM就必须重复地增加内存来满足使用。由于这种原因,我们一般把-Xms和-Xmx设为一样大,而堆的最大值受限于系统使用的物理内存。一般使用数据量较大的应用程序会使用持久对象,内存使用有可能迅速地增长。当应用程序需要的内存超出堆的最大值时JVM就会提示内存溢出,并且导致应用服务崩溃。所以,如果Xms超过了Xmx值,或者堆最大值和非堆最大值的总和超过了物理内存或者操作系统的最大限制都会引起服务器启动不起来。

(2). 非堆内存分配
也叫永久保存的区域,用于存放Class和Meta信息,Class在被Load的时候被放入该区域。它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理。JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。 GC不会对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

(3). JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存(废话!,呵呵),假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB(一般来说Windows系统下为1.5G-2G,Linux系统 下为2G-3G),而64bit以上的处理器就不会有限制了。

二、三种内存溢出异常介绍

1. OutOfMemoryError: Java heap space  堆溢出

内存溢出主要存在问题就是出现在这个情况中。当在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

 2. OutOfMemoryError: PermGen space   非堆溢出(永久保存区域溢出)

这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。如果web app用了大量的第三方jar或者应用有太多的class文件而恰好MaxPermSize设置较小,超出了也会导致这块内存的占用过多造成溢出,或者tomcat热部署时侯不会清理前面加载的环境,只会将context更改为新部署的,非堆存的内容就会越来越多。

3. OutOfMemoryError: unable to create new native thread.   无法创建新的线程

这种现象比较少见,也比较奇怪,主要是和jvm与系统内存的比例有关。这种怪事是因为JVM已经被系统分配了大量的内存(比如1.5G),并且它至少要占用可用内存的一半。

三、Java JVM内存配置

1. JVM内存分配设置的参数有四个

-Xmx    Java Heap最大值,默认值为物理内存的1/4;

-Xms    Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;

-Xmn    Java Heap Young区大小,不熟悉最好保留默认值;

-Xss      每个线程的Stack大小,不熟悉最好保留默认值;

-XX:PermSize:设定内存的永久保存区域;

-XX:MaxPermSize:设定最大内存的永久保存区域;

-XX:PermSize:设定内存的永久保存区域;

-XX:NewSize:设置JVM堆的‘新生代’的默认大小;

-XX:MaxNewSize:设置JVM堆的‘新生代’的最大大小;

2. 如何设置JVM的内存分配

(1)当在命令提示符下启动并使用JVM时(只对当前运行的类Test生效):

java -Xmx128m -Xms64m -Xmn32m -Xss16m Test

(2)当在集成开发环境下(如eclipse)启动并使用JVM时:

a. 在eclipse根目录下打开eclipse.ini,默认内容为(这里设置的是运行当前开发工具的JVM内存分配):  -vmargs -Xms40m -Xmx256m -vmargs表示以下为虚拟机设置参数,可修改其中的参数值,也可添加-Xmn,-Xss,另外,eclipse.ini内还可以设置非   堆内存,如:-XX:PermSize=56m,-XX:MaxPermSize=128m。

b. 打开eclipse-窗口-首选项-Java-已安装的JRE(对在当前开发环境中运行的java程序皆生效)  编辑当前使用的JRE,在缺省VM参数中输入:-Xmx128m -Xms64m -Xmn32m –Xss16m。

c. 打开eclipse-运行-运行-Java应用程序(只对所设置的java类生效)  选定需设置内存分配的类-自变量,在VM自变量中输入:-Xmx128m -Xms64m -Xmn32m -Xss16m  注:如果在同一开发环境中同时进行了b和c设置,则b设置生效,c设置无效,如:  开发环境的设置为:-Xmx256m,而类Test的设置为:-Xmx128m -Xms64m,则运行Test时生效的设置为:  -Xmx256m -Xms64m。

(3)当在服务器环境下(如Tomcat)启动并使用JVM时(对当前服务器环境下所以Java程序生效):

a. 设置环境变量:  变量名:CATALINA_OPTS  变量值:-Xmx128m -Xms64m -Xmn32m -Xss16m。

b. 打开Tomcat根目录下的bin文件夹,编辑catalina.bat,将其中的%CATALINA_OPTS%(共有四处)替换为:-Xmx128m -Xms64m -Xmn32m -Xss16m。

c. 若没有catalina.bat,只有tomcat.exe,tomcat6w.exe;则可以在启动tomcat6w.exe 后 右键配置–Java–java option 下面输入:

-Xmx256m –Xms64m

也可以找到注册表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\TomcatService Manager\Tomcat6\Parameters\JavaOptions原值为 -Dcatalina.home=”C:\ApacheGroup\Tomcat 6.0″ -Djava.endorsed.dirs=”C:\ApacheGroup\Tomcat 6.0\common\endorsed” -Xrs 加入  -Xms300m  -Xmx350m  (我的是加入-Xmx350m,tomcat才能启动,加入-Xms300m  -Xmx350m反而tomcat都不能启动)重起tomcat服务,设置生效。

3. 查看JVM内存信息

Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx 

Runtime.getRuntime().freeMemory(); //当前JVM空闲内存 

Runtime.getRuntime().totalMemory(); //当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和 

关于maxMemory(),freeMemory()和totalMemory():maxMemory()为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设置不能高于计算机物理内存;  totalMemory()为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;  freeMemory()为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而JVM实际可用内存并不等于freeMemory(),而应该等于maxMemory()-totalMemory()+freeMemory()。

4. 实例,以下给出1G内存环境下java jvm 的参数设置参考

JAVA_OPTS=”-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true “

大型的web工程,用tomcat默认分配的内存空间无法启动,如果不是在myeclipse中启动tomcat可以对tomcat这样设置:

TOMCAT_HOME\bin\catalina.bat 中添加这样一句话:

set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m

如果要在myeclipse中启动,上述的修改就不起作用了,可如下设置:

Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK面板中的

Optional Java VM arguments中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m

对于单独的.class,可以用下面的方法对Test运行时的jvm内存进行设置。 java -Xms64m -Xmx256m Test -Xms是设置内存初始化的大小 -Xmx是设置最大能够使用内存的大小。

四、JVM内存配置与GC

需要考虑的是Java提供的垃圾回收机制。JVM的堆大小决定了JVM花费在收集垃圾上的时间和频度。收集垃圾可以接受的速度与应用有关,应该通过分析实际的垃圾收集的时间和频率来调整。如果堆的大小很大,那么完全垃圾收集就会很慢,但是频度会降低。如果你把堆的大小和内存的需要一致,完全收集就很快,但是会更加频繁。调整堆大小的的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。在基准测试的时候,为保证最好的性能,要把堆的大小设大,保证垃圾收集不在整个基准测试的过程中出现。如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过 3-5 秒。如果垃圾收集成为瓶颈,那么需要指定堆的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,你应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。

Java Heap分为3个区:

1.Young 2.Old 3.Permanent。Young保存刚实例化的对象。当该区被填满时,GC会将对象移到Old区。Permanent区则负责保存反射对象,本文不讨论该区。

JVM有2个GC线程:
第一个线程负责回收Heap的Young区;
第二个线程在Heap不足时,遍历Heap,将Young 区升级为Older区,Older区的大小等于-Xmx减去-Xmn,不能将-Xms的值设的过大,因为第二个线程被迫运行会降低JVM的性能。

为什么一些程序频繁发生GC?有如下原因:
1. 程序内调用了System.gc()或Runtime.gc()。
2. 一些中间件软件调用自己的GC方法,此时需要设置参数禁止这些GC。
3. Java的Heap太小,一般默认的Heap值都很小。
4. 频繁实例化对象,Release对象 此时尽量保存并重用对象,例如使用StringBuffer()和String()。

如果你发现每次GC后,Heap的剩余空间会是总空间的50%,这表示你的Heap处于健康状态许多Server端的Java程序每次GC后最好能有65%的剩余空间。

经验之谈:
1.Server端JVM最好将-Xms和-Xmx设为相同值。为了优化GC,最好让-Xmn值约等于-Xmx的1/3。
2.一个GUI程序最好是每10到20秒间运行一次GC,每次在半秒之内完成。

注意:
1.增加Heap的大小虽然会降低GC的频率,但也增加了每次GC的时间。并且GC运行时,所有的用户线程将暂停,也就是GC期间,Java应用程序不做任何工作。
2.Heap大小并不决定进程的内存使用量。进程的内存使用量要大于-Xmx定义的值,因为Java为其他任务分配内存,例如每个线程的Stack等。

参考:
http://blog.csdn.net/ye1992/article/details/9344807
http://www.cnblogs.com/edwardlauxh/archive/2010/04/25/1918602.html
http://www.lirongzhen.cn/?p=1194
http://www.dgdxs.com/it/jishu/450.html

转载请注明出处:怡然之乐 – FineYi

Linux|CentOS+Nginx+Apache+MySQL+PHP+Tomcat的配置教程,完美支持PHP、JAVA

网上有很多关于LNAMP或LAMP组合安装的教程(我写过的另一篇博文,有需要的请移步->:LAMP安装手记(CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug),安装过程不再赘述,本文主要讲如何在LNAMP环境下安装JDK+Tomcat6使同一台服务器同时支持PHP和JAVA语言。
服务器系统和各软件版本如下所示:
[root@E ~]# uname -a 
Linux E.CentOS6.4 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux 
[root@E ~]# /www/wdlinux/nginx/sbin/nginx -v 
nginx version: nginx/1.2.9 
[root@E ~]# /www/wdlinux/httpd-2.2.24/bin/httpd -v 
Server version: Apache/2.2.24 (Unix) 
Server built: Oct 30 2014 00:17:07 
[root@E ~]# rpm -qa |grep mysql 
mysql-libs-5.1.66-2.el6_3.x86_64 
[root@E ~]# /www/wdlinux/php/bin/php -v 
Cannot load Zend Extension Manager - it was built with configuration 1.2.0, whereas running engine is API220090626,NTS 
PHP 5.3.27 (cli) (built: Oct 30 2014 00:30:02) 
Copyright (c) 1997-2013 The PHP Group 
Zend Engine v2.3.0, Copyright (c) 1998-2013 Zend Technologies
1
开始安装jdk:
列出yum库可用的jdk安装包
[root@E ~]# yum -y list java* 
Loaded plugins: fastestmirror 
Loading mirror speeds from cached hostfile 
* base: mirror.bit.edu.cn 
* extras: mirror.bit.edu.cn 
* rpmforge: mirrors.neusoft.edu.cn 
* updates: mirrors.neusoft.edu.cn 
base | 3.7 kB 00:00 
extras | 3.3 kB 00:00 
rpmforge | 1.9 kB 00:00 
updates | 3.4 kB 00:00 
updates/primary_db | 171 kB 00:00 
Available Packages 
java-1.5.0-gcj.x86_64 1.5.0.0-29.1.el6 base 
java-1.5.0-gcj-devel.x86_64 1.5.0.0-29.1.el6 base 
java-1.5.0-gcj-javadoc.x86_64 1.5.0.0-29.1.el6 base 
java-1.5.0-gcj-src.x86_64 1.5.0.0-29.1.el6 base 
java-1.6.0-openjdk.x86_64 1:1.6.0.33-1.13.5.0.el6_6 updates 
java-1.6.0-openjdk-demo.x86_64 1:1.6.0.33-1.13.5.0.el6_6 updates 
java-1.6.0-openjdk-devel.x86_64 1:1.6.0.33-1.13.5.0.el6_6 updates 
java-1.6.0-openjdk-javadoc.x86_64 1:1.6.0.33-1.13.5.0.el6_6 updates 
java-1.6.0-openjdk-src.x86_64 1:1.6.0.33-1.13.5.0.el6_6 updates 
java-1.7.0-openjdk.x86_64 1:1.7.0.71-2.5.3.1.el6 updates 
java-1.7.0-openjdk-demo.x86_64 1:1.7.0.71-2.5.3.1.el6 updates 
java-1.7.0-openjdk-devel.x86_64 1:1.7.0.71-2.5.3.1.el6 updates 
java-1.7.0-openjdk-javadoc.noarch 1:1.7.0.71-2.5.3.1.el6 updates 
java-1.7.0-openjdk-src.x86_64 1:1.7.0.71-2.5.3.1.el6 updates 
java-1.8.0-openjdk.x86_64 1.8.0.25-1.b17.el6 updates 
java-1.8.0-openjdk-demo.x86_64 1.8.0.25-1.b17.el6 updates 
java-1.8.0-openjdk-devel.x86_64 1.8.0.25-1.b17.el6 updates 
java-1.8.0-openjdk-headless.x86_64 1.8.0.25-1.b17.el6 updates 
java-1.8.0-openjdk-javadoc.noarch 1.8.0.25-1.b17.el6 updates 
java-1.8.0-openjdk-src.x86_64 1.8.0.25-1.b17.el6 updates 
java_cup.x86_64 1:0.10k-5.el6 base 
java_cup-javadoc.x86_64 1:0.10k-5.el6 base 
java_cup-manual.x86_64 1:0.10k-5.el6 base 
javacc.x86_64 4.1-0.5.el6 base 
javacc-demo.x86_64 4.1-0.5.el6 base 
javacc-manual.x86_64 4.1-0.5.el6 base 
javassist.noarch 3.9.0-6.el6 base 
javassist-javadoc.noarch 3.9.0-6.el6 base
2
选择jdk1.6安装
[root@E ~]# yum -y install java-1.6.0-openjdk*
其它版本请自己修改对应的版本号安装
检测是否安装成功
[root@E ~]# java -version 
java version "1.6.0_33" 
OpenJDK Runtime Environment (IcedTea6 1.13.5) (rhel-1.13.5.0.el6_6-x86_64) 
OpenJDK 64-Bit Server VM (build 23.25-b01, mixed mode)
3
安装tomcat6
[root@E ~]# yum install tomcat6 tomcat6-webapps tomcat6-admin-webapps
安装成功 启动
[root@E ~]# service tomcat6 start
其它命令:service tomcat6 {start|stop|restart|condrestart|try-restart|reload|force-reload|status|version}
启动成功,访问测试:http://ip:8080
如下图所示即为安装成功:
5
 
配置nginx和tomcat,使其不加端口号,直接通过域名也能访问
首先增加解析,使域名指向到主机IP,本地可以直接改host实现
6
解析正常
不加8080端口访问
7
添加8080端口访问
8
接下来修改nginx和tomcat的配置使其不加端口号也能访问到tomcat的webservice
[root@E ~]# cd /www/wdlinux/nginx/conf/vhost/
[root@E ~]# vi myweb.com.conf
添加如下内容
server { 
listen 80;
server_name www.myweb.com myweb.com;
#root /www/web/master_myweb_com/public_html;
index index.html index.jsp index.htm;
error_page 400 /errpage/400.html;
error_page 403 /errpage/403.html;
error_page 404 /errpage/404.html;
error_page 405 /errpage/405.html;
location ~ \.jsp$ {
proxy_pass http://127.0.0.1:8080;
include naproxy.conf;
}
location / {
try_files $uri @tomcat;
}
location @tomcat {
proxy_pass http://127.0.0.1:8080;
include naproxy.conf;
    }
    access_log /www/web_logs/myweb_com_access.log wwwlogs;
    error_log /www/web_logs/myweb_com_error.log;
}
重新加载nginx配置文件或重启nginx
[root@E vhost]# service nginxd reload 
nginx: the configuration file /www/wdlinux/nginx/conf/nginx.conf syntax is ok 
nginx: configuration file /www/wdlinux/nginx/conf/nginx.conf test is successful
不加端口号访问测试:
9
至此nginx已经成功将来自myweb.com域名的请求代理到8080端口
如果需要配置多域名的话,还需要修改tomcat虚拟主机配置文件
默认配置文件路径:/etc/tomcat6/
默认项目路径:/var/lib/tomcat6/webapps/
tomcat默认指向/var/lib/tomcat6/webapps/ROOT目录
创建新项目目录,这里直接复制ROOT项目,进行修改
[root@E webapps]# pwd 
/var/lib/tomcat6/webapps
[root@E webapps]# chown -R root myweb.com
修改权限,使新项目权限和默认项目权限一致
[root@E webapps]# chgrp -R tomcat myweb.com
[root@E webapps]# ll 
总用量 24 
drwxrwxr-x 5 root tomcat 4096 10月 30 22:06 examples 
drwxrwxr-x 5 root tomcat 4096 10月 30 22:06 host-manager 
drwxrwxr-x 5 root tomcat 4096 10月 30 22:06 manager 
drwxr-xr-x 3 root tomcat 4096 10月 30 22:48 myweb.com 
drwxrwxr-x 3 root tomcat 4096 10月 30 22:06 ROOT 
drwxrwxr-x 5 root tomcat 4096 10月 30 22:06 sample
[root@E myweb.com]# cd myweb.com/
[root@E myweb.com]# rm -f index.html
[root@E myweb.com]# vi index.jsp
写入:WebService is Tomcat
不要忘记删除ROOT项目或者对它重命,否则新项目不生效
[root@E webapps]# mv ROOT/ ROOT.BAK


修改tomcat虚拟主机配置
[root@E myweb.com]# vi /etc/tomcat6/server.xml
在最下面<Host></Host>标签后面添加如下内容
<!--myweb.com host config--> 
<Host name="www.myweb.com" appBase="webapps" 
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/" reloadable="true" docBase="myweb.com"/>
<Alias>myweb.com</Alias>
<!-- SingleSignOn valve, share authentication between web applications
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-->
<!-- Access log processes all example.
Documentation at: /docs/config/valve.html -->
<!--
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
-->
</Host>
如下图所示
10
重启tomcat,测试http://myweb.com
[root@E myweb.com]# service tomcat6 restart
11
success!
转载请注明出处:怡然之乐 – FineYi

CentOS6.4 Linux 解决 Device eth0 does not seem to be present

用虚拟机vmware克隆CentOS系统,启动后网络出现问题,重启网络后报错
Device eth0 does not seem to be present,delaying initialization
e1
解决办法如下:
vi /etc/udev/rules.d/70-persistent-net.rules
找到eth1对应的 ATTR{address} 记下 对应的串,如下图所示:
e2
修改网卡配置:
vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改
DEVICE=eth1
HWADDR=00:0C:29:4E:2D:93
如下图所示:
e3
重启网络
service network restart
e4
正常

转载请注明出处:怡然之乐 – FineYi

centos6.4下 Bugzilla的安装配置

Bugzilla是Mozilla公司提供的一款开源的免费Bug(错误或是缺陷)追踪系统,用来帮助你管理软件开发,建立完善的BUG跟踪体系。
安装环境:
OS:CentOS6.4 64bit
apache + mysql 加载perl模块
安装依赖包
yum install perl
yum&nbsp;install&nbsp;perl-CPAN
下载软件包:
wget http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-4.4.6.tar.gz
tar -zxvf bugzilla-4.4.6.tar.gz
cd bugzilla-4.4.6
检测:
./checksetup.pl --check-modules
很多没有安装的模块都列了出来,指南上说可以用下面的命令安装缺少的模块:
perl install-module.pl&nbsp;<modulename>
但是运行上条命令是给出了更加简便的方式: 安装所有环境依赖包
./install-module.pl --all
安装需要一段时间:
创建数据库,供bugzilla项目存储数据。
安装完成后 修改配置文件
vi localconfig 
clipboard-3

ps:数据库账号必须具有操作索引的权限,否则下一步安装过程会报错

然后执行安装:

 ./checksetup.pl

安装过程中需要输入管理员账号<邮箱>、真实姓名、密码

安装完成

配置虚拟主机:

vi /etc/httpd/conf.d/httpd-vhosts.conf

增加如下内容:

#bug.test.com 
<Directory /home/www/web/bugzilla> 
AddHandler cgi-. .cgi
Options +Indexes +ExecCGI
DirectoryIndex index.cgi index.html
AllowOverride Limit
AddHandler cgi-script .cgi
Options Indexes FollowSymLinks
AllowOverride FileInfo Options All
Order allow,deny
Allow from all
</Directory> 
<VirtualHost *:80> 
ServerAdmin admin@admin
DocumentRoot "/home/www/web/bugzilla"
ServerName bug.test.com
ErrorLog "/home/www/web/log/bug.test.com-error.log"
CustomLog "/home/www/web/log/bug.test.com-access.log" common
</VirtualHost>

clipboard-1

重启Apache

service httpd restart

增加解析:略

访问 bug.test.com

clipboard

安装过程中的报错
Software error:
The ./data/params file does not exist. You probably need to run checksetup.pl. at Bugzilla/Config.pm line 314.
Compilation failed in require at /home/www/web/bugzilla/index.cgi line 19.
BEGIN failed–compilation aborted at /home/www/web/bugzilla/index.cgi line 19.
For help, please send mail to the webmaster (admin@admin), giving this error message and the time and date of the error.
原因:配置文件未修改,安装失败。
转载请注明出处:怡然之乐 – FineYi

 

Apache日志格式配置及查看方法

  Apache 日志格式配置及查看方法

  有时候我们需要根据需求去定制Apache默认日志的格式和内容,比如增加或减少日志所记录的信息、改变默认日志文件的格式等。本文介绍可以用日志记录的所有信息,以及如何设置Apache使其记录这些信息。

  一、定义日志格式

  很久以前,日志文件只有一种格式,这就是“公共格式”,许多人已经习惯于使用这种格式。随后出现了定制日志格式,而且看起来定制日志格式更很受欢迎,即使公共日志格式本身也重新用定制日志格式定义。本文介绍的就是如何随心所欲地定制日志文件的格式、如何让日志文件记录自己想要的信息。

  定制日志文件的格式涉及到两个指令,即LogFormat指令和CustomLog指令,默认httpd.conf文件提供了关于这两个指令的几个示例。

  LogFormat指令定义格式并为格式指定一个名字,以后我们就可以直接引用这个名字。CustomLog指令设置日志文件,并指明日志文件所用的格式(通常通过格式的名字)。

  LogFormat指令的功能是定义日志格式并为它指定一个名字。例如,在默认的httpd.conf文件中,我们可以找到下面这行代码:

  LogFormat “%h %l %u %t \”%r\” %>s %b” common该指令创建了一种名为“common”的日志格式,日志的格式在双引号包围的内容中指定。格式字符串中的每一个变量代表着一项特定的信息,这些信息按照格式串规定的次序写入到日志文件。

  Apache文档已经给出了所有可用于格式串的变量及其含义,下面是其译文:

  %…a: 远程IP地址

  %…A: 本地IP地址

  %…B: 已发送的字节数,不包含HTTP头

  %…b: CLF格式的已发送字节数量,不包含HTTP头。例如当没有发送数据时,写入‘-’而不是0。

  %…{FOOBAR}e: 环境变量FOOBAR的内容

  %…f: 文件名字

  %…h: 远程主机

  %…H 请求的协议

  %…{Foobar}i: Foobar的内容,发送给服务器的请求的标头行。

  %…l: 远程登录名字(来自identd,如提供的话)%…m 请求的方法

  %…{Foobar}n: 来自另外一个模块的注解“Foobar”的内容%…{Foobar}o: Foobar的内容,应答的标头行%…p: 服务器响应请求时使用的端口

  %…P: 响应请求的子进程ID。

  %…q 查询字符串(如果存在查询字符串,则包含“?”后面的部分;否则,它是一个空字符串。)%…r: 请求的第一行

  %…s: 状态。对于进行内部重定向的请求,这是指*原来*请求 的状态。如果用%…>s,则是指后来的请求。

  %…t: 以公共日志时间格式表示的时间(或称为标准英文格式)%…{format}t: 以指定格式format表示的时间%…T: 为响应请求而耗费的时间,以秒计

  %…u: 远程用户(来自auth;如果返回状态(%s)是401则可能是伪造的)%…U: 用户所请求的URL路径

  %…v: 响应请求的服务器的ServerName

  %…V: 依照UseCanonicalName设置得到的服务器名字在所有上面列出的变量中,“…”表示一个可选的条件。如果没有指定条件,则变量的值将以“-”取代。分析前面来自默认httpd.conf文件的 LogFormat指令示例,可以看出它创建了一种名为“common”的日志格式,其中包括:远程主机,远程登录名字,远程用户,请求时间,请求的第一行代码,请求状态,以及发送的字节数。

  有时候我们只想在日志中记录某些特定的、已定义的信息,这时就要用到“…”。如果在“%”和变量之间放入了一个或者多个HTTP状态代码,则只有当请 求返回的状态代码属于指定的状态代码之一时,变量所代表的内容才会被记录。例如,如果我们想要记录的是网站的所有无效链接,那么可以使用:

  LogFormat %404{Referer}i BrokenLinks

  反之,如果我们想要记录那些状态代码不等于指定值的请求,只需加入一个“!”符号即可:

  Apache日志:访问日志(一)

  想要知道什么人在什么时候浏览了网站的哪些内容吗?查看Apache的访问日志就可以知道。访问日志是Apache的标准日志,本文详细解释了访问日志的内容以及相关选项的配置。

  一、访问日志的格式

  Apache内建了记录服务器活动的功能,这就是它的日志功能。这个《Apache日志》系列文章介绍的就是Apache的访问日志、错误日志,以及如何分析日志数据,如何定制Apache日志,如何从日志数据生成统计报表等内容。

  如果Apache的安装方式是默认安装,服务器一运行就会有两个日志文件生成。这两个文件是access_log(在Windows上是 access.log)和error_log(在Windows上是error.log)。采用默认安装方式时,这些文件可以在/usr/local /apache/logs下找到;对于Windows系统,这些日志文件将保存在Apache安装目录的logs子目录。不同的包管理器会把日志文件放到 各种不同的位置,所以你可能需要找找其他的地方,或者通过配置文件查看这些日志文件配置到了什么地方。

  正如其名字所示,访问日志access_log记录了所有对Web服务器的访问活动。下面是访问日志中一个典型的记录:

  216.35.116.91 – – [19/Aug/2000:14:47:37 -0400] “GET / HTTP/1.0” 200 654这行内容由7项构成,上面的例子中有两项空白,但整行内容仍旧分成了7项。

  第一项信息是远程主机的地址,即它表明访问网站的究竟是谁。在上面的例子中,访问网站的主机是216.35.116.91。随便说一句,这个地址属于一台 名为si3001.inktomi.com的机器(要找出这个信息,可以使用nslookup工具查找DNS),inktomi.com是一家制作Web 搜索软件的公司。可以看出,仅仅从日志记录的第一项出发,我们就可以得到有关访问者的不少信息。

  默认情况下,第一项信息只是远程主机的IP地址,但我们可以要求Apache查出所有的主机名字,并在日志文件中用主机名字来替代IP地址。然而,这种做 法通常不值得推荐,因为它将极大地影响服务器记录日志的速度,从而也就减低了整个网站的效率。另外,有许多工具能够将日志文件中的IP地址转换成主机名 字,因此要求Apache记录主机名字替代IP地址是得不偿失的。

  然而,如果确实有必要让Apache找出远程主机的名字,那么我们可以使用如下指令:

  HostNameLookups on

  如果HostNameLookups设置成double而不是on,日志记录程序将对它找到的主机名字进行反向查找,验证该主机名字确实指向了原来出现的IP地址。默认情况下HostNameLookups设置为off。

  上例日志记录中的第二项是空白,用一个“-”占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不只是浏览者的登录名字, 而是浏览者的email地址或者其他唯一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,那时Netscape 0.9还占据着统治地位,这个位置往往记录着浏览者的email地址。然而,由于有人用它来收集邮件地址和发送垃圾邮件,所以它未能保留多久,很久之前市 场上几乎所有的浏览器就取消了这项功能。因此,到了今天,我们在日志记录的第二项看到email地址的机会已经微乎其微了。

  日志记录的第三项也是空白。这个位置用于记录浏览者进行身份验证时提供的名字。当然,如果网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。但是,对于大多数网站来说,日志文件的大多数记录中这一项仍旧是空白的。

  日志记录的第四项是请求的时间。这个信息用方括号包围,而且采用所谓的“公共日志格式”或“标准英文格式”。因此,上例日志记录表示请求的时间是2000 年8月19日星期三14:47:37。时间信息最后的“-0400”表示服务器所处时区位于UTC之前的4小时。

  日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉我们服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。

  在上例中,METHOD是GET,其他经常可能出现的METHOD还有POST和HEAD。此外还有不少可能出现的合法METHOD,但主要就是这三种。

  RESOURCE是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是“/”,即网站的主页或根。大多数情况下,“/”指向DocumentRoot目录的index.html文档,但根据服务器配置的不同它也可能指向其他文件。

  PROTOCOL通常是HTTP,后面再加上版本号。版本号或者是1.0,或者是1.1,但出现1.0的时候比较多。我们知道,HTTP协议是Web得以 工作的基础,HTTP/1.0是HTTP协议的早期版本,而1.1是最近的版本。当前大多数Web客户程序仍使用1.0版本的HTTP协议。

  日志记录的第六项信息是状态代码。它告诉我们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请 求,一切正常。此处不准备给出状态代码的完整清单以及解释它们的含义,请参考相关资料了解这方面的信息。但一般地说,以2开头的状态代码表示成功,以3开 头的状态代码表示由于各种不同的原因用户请求被重定向到了其他位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个 错误。

  日志记录的第七项表示发送给客户端的总字节数。它告诉我们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据。

  二、配置访问日志

  访问日志文件的位置实际上是一个配置选项。如果我们检查httpd.conf配置文件,可以看到该文件中有如下这行内容:

  CustomLog /usr/local/apache/logs/access_log common注意,对于版本较早的Apache服务器,这行内容可能略有不同。它使用的可能不是CustomLog指令,而是TransferLog指令。如果你的服务器属于这类情况,建议你尽可能地早日升级服务器。

  CustomLog指令指定了保存日志文件的具体位置以及日志的格式。至于如何定制日志文件的格式以及内容,我们将在这个《Apache日志》系列文章的 后面几篇讨论。上面这行指令指定的是common日志格式,自从有了Web服务器开始,common格式就是它的标准格式。由此我们也可以理解,虽然几乎 不再有任何客户程序向服务器提供用户的标识信息,但访问日志却还保留着第二项内容。

  CustomLog指令中的路径是日志文件的路径。注意,由于日志文件是由HTTP用户打开的(用User指令指定),因此必须注意这个路径要有安全保证,防止该文件被随意改写。

 转载请注明出处:怡然之乐 – FineYi

CentOS6.4下coreseek 4.1(sphinx)安装配置手记 完美支持MySQL数据源

CentOS6.4下coreseek 4.1(sphinx)安装配置手记 完美支持MySQL数据源
系统环境:
OS:                 CentOS6.4 64位
MySQL:          5.1.63
coreseek:        4.1
安装、配置过程如下:
#当前路径
[root@E sphinx]# pwd
/home/sphinx
#安装依赖包
[root@E sphinx]# yum install make gcc g++ gcc-c++ libtool autoconf automake imake mysql-devel libxml2-devel expat-devel
#下载coreseek4.1
[root@E sphinx]# wget http://www.coreseek.cn/uploads/csft/4.0/coreseek-4.1-beta.tar.gz
#解压缩
[root@E sphinx]# tar zxvf coreseek-4.1-beta.tar.gz
#安装mmseg
[root@E sphinx]# cd coreseek-4.1-beta/mmseg-3.2.14/
[root@E mmseg-3.2.14]# ./bootstrap #输出的warning信息可以忽略,如果出现error则需要解决
[root@E mmseg-3.2.14]# ./configure --prefix=/usr/local/mmseg3
[root@E mmseg-3.2.14]# make && make install
[root@E mmseg-3.2.14]# cd ..

##安装coreseek
[root@E coreseek-4.1-beta]# cd csft-4.1/
[root@E csft-4.1]# sh buildconf.sh #输出的warning信息可以忽略,如果出现error则需要解决
[root@E csft-4.1]# ./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql

[root@E csft-4.1]# make && make install
[root@E csft-4.1]# cd ..

#测试mmseg分词,coreseek搜索(需要预先设置好字符集为zh_CN.UTF-8,确保正确显示中文)
[root@E coreseek-4.1-beta]# cd testpack/
[root@E testpack]# cat var/test/test.xml #此时应该正确显示中文
#mmseg程序 -d 词库目录 指定数据源
[root@E testpack]# /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml
#创建索引
[root@E testpack]# /usr/local/coreseek/bin/indexer -c etc/csft.conf --all
#执行搜索测试
[root@E testpack]# /usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索
#测试成功
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
 using config file 'etc/csft.conf'...
index 'xml': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec
displaying matches:
1. document=1, weight=1590, published=Thu Apr 1 22:20:07 2010, author_id=1
words:
1. '网络': 1 documents, 1 hits
2. '搜索': 2 documents, 5 hits
#为了使sphinx直接支持mysql数据源 需要对coreseek重新编译安装
#重新编译安装后的coreseek可以支持mysql和xml数据源
[root@E testpack]# cd ..
[root@E coreseek-4.1-beta]# pwd
/home/sphinx/coreseek-4.1-beta
[root@E coreseek-4.1-beta]# cd csft-4.1/$ make clean
[root@E coreseek-4.1-beta]#./configure --prefix=/usr/local/coreseek --without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
###配置、测试mysql数据源###
导入测试数据 sql点击下载
#安装mysql依赖包
yum install mysql mysql-server php-mysql -y
#修改配置配置文件
[root@E testpack]# cd ../testpack/
[root@E testpack]# vi etc/csft_mysql.conf
#只需要修改 源定义 中的数据库的相关配置(数据库地址、用户名、密码、库名) 其它配置不需修改 如下所示:
#源定义
source mysql
{
    type = mysql
    sql_host = localhost #数据库主机地址
    sql_user = root #数据库用户名
    sql_pass = 111111 #数据库密码
    sql_db = sphinx #数据库库名
    sql_port = 3306
    sql_query_pre = SET NAMES utf8
    sql_query = SELECT id, group_id, UNIX_TIMESTAMP(date_added) AS date_added, title, content FROM documents
                                                              #sql_query第一列id需为整数
                                                              #title、content作为字符串/文本字段,被全文索引
    sql_attr_uint = group_id #从SQL读取到的值必须为整数
    sql_attr_timestamp = date_added #从SQL读取到的值必须为整数,作为时间属性
    sql_query_info_pre = SET NAMES utf8 #命令行查询时,设置正确的
字符集
    sql_query_info = SELECT * FROM documents WHERE id=$id #命令行查询时,从数据库读取原始数据信息
}

 

#创建mysql数据源索引
[root@E testpack]# pwd
/home/sphinx/coreseek-4.1-beta/testpack
#索引器 -c 配置文件 --all
[root@E testpack]# /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
 using config file 'etc/csft_mysql.conf'...
indexing index 'mysql'...
ERROR: index 'mysql': sql_connect: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (DSN=mysql://root:***@localhost:3306/sphinx).
total 0 docs, 0 bytes
total 0.000 sec, 0 bytes/sec, 0.00 docs/sec
total 0 reads, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
total 0 writes, 0.000 sec, 0.0 kb/call avg, 0.0 msec/call avg
#上面有报错 创建索引失败
#找到mysql.sock的路径(可以去mysql的配置文件/etc/my.cnf中查看 本机在/tmp/mysql.sock)
#建立软连接
[root@E testpack]# mkdir /var/lib/mysql
[root@E testpack]# ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock
#创建mysql数据源索引成功
[root@E testpack]# /usr/local/coreseek/bin/indexer -c etc/csft_mysql.conf --all
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
 using config file 'etc/csft_mysql.conf'...
indexing index 'mysql'...
collected 3 docs, 0.0 MB
sorted 0.0 Mhits, 100.0% done
total 3 docs, 7545 bytes
total 0.016 sec, 467269 bytes/sec, 185.79 docs/sec
total 3 reads, 0.000 sec, 2.8 kb/call avg, 0.0 msec/call avg
total 9 writes, 0.000 sec, 2.2 kb/call avg, 0.0 msec/call avg

#测试mysql数据源 搜索
[root@E testpack]# /usr/local/coreseek/bin/search -c etc/csft_mysql.conf 网络搜索
Coreseek Fulltext 4.1 [ Sphinx 2.0.2-dev (r2922)]
Copyright (c) 2007-2011,
Beijing Choice Software Technologies Inc (http://www.coreseek.com)
 using config file 'etc/csft_mysql.conf'...
index 'mysql': query '网络搜索 ': returned 1 matches of 1 total in 0.000 sec
displaying matches:
1. document=1, weight=1590, group_id=2, date_added=Thu Apr 1 22:20:07 2010
        id=1
        title=愚人节最佳蛊惑爆料 谷歌300亿美元收购百度
        content=据国外媒体报道,谷歌将巨资收购百度,......<正文省略很多字>......李彦宏也承认当前百度在日本还处于初级发展阶段,但他也预言“2012年,百度与Google划洋而治”,对此我们拭目以待!
        date_added=2010-04-01 22:20:07
        author_id=1
        group_id=2
words:
1. '网络': 1 documents, 1 hits
2. '搜索': 2 documents, 5 hits
coreseek词库扩展请参考:sphinx(coreseek)导入搜狗词库
稍后完善 实时索引的创建及维护

转载请注明出处:怡然之乐 – FineYi

参考资料:coreseek and coreseek 

LAMP安装手记(CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug)

LAMP安装手记(CentOS6.4+Apache-2.2.22+Mysql-5.1.63+PHP-5.2.17+phpmyadmin-3.4.10.2+ZendDebug)

rpm -e httpd

rpm -e mysql

rpm -e php

yum -y remove httpd php mysql-server mysql php-mysql&nbsp;

setenforce 0

yum -y install gcc gcc-c++&nbsp; make automake autoconf kernel-devel ncurses-devel libxml2-devel openssl-devel curl-devel libjpeg-devel libpng-devel&nbsp; pcre-devel libtool-libs freetype-devel gd zlib-devel file bison patch mlocate flex diffutils&nbsp; &nbsp;readline-devel glibc-devel glib2-devel bzip2-devel gettext-devel libcap-devel libmcrypt-devel wget&nbsp;unzip&nbsp;

wget -c http://archive.apache.org/dist/httpd/httpd-2.2.22.tar.gz

wget -c&nbsp;http://dl.mysql.cn/mysql5/5.1/mysql-5.1.63.tar.gz

wget -c http://iweb.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/3.4.10.2/phpMyAdmin-3.4.10.2-all-languages.tar.gz

wget -c http://us2.php.net/get/php-5.2.17.tar.gz/from/am.php.net/mirror

tar xzf httpd-2.2.22.tar.gz

tar xzf mysql-5.1.63.tar.gz

tar xzf php-5.2.17.tar.gz

tar xzf phpMyAdmin-3.4.10.2-all-languages.tar.gz

cd /tmp/httpd-2.2.22

./configure --prefix=/usr/local/apache --with-included-apr --enable-so --enable-deflate=shared --enable-expires=shared&nbsp; --enable-headers=shared --enable-rewrite=shared --enable-static-support

make

make install

cp build/rpm/httpd.init /etc/init.d/httpd //使用init脚本管理httpd

chmod 755 /etc/init.d/httpd //增加执行权限

chkconfig --add httpd&nbsp; //添加httpd到服务项

chkconfig&nbsp; httpd on&nbsp; &nbsp;//设置开机启动

ln -fs /usr/local/apache/ /etc/httpd

ln -fs /usr/local/apache/bin/httpd /usr/sbin/httpd

ln -fs /usr/local/apache/bin/apachectl /usr/sbin/apachectl

ln -fs /usr/local/apache/logs /var/log/httpd //设置软链接以适应init脚本

groupadd mysql

useradd -g mysql mysql

cd /tmp/mysql-5.1.63

./configure --prefix=/usr/local/mysql/ --localstatedir=/usr/local/mysql/data --without-debug --with-unix-socket-path=/tmp/mysql.sock --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assembler --with-extra-charsets=gbk,gb2312,utf8 --with-pthread

make

make install

cp support-files/my-medium.cnf /etc/my.cnf //复制配置文件夹my.cnf

/usr/local/mysql/bin/mysql_install_db --user=mysql&nbsp; //初始化数据库

chown -R root.mysql /usr/local/mysql

chown -R mysql /usr/local/mysql/data&nbsp;

cp /tmp/mysql-5.1.63/support-files/mysql.server /etc/rc.d/init.d/mysqld&nbsp; //init启动脚本

chown root.root /etc/rc.d/init.d/mysqld&nbsp;

chmod 755 /etc/rc.d/init.d/mysqld

chkconfig --add mysqld

chkconfig&nbsp; mysqld on

ln -s /usr/local/mysql/bin/mysql /usr/bin

ln -s /usr/local/mysql/bin/mysqladmin /usr/bin

service mysqld start

/usr/local/mysql/bin/mysqladmin -u root password '新密码'&nbsp; &nbsp;//设置root密码

安装PHP

cd /tmp

wget http://superb-dca2.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz

wget http://superb-dca2.dl.sourceforge.net/project/mhash/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz

wget http://superb-sea2.dl.sourceforge.net/project/mcrypt/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz

tar xzf libmcrypt-2.5.8.tar.gz

tar xzf mhash-0.9.9.9.tar.gz

tar xzf mcrypt-2.6.8.tar.gz

//安装libmcrypt

cd /tmp/libmcrypt-2.5.8

./configure --prefix=/usr

make && make install

//安装libmcrypt

cd /tmp/mhash-0.9.9.9

./configure --prefix=/usr

make && make install

//安装mcrypt

/sbin/ldconfig //搜索出可共享的动态链接库

cd /tmp/mcrypt-2.6.8

./configure

make && make install

解决可能出现的报错:

If configure fails try --with-jpeg-dir=<DIR>

configure: error: libpng.(a|so) not found.

解决:

yum install libpng libpng-devel

ln -s /usr/lib64/libjpeg.so /usr/lib/

ln -s /usr/lib64/libpng.so /usr/lib/

解决可能出现的libiconv报错

cd /tmp

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

tar xzf libiconv-1.14.tar.gz

cd libiconv-1.14

./configure --prefix=/usr/local/libiconv

make && make install

cd /tmp/php-5.2.17

./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-openssl --with-zlib --enable-bcmath --with-bz2 --with-curl --enable-ftp --with-gd --enable-gd-native-ttf --with-gettext --with-mhash --enable-mbstring --with-mcrypt --enable-soap --enable-zip --with-iconv=/usr/local/libiconv --with-mysql=/usr/local/mysql --without-pear

make

make install

cp php.ini-dist /usr/local/php/etc/php.ini //复制配置文件php.ini

修改apache配置文件:

在/etc/httpd/conf/httpd.conf文件中加入php文件类型解析:

vi /etc/httpd/conf/httpd.conf

添加

AddType application/x-httpd-php .php .phtml .inc

AddType application/x-httpd-php-source .phps

找到:

ServerName www.example.com:80

修改为:

ServerName localhost:80

service httpd restart &nbsp;//重启httpd

安装ZendOptimizer-3.3.9

64位:http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz

32位:http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

cd /tmp

wget&nbsp; http://downloads.zend.com/optimizer/3.3.9/ZendOptimizer-3.3.9-linux-glibc23-x86_64.tar.gz

tar xzf ZendOptimizer-3.3.9-linux-glibc23-i386.tar.gz

cd /tmp/ZendOptimizer-3.3.9-linux-glibc23-i386/data/5_2_x_comp/

mkdir -p /usr/local/Zend/lib/

cp ZendOptimizer.so /usr/local/Zend/lib

加载zendoptimizer,建立/etc/php.d/zend.ini文件,加入如下代码加载:

[zend]

zend_optimizer.optimization_level=15

zend_extension=/usr/local/Zend/lib/ZendOptimizer.so

service httpd restart

安装eAccelerator-0.9.6.1

cd /tmp

wget http://jaist.dl.sourceforge.net/project/eaccelerator/eaccelerator/eAccelerator%200.9.6.1/eaccelerator-0.9.6.1.zip

unzip eaccelerator-0.9.6.1.zip

cd eaccelerator-0.9.6.1

export PHP_PREFIX="/usr/local/php"

$PHP_PREFIX/bin/phpize

./configure -enable-eaccelerator=shared -with-php-config=$PHP_PREFIX/bin/php-config

make && make install

cd /tmp

mkdir eaccelerator

chmod 0777 eaccelerator

php zenddebugger 加载失败

用php -v 查看信息

[root@E modules]# php -v

Failed loading /usr/lib64/php/modules/ZendDebugger.so: libssl.so.0.9.8: cannot open shared object file: No such file or directory

Failed loading /usr/local/Zend/lib/ZendOptimizer.so: /usr/local/Zend/lib/ZendOptimizer.so: undefined symbol: zend_throw_exception_internal

Failed loading /usr/lib64/php/modules/ZendDebugger.so: libssl.so.0.9.8: cannot open shared object file: No such file or directory

Warning: Directive 'register_long_arrays' is deprecated in PHP 5.3 and greater in Unknown on line 0

Warning: Directive 'magic_quotes_gpc' is deprecated in PHP 5.3 and greater in Unknown on line 0

PHP 5.3.3 (cli) (built: Nov 22 2013 10:59:29)

Copyright (c) 1997-2010 The PHP Group

Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

原因:因为最新的linux发行版本&nbsp;libssl&nbsp;和&nbsp;libcrypto&nbsp;已升级到1.0.0

解决:只要创建相应的软链接即可

[root@E modules]# ll /usr/lib64/libssl*

-rwxr-xr-x. 1 root root 221568 2鏈? 23 2013 /usr/lib64/libssl3.so

lrwxrwxrwx. 1 root root 16 11鏈?26 19:31 /usr/lib64/libssl.so -> libssl.so.1.0.1e

lrwxrwxrwx. 1 root root 16 11鏈?26 19:31 /usr/lib64/libssl.so.10 -> libssl.so.1.0.1e

-rwxr-xr-x. 1 root root 436984 12鏈? 4 2013 /usr/lib64/libssl.so.1.0.1e

建立软连接:

ln -s /usr/lib64/libssl.so.1.0.1e /usr/lib64/libssl.so.0.9.8

[root@E modules]# ll /usr/lib64/libcrypto*

lrwxrwxrwx. 1 root root 19 11鏈?26 19:31 /usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e

lrwxrwxrwx. 1 root root 19 11鏈?26 19:31 /usr/lib64/libcrypto.so.10 -> libcrypto.so.1.0.1e

-rwxr-xr-x. 1 root root 1946880 12鏈? 4 2013 /usr/lib64/libcrypto.so.1.0.1e

建立软连接:

ln -s /usr/lib64/libcrypto.so.1.0.1e /usr/lib64/libcrypto.so.0.9.8

参考资料:

linux下让apache能够解析php: http://hi.baidu.com/dengyun0302/item/549840396caa7ffae6bb7a61

解决configure: error: libpng.(a|so) not found.:http://blog.csdn.net/alexdream/article/details/7408438

解决php zenddebugger 安装失败:http://blog.csdn.net/dragon8299/article/details/7175932

http://forums.zend.com/viewtopic.php?f=59&t=12423

http://blog.csdn.net/jianfyun/article/details/6434052

http://stackoverflow.com/questions/13467358/zend-debugger-will-not-load

http://forums.zend.com/viewtopic.php?f=57&t=4071

http://sourceforge.net/projects/eaccelerator/postdownload?source=dlp

mysql:http://download.softagency.net/MySQL/Downloads/MySQL-5.1/

mysql-5.1.63(gz)http://download.mysql.cn/src/2012/0531/5603.html

apache/httpd:http://archive.apache.org/dist/httpd/

http://www.zend.com/en/products/studio/downloads

转载请注明出处:怡然之乐 – FineYi

CentOS6.4 PHP5.2添加ZendDebug扩展 完美支持Zend Studio10.5

之前一段时间用的开发环境是wamp,这个集成包的优点是:安装简单,操作便捷,缺点是:每次重装系统后都要重新安装配置环境,并且和线上的lamp环境不一致,有时本地运行正常的代码上到线上却出现莫名其妙的问题,所以考虑重新为本地安装lamp开发环境,即:windows8+VMware Workstation 10 +CentOs6.4 64位 + lamp + Zend Studio10.5

安装完成后发现无法为PHP添加ZendDebug扩展,查看资料才知道zend官方在PHP5.2之后就不再对ZendDebug提供更新支持,所以如果要用Zend Studio + ZendDebug调试代码的话PHP的版本必须在5.3以下(当然也可以用Zend Studio+Xdebug 组合),无奈只有编译PHP5.2.*老版本安装lamp。

ZendDebug下载:linux64位 linux32位 Zend官方下载

ZendDebug配置过程如下:

[root@E /]#yum -y install php-devel

选择对应版本的ZendDebug.so文件放至:/usr/lib64/php/modules/目录下

(因为本机安装的为PHP5.2.1.7,所以选择ZendDebugger-20110410-linux-glibc23-x86_64/ZendDebugger-20110410-linux-glibc23-x86_64/5_2_x_comp/ZendDebugger.so)

在php.ini中最下方添加配置:

[root@E /]#vi /etc/php.ini
[Zend]
zend_extension=/usr/lib64/php/modules/ZendDebugger.so  //扩展文件绝对路径
zend_debugger.allow_hosts=127.0.0.1/32,192.168.0.0/16   //设置你允许访问的主机IP范围
zend_debugger.expose_remotely=always

保存

[root@E /]#service httpd restart   //重启apache

用phpinfo查看,未发现ZendDebugger扩展,说明加载失败。

用php -v查看,有报错:

[root@E /]# php -v
Failed loading /usr/lib64/php/modules/ZendDebugger.so: libssl.so.0.9.8: cannot open shared object file: No such file or directory
PHP 5.3.3 (cli) (built: Nov 22 2013 10:59:29)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
原因:因为最新的linux发行版本 libssl 和 libcrypto 已升级到1.0.0,而系统中找不到 libssl.so.0.9.8文件

解决:只要创建相应的软链接即可

[root@E /]# ll /usr/lib64/libssl*
-rwxr-xr-x. 1 root root 221568 2 nov  23 2013 /usr/lib64/libssl3.so
lrwxrwxrwx. 1 root root 16 11 nov 26 19:31 /usr/lib64/libssl.so -> libssl.so.1.0.1e
lrwxrwxrwx. 1 root root 16 11 nov 26 19:31 /usr/lib64/libssl.so.10 -> libssl.so.1.0.1e
-rwxr-xr-x. 1 root root 436984 12 nov  4 2013 /usr/lib64/libssl.so.1.0.1e
建立软连接:
[root@E /]#ln -s /usr/lib64/libssl.so.1.0.1e /usr/lib64/libssl.so.0.9.8

[root@E /]# ll /usr/lib64/libcrypto*
lrwxrwxrwx. 1 root root 19 11 nov 26 19:31 /usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e
lrwxrwxrwx. 1 root root 19 11 nov 26 19:31 /usr/lib64/libcrypto.so.10 -> libcrypto.so.1.0.1e
-rwxr-xr-x. 1 root root 1946880 12 nov  4 2013 /usr/lib64/libcrypto.so.1.0.1e
建立软连接:
[root@E /]#ln -s /usr/lib64/libcrypto.so.1.0.1e /usr/lib64/libcrypto.so.0.9.8
[root@E /]#service httpd restart   //重启apache
[root@E /]# php -v
Zend Debugger requires Zend Engine API version 220060519.
The Zend Engine API version 220090626 which is installed, is newer.
Contact Zend Technologies at http://www.zend.com/ for a later version of Zend Debugger.

PHP 5.3.3 (cli) (built: Jul 12 2013 20:35:47)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

报错解决

用phpinfo查看ZendDebug扩展加载成功!

Zend Studio10.5测试,调试正常!

转载请注明出处:怡然之乐 – FineYi

参考资料:stackoverflow  forums.zend.com CSDN

linux下用C语言连接mysql实现增删改查

公司内部培训,领导要求在linux环境下用c语言连接mysql数据库,实现增删改查功能,做一个demo。

环境:Red Hat Enterprise Linux 4

①安装mysql

②创建数据库表:bbb

CREATE TABLE `bbb` (
`id` int(11) NOT NULL auto_increment,
`name2` varchar(20) default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8

C的代码:

#include 
#include 
#include 
#include  
/*定义数据库连接需要的宏*/
#define HOST "localhost"
#define USERNAME "root"
#define PASSWORD "ictspace"
#define DATABASE "test"

/*执行传入的sql語句*/
void exe_sql(char* sql) {
	MYSQL my_connection; /*这是一个数据库连接*/
	int res; /*执行sql語句后的返回标志*/
	/*初始化mysql连接my_connection*/
	mysql_init(&my_connection);
	if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD,DATABASE, 0, NULL, 0)) {
		/*连接成功*/
		printf("数据库执行exe_sql连接成功!n");
		mysql_query(&my_connection, "set names utf8");
		/*mysql_query函数执行传入的sql語句,返回一个int值,如果为0,执行成功*/
		res = mysql_query(&my_connection, sql);
		if (res) {/*执行失败了*/
			printf("Error: mysql_query !\n");
			mysql_close(&my_connection);
		} else {/*执行成功了*/
			/*mysql_affected_rows返回执行sql后影响的行数*/
			printf("%d 行受到影响!\n", mysql_affected_rows(&my_connection));
			mysql_close(&my_connection);
		}
	} else {
		/*数据库连接失败*/
		printf("数据库执行exe_sql连接失败!\n");
	}
}

/*执行传入的sql語句,并打印出查询結果*/
void query_sql(char* sql) {
	MYSQL my_connection; /*这是一个数据库连接*/
	int res; /*执行sql語句后的返回标志*/
	MYSQL_RES *res_ptr; /*指向查询结果的指针*/
	MYSQL_FIELD *field; /*字段结构指针*/
	MYSQL_ROW result_row; /*按行返回的查询信息*/
	int row, column; /*查询返回的行数和列数*/
	int i, j; /*只是控制循环的两个变量*/
	/*初始化mysql连接my_connection*/
	mysql_init(&my_connection);
	if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD,DATABASE, 0, NULL, 0)) {/*连接成功*/
		printf("数据库查询query_sql连接成功!\n");
		mysql_query(&my_connection, "set names utf8");
		/*执行传入的sql語句,返回一个int值,如果为0,证明語句执行成功*/
		res = mysql_query(&my_connection, sql);
		if (res) { /*执行失败*/
			printf("Error: mysql_query !\n");
			mysql_close(&my_connection);
		} else { 
			/*执行成功了*/
			/*将查询的結果给res_ptr*/
			res_ptr = mysql_store_result(&my_connection);
			/*如果结果不为空,就把结果print*/
			if (res_ptr) {
				/*取得結果的行数和*/
				column = mysql_num_fields(res_ptr);
				row = mysql_num_rows(res_ptr);
				printf("查询到 %lu 行 \n", row);
				/*输出結果的字段名*/
				for (i = 0; field = mysql_fetch_field(res_ptr); i++)
				printf("%s\t", field->name);
				printf("\n");
				/*按行输出結果*/
				for (i = 1; i < row; i++) {
					result_row = mysql_fetch_row(res_ptr);
					for (j = 0; j < column; j++)
					printf("%s\t", result_row[j]);
					printf("\n");
				}
			}
			mysql_close(&my_connection);
		}
	}
}

int main(int argc, char *argv[]) {
	char *query;
	/*插入操作*/
	char *exe = "insert into bbb values('','eee');";
	/*更新操作*/
	//char *exe = "update `bbb` set `name2` = 'zzz' where `id` = 10";
	/*删除操作*/
	//char *exe = "delete from bbb where `name2` = 'eee'";
	exe_sql(exe);
	/*测试查询*/
	query="select * from bbb;";
	query_sql(query);
	return 0;
}

编译命令:
gcc-o c_mysql_demo -g c_mysql_demo.c -I /usr/include/mysql/ -L /usr/lib/ -l mysqlclient

参数说明:

-I(大写的i) 表示要连接的头文件目录,因为使用了<mysql.h> ,-L表示要连接的库文件目录 -l(小写的L) 表示要连接的具体的库名称,在/usr/lib/ 下,有叫做libmysqlclient.so的库,指定具体的库的名字时,默认去掉头尾的lib和.so直接使用中间的mysqlclient
如果不用-I -L ,可能导致找不到头文件 或者 函数未定义的错误
by
无报错,编译成功。

查看表:
select

执行程序:
exe

再次查看表bbb:
select_2

数据插入成功!

更新、删除操作类似,只需改一下sql语句即可。